@@ -28,6 +28,7 @@ import (
2828 "testing"
2929 "time"
3030
31+ "crypto/tls"
3132 "crypto/x509"
3233 "encoding/pem"
3334
@@ -151,6 +152,125 @@ func TestRuntime_TLSAuthConfigWithLoadedCA(t *testing.T) {
151152 }
152153}
153154
155+ func TestRuntime_TLSAuthConfigWithVerifyPeerCertificate (t * testing.T ) {
156+ var opts TLSClientOptions
157+ opts .InsecureSkipVerify = true
158+ var verify = func (rawCerts [][]byte , verifiedChains [][]* x509.Certificate ) error {
159+ return nil
160+ }
161+ opts .VerifyPeerCertificate = verify
162+
163+ cfg , err := TLSClientAuth (opts )
164+ if assert .NoError (t , err ) {
165+ if assert .NotNil (t , cfg ) {
166+ assert .True (t , cfg .InsecureSkipVerify )
167+ assert .NotNil (t , cfg .VerifyPeerCertificate )
168+ }
169+ }
170+ }
171+
172+ func TestRuntime_ManualCertificateValidation (t * testing.T ) {
173+ // test manual verification of server certificates
174+ // against root certificate on client side.
175+ result := []task {
176+ {false , "task 1 content" , 1 },
177+ {false , "task 2 content" , 2 },
178+ }
179+ var verifyCalled bool
180+ server := httptest .NewUnstartedServer (http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
181+ rw .Header ().Add (runtime .HeaderContentType , runtime .JSONMime )
182+ rw .WriteHeader (http .StatusOK )
183+ jsongen := json .NewEncoder (rw )
184+ _ = jsongen .Encode (result )
185+ }))
186+
187+ // root cert
188+ rootCertFile := "../fixtures/certs/myCA.crt"
189+ rootCertPem , err := ioutil .ReadFile (rootCertFile )
190+ require .NoError (t , err )
191+ rootCertRaw , _ := pem .Decode (rootCertPem )
192+ require .NotNil (t , rootCertRaw )
193+ rootCert , err := x509 .ParseCertificate (rootCertRaw .Bytes )
194+ require .NoError (t , err )
195+
196+ // create server tls config
197+ serverCACertPool := x509 .NewCertPool ()
198+ serverCACertPool .AddCert (rootCert )
199+ server .TLS = & tls.Config {
200+ RootCAs : serverCACertPool ,
201+ }
202+
203+ // load server certs
204+ serverCertFile := "../fixtures/certs/mycert1.crt"
205+ serverKeyFile := "../fixtures/certs/mycert1.key"
206+ server .TLS .Certificates = make ([]tls.Certificate , 1 )
207+ server .TLS .Certificates [0 ], err = tls .LoadX509KeyPair (
208+ serverCertFile ,
209+ serverKeyFile ,
210+ )
211+ require .NoError (t , err )
212+
213+ server .StartTLS ()
214+ defer server .Close ()
215+
216+ // test if server is a valid endpoint
217+ // by comparing received certs against root cert,
218+ // explicitly omitting DNSName check.
219+ client , err := TLSClient (TLSClientOptions {
220+ InsecureSkipVerify : true ,
221+ VerifyPeerCertificate : func (rawCerts [][]byte , verifiedChains [][]* x509.Certificate ) error {
222+ verifyCalled = true
223+
224+ caCertPool := x509 .NewCertPool ()
225+ caCertPool .AppendCertsFromPEM (rootCertPem )
226+
227+ opts := x509.VerifyOptions {
228+ Roots : caCertPool ,
229+ CurrentTime : time .Date (2017 , time .July , 1 , 1 , 1 , 1 , 1 , time .UTC ),
230+ }
231+
232+ cert , err := x509 .ParseCertificate (rawCerts [0 ])
233+ if err != nil {
234+ return err
235+ }
236+
237+ _ , err = cert .Verify (opts )
238+ return err
239+ },
240+ })
241+
242+ require .NoError (t , err )
243+ hu , _ := url .Parse (server .URL )
244+ rt := NewWithClient (hu .Host , "/" , []string {"https" }, client )
245+
246+ rwrtr := runtime .ClientRequestWriterFunc (func (req runtime.ClientRequest , _ strfmt.Registry ) error {
247+ return nil
248+ })
249+
250+ var received []task
251+ _ , err = rt .Submit (& runtime.ClientOperation {
252+ ID : "getTasks" ,
253+ Method : "GET" ,
254+ PathPattern : "/" ,
255+ Params : rwrtr ,
256+ Reader : runtime .ClientResponseReaderFunc (func (response runtime.ClientResponse , consumer runtime.Consumer ) (interface {}, error ) {
257+ if response .Code () == 200 {
258+ if err := consumer .Consume (response .Body (), & received ); err != nil {
259+ return nil , err
260+ }
261+ return result , nil
262+ }
263+ return nil , errors .New ("Generic error" )
264+ }),
265+ })
266+
267+ if assert .NoError (t , err ) {
268+ assert .True (t , verifyCalled )
269+ assert .IsType (t , []task {}, received )
270+ assert .EqualValues (t , result , received )
271+ }
272+ }
273+
154274func TestRuntime_Concurrent (t * testing.T ) {
155275 // test that it can make a simple request
156276 // and get the response for it.
0 commit comments