Source file
src/crypto/tls/example_test.go
1
2
3
4
5 package tls_test
6
7 import (
8 "crypto/tls"
9 "crypto/x509"
10 "log"
11 "net/http"
12 "net/http/httptest"
13 "os"
14 "time"
15 )
16
17 func ExampleDial() {
18
19
20 const rootPEM = `
21 -- GlobalSign Root R2, valid until Dec 15, 2021
22 -----BEGIN CERTIFICATE-----
23 MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
24 A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
25 Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
26 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
27 A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
28 hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
29 v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
30 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
31 tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
32 C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
33 zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
34 mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
35 V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
36 bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
37 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
38 J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
39 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
40 ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
41 AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
42 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
43 -----END CERTIFICATE-----`
44
45
46
47
48 roots := x509.NewCertPool()
49 ok := roots.AppendCertsFromPEM([]byte(rootPEM))
50 if !ok {
51 panic("failed to parse root certificate")
52 }
53
54 conn, err := tls.Dial("tcp", "mail.google.com:443", &tls.Config{
55 RootCAs: roots,
56 })
57 if err != nil {
58 panic("failed to connect: " + err.Error())
59 }
60 conn.Close()
61 }
62
63 func ExampleConfig_keyLogWriter() {
64
65
66
67
68 server := httptest.NewUnstartedServer(http.HandlerFunc(
69 func(w http.ResponseWriter, r *http.Request) {}))
70 server.StartTLS()
71 defer server.Close()
72
73 pool := x509.NewCertPool()
74 pool.AddCert(server.Certificate())
75
76
77
78 w := os.Stdout
79
80 client := &http.Client{
81 Transport: &http.Transport{
82 TLSClientConfig: &tls.Config{
83 KeyLogWriter: w,
84 RootCAs: pool,
85 },
86 },
87 }
88 resp, err := client.Get(server.URL)
89 if err != nil {
90 log.Fatalf("Failed to get URL: %v", err)
91 }
92 resp.Body.Close()
93
94
95
96
97 }
98
99 func ExampleLoadX509KeyPair() {
100 cert, err := tls.LoadX509KeyPair("testdata/example-cert.pem", "testdata/example-key.pem")
101 if err != nil {
102 log.Fatal(err)
103 }
104 cfg := &tls.Config{Certificates: []tls.Certificate{cert}}
105 listener, err := tls.Listen("tcp", ":2000", cfg)
106 if err != nil {
107 log.Fatal(err)
108 }
109 _ = listener
110 }
111
112 func ExampleX509KeyPair() {
113 certPem := []byte(`-----BEGIN CERTIFICATE-----
114 MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw
115 DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow
116 EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d
117 7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B
118 5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr
119 BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1
120 NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l
121 Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc
122 6MF9+Yw1Yy0t
123 -----END CERTIFICATE-----`)
124 keyPem := []byte(`-----BEGIN EC PRIVATE KEY-----
125 MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49
126 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q
127 EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA==
128 -----END EC PRIVATE KEY-----`)
129 cert, err := tls.X509KeyPair(certPem, keyPem)
130 if err != nil {
131 log.Fatal(err)
132 }
133 cfg := &tls.Config{Certificates: []tls.Certificate{cert}}
134 listener, err := tls.Listen("tcp", ":2000", cfg)
135 if err != nil {
136 log.Fatal(err)
137 }
138 _ = listener
139 }
140
141 func ExampleX509KeyPair_httpServer() {
142 certPem := []byte(`-----BEGIN CERTIFICATE-----
143 MIIBhTCCASugAwIBAgIQIRi6zePL6mKjOipn+dNuaTAKBggqhkjOPQQDAjASMRAw
144 DgYDVQQKEwdBY21lIENvMB4XDTE3MTAyMDE5NDMwNloXDTE4MTAyMDE5NDMwNlow
145 EjEQMA4GA1UEChMHQWNtZSBDbzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABD0d
146 7VNhbWvZLWPuj/RtHFjvtJBEwOkhbN/BnnE8rnZR8+sbwnc/KhCk3FhnpHZnQz7B
147 5aETbbIgmuvewdjvSBSjYzBhMA4GA1UdDwEB/wQEAwICpDATBgNVHSUEDDAKBggr
148 BgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MCkGA1UdEQQiMCCCDmxvY2FsaG9zdDo1
149 NDUzgg4xMjcuMC4wLjE6NTQ1MzAKBggqhkjOPQQDAgNIADBFAiEA2zpJEPQyz6/l
150 Wf86aX6PepsntZv2GYlA5UpabfT2EZICICpJ5h/iI+i341gBmLiAFQOyTDT+/wQc
151 6MF9+Yw1Yy0t
152 -----END CERTIFICATE-----`)
153 keyPem := []byte(`-----BEGIN EC PRIVATE KEY-----
154 MHcCAQEEIIrYSSNQFaA2Hwf1duRSxKtLYX5CB04fSeQ6tF1aY/PuoAoGCCqGSM49
155 AwEHoUQDQgAEPR3tU2Fta9ktY+6P9G0cWO+0kETA6SFs38GecTyudlHz6xvCdz8q
156 EKTcWGekdmdDPsHloRNtsiCa697B2O9IFA==
157 -----END EC PRIVATE KEY-----`)
158 cert, err := tls.X509KeyPair(certPem, keyPem)
159 if err != nil {
160 log.Fatal(err)
161 }
162 cfg := &tls.Config{Certificates: []tls.Certificate{cert}}
163 srv := &http.Server{
164 TLSConfig: cfg,
165 ReadTimeout: time.Minute,
166 WriteTimeout: time.Minute,
167 }
168 log.Fatal(srv.ListenAndServeTLS("", ""))
169 }
170
171 func ExampleConfig_verifyConnection() {
172
173
174
175
176
177
178 _ = &tls.Config{
179
180
181 InsecureSkipVerify: true,
182 VerifyConnection: func(cs tls.ConnectionState) error {
183 opts := x509.VerifyOptions{
184 DNSName: cs.ServerName,
185 Intermediates: x509.NewCertPool(),
186 }
187 for _, cert := range cs.PeerCertificates[1:] {
188 opts.Intermediates.AddCert(cert)
189 }
190 _, err := cs.PeerCertificates[0].Verify(opts)
191 return err
192 },
193 }
194
195
196 _ = &tls.Config{
197
198
199
200 ClientAuth: tls.RequireAnyClientCert,
201 VerifyConnection: func(cs tls.ConnectionState) error {
202 opts := x509.VerifyOptions{
203 DNSName: cs.ServerName,
204 Intermediates: x509.NewCertPool(),
205 KeyUsages: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
206 }
207 for _, cert := range cs.PeerCertificates[1:] {
208 opts.Intermediates.AddCert(cert)
209 }
210 _, err := cs.PeerCertificates[0].Verify(opts)
211 return err
212 },
213 }
214
215
216
217 }
218
View as plain text