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