Skip to content

Commit 4f63523

Browse files
Equanoxcasualjim
authored andcommitted
Add a test to verify certificates manually
Signed-off-by: equanox <matthias@benchkram.de>
1 parent dc767fe commit 4f63523

1 file changed

Lines changed: 120 additions & 0 deletions

File tree

client/runtime_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
154274
func TestRuntime_Concurrent(t *testing.T) {
155275
// test that it can make a simple request
156276
// and get the response for it.

0 commit comments

Comments
 (0)