<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Go_certificate_example_1</id>
	<title>Go certificate example 1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://tech.uvoo.io/index.php?action=history&amp;feed=atom&amp;title=Go_certificate_example_1"/>
	<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Go_certificate_example_1&amp;action=history"/>
	<updated>2026-04-20T14:55:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>https://tech.uvoo.io/index.php?title=Go_certificate_example_1&amp;diff=4807&amp;oldid=prev</id>
		<title>Busk: Created page with &quot;https://gist.github.com/shaneutt/5e1995295cff6721c89a71d13a71c251 ``` package main  import ( 	&quot;bytes&quot; 	&quot;crypto/rand&quot; 	&quot;crypto/rsa&quot; 	&quot;crypto/tls&quot; 	&quot;crypto/x509&quot; 	&quot;crypto/x509/p...&quot;</title>
		<link rel="alternate" type="text/html" href="https://tech.uvoo.io/index.php?title=Go_certificate_example_1&amp;diff=4807&amp;oldid=prev"/>
		<updated>2023-12-19T22:46:24Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;https://gist.github.com/shaneutt/5e1995295cff6721c89a71d13a71c251 ``` package main  import ( 	&amp;quot;bytes&amp;quot; 	&amp;quot;crypto/rand&amp;quot; 	&amp;quot;crypto/rsa&amp;quot; 	&amp;quot;crypto/tls&amp;quot; 	&amp;quot;crypto/x509&amp;quot; 	&amp;quot;crypto/x509/p...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;https://gist.github.com/shaneutt/5e1995295cff6721c89a71d13a71c251&lt;br /&gt;
```&lt;br /&gt;
package main&lt;br /&gt;
&lt;br /&gt;
import (&lt;br /&gt;
	&amp;quot;bytes&amp;quot;&lt;br /&gt;
	&amp;quot;crypto/rand&amp;quot;&lt;br /&gt;
	&amp;quot;crypto/rsa&amp;quot;&lt;br /&gt;
	&amp;quot;crypto/tls&amp;quot;&lt;br /&gt;
	&amp;quot;crypto/x509&amp;quot;&lt;br /&gt;
	&amp;quot;crypto/x509/pkix&amp;quot;&lt;br /&gt;
	&amp;quot;encoding/pem&amp;quot;&lt;br /&gt;
	&amp;quot;fmt&amp;quot;&lt;br /&gt;
	&amp;quot;io/ioutil&amp;quot;&lt;br /&gt;
	&amp;quot;math/big&amp;quot;&lt;br /&gt;
	&amp;quot;net&amp;quot;&lt;br /&gt;
	&amp;quot;net/http&amp;quot;&lt;br /&gt;
	&amp;quot;net/http/httptest&amp;quot;&lt;br /&gt;
	&amp;quot;strings&amp;quot;&lt;br /&gt;
	&amp;quot;time&amp;quot;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
func main() {&lt;br /&gt;
	// get our ca and server certificate&lt;br /&gt;
	serverTLSConf, clientTLSConf, err := certsetup()&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		panic(err)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// set up the httptest.Server using our certificate signed by our CA&lt;br /&gt;
	server := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {&lt;br /&gt;
		fmt.Fprintln(w, &amp;quot;success!&amp;quot;)&lt;br /&gt;
	}))&lt;br /&gt;
	server.TLS = serverTLSConf&lt;br /&gt;
	server.StartTLS()&lt;br /&gt;
	defer server.Close()&lt;br /&gt;
&lt;br /&gt;
	// communicate with the server using an http.Client configured to trust our CA&lt;br /&gt;
	transport := &amp;amp;http.Transport{&lt;br /&gt;
		TLSClientConfig: clientTLSConf,&lt;br /&gt;
	}&lt;br /&gt;
	http := http.Client{&lt;br /&gt;
		Transport: transport,&lt;br /&gt;
	}&lt;br /&gt;
	resp, err := http.Get(server.URL)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		panic(err)&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// verify the response&lt;br /&gt;
	respBodyBytes, err := ioutil.ReadAll(resp.Body)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		panic(err)&lt;br /&gt;
	}&lt;br /&gt;
	body := strings.TrimSpace(string(respBodyBytes[:]))&lt;br /&gt;
	if body == &amp;quot;success!&amp;quot; {&lt;br /&gt;
		fmt.Println(body)&lt;br /&gt;
	} else {&lt;br /&gt;
		panic(&amp;quot;not successful!&amp;quot;)&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
func certsetup() (serverTLSConf *tls.Config, clientTLSConf *tls.Config, err error) {&lt;br /&gt;
	// set up our CA certificate&lt;br /&gt;
	ca := &amp;amp;x509.Certificate{&lt;br /&gt;
		SerialNumber: big.NewInt(2019),&lt;br /&gt;
		Subject: pkix.Name{&lt;br /&gt;
			Organization:  []string{&amp;quot;Company, INC.&amp;quot;},&lt;br /&gt;
			Country:       []string{&amp;quot;US&amp;quot;},&lt;br /&gt;
			Province:      []string{&amp;quot;&amp;quot;},&lt;br /&gt;
			Locality:      []string{&amp;quot;San Francisco&amp;quot;},&lt;br /&gt;
			StreetAddress: []string{&amp;quot;Golden Gate Bridge&amp;quot;},&lt;br /&gt;
			PostalCode:    []string{&amp;quot;94016&amp;quot;},&lt;br /&gt;
		},&lt;br /&gt;
		NotBefore:             time.Now(),&lt;br /&gt;
		NotAfter:              time.Now().AddDate(10, 0, 0),&lt;br /&gt;
		IsCA:                  true,&lt;br /&gt;
		ExtKeyUsage:           []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},&lt;br /&gt;
		KeyUsage:              x509.KeyUsageDigitalSignature | x509.KeyUsageCertSign,&lt;br /&gt;
		BasicConstraintsValid: true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// create our private and public key&lt;br /&gt;
	caPrivKey, err := rsa.GenerateKey(rand.Reader, 4096)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		return nil, nil, err&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// create the CA&lt;br /&gt;
	caBytes, err := x509.CreateCertificate(rand.Reader, ca, ca, &amp;amp;caPrivKey.PublicKey, caPrivKey)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		return nil, nil, err&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// pem encode&lt;br /&gt;
	caPEM := new(bytes.Buffer)&lt;br /&gt;
	pem.Encode(caPEM, &amp;amp;pem.Block{&lt;br /&gt;
		Type:  &amp;quot;CERTIFICATE&amp;quot;,&lt;br /&gt;
		Bytes: caBytes,&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	caPrivKeyPEM := new(bytes.Buffer)&lt;br /&gt;
	pem.Encode(caPrivKeyPEM, &amp;amp;pem.Block{&lt;br /&gt;
		Type:  &amp;quot;RSA PRIVATE KEY&amp;quot;,&lt;br /&gt;
		Bytes: x509.MarshalPKCS1PrivateKey(caPrivKey),&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	// set up our server certificate&lt;br /&gt;
	cert := &amp;amp;x509.Certificate{&lt;br /&gt;
		SerialNumber: big.NewInt(2019),&lt;br /&gt;
		Subject: pkix.Name{&lt;br /&gt;
			Organization:  []string{&amp;quot;Company, INC.&amp;quot;},&lt;br /&gt;
			Country:       []string{&amp;quot;US&amp;quot;},&lt;br /&gt;
			Province:      []string{&amp;quot;&amp;quot;},&lt;br /&gt;
			Locality:      []string{&amp;quot;San Francisco&amp;quot;},&lt;br /&gt;
			StreetAddress: []string{&amp;quot;Golden Gate Bridge&amp;quot;},&lt;br /&gt;
			PostalCode:    []string{&amp;quot;94016&amp;quot;},&lt;br /&gt;
		},&lt;br /&gt;
		IPAddresses:  []net.IP{net.IPv4(127, 0, 0, 1), net.IPv6loopback},&lt;br /&gt;
		NotBefore:    time.Now(),&lt;br /&gt;
		NotAfter:     time.Now().AddDate(10, 0, 0),&lt;br /&gt;
		SubjectKeyId: []byte{1, 2, 3, 4, 6},&lt;br /&gt;
		ExtKeyUsage:  []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth},&lt;br /&gt;
		KeyUsage:     x509.KeyUsageDigitalSignature,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	certPrivKey, err := rsa.GenerateKey(rand.Reader, 4096)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		return nil, nil, err&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	certBytes, err := x509.CreateCertificate(rand.Reader, cert, ca, &amp;amp;certPrivKey.PublicKey, caPrivKey)&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		return nil, nil, err&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	certPEM := new(bytes.Buffer)&lt;br /&gt;
	pem.Encode(certPEM, &amp;amp;pem.Block{&lt;br /&gt;
		Type:  &amp;quot;CERTIFICATE&amp;quot;,&lt;br /&gt;
		Bytes: certBytes,&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	certPrivKeyPEM := new(bytes.Buffer)&lt;br /&gt;
	pem.Encode(certPrivKeyPEM, &amp;amp;pem.Block{&lt;br /&gt;
		Type:  &amp;quot;RSA PRIVATE KEY&amp;quot;,&lt;br /&gt;
		Bytes: x509.MarshalPKCS1PrivateKey(certPrivKey),&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	serverCert, err := tls.X509KeyPair(certPEM.Bytes(), certPrivKeyPEM.Bytes())&lt;br /&gt;
	if err != nil {&lt;br /&gt;
		return nil, nil, err&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	serverTLSConf = &amp;amp;tls.Config{&lt;br /&gt;
		Certificates: []tls.Certificate{serverCert},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	certpool := x509.NewCertPool()&lt;br /&gt;
	certpool.AppendCertsFromPEM(caPEM.Bytes())&lt;br /&gt;
	clientTLSConf = &amp;amp;tls.Config{&lt;br /&gt;
		RootCAs: certpool,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return&lt;br /&gt;
}&lt;br /&gt;
```&lt;/div&gt;</summary>
		<author><name>Busk</name></author>
	</entry>
</feed>