Skip to content

Commit 9daecee

Browse files
committed
ssl: remove cert_store from start_server test helper
OpenSSL::SSL::SSLContext#cert_store= uses SSL_CTX_set_cert_store(). The store is used for verifying peer certificates and for building certificate chains to be sent to the peer if there is no chain explicitly provided by SSLContext#extra_chain_cert=. Do not specify it in the common test helper start_server, as most callers do not require either function. Instead, update individual test cases that use client certificates to explicitly specify it in ctx_proc. A more direct test case is added to verify the latter function.
1 parent 3a192bb commit 9daecee

File tree

2 files changed

+43
-13
lines changed

2 files changed

+43
-13
lines changed

test/openssl/test_ssl.rb

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,34 @@ def test_add_certificate_multiple_certs
230230
end
231231
end
232232

233+
def test_extra_chain_cert_auto_chain
234+
start_server { |port|
235+
server_connect(port) { |ssl|
236+
ssl.puts "abc"; assert_equal "abc\n", ssl.gets
237+
assert_equal @svr_cert.to_der, ssl.peer_cert.to_der
238+
assert_equal [@svr_cert], ssl.peer_cert_chain
239+
}
240+
}
241+
242+
# AWS-LC enables SSL_MODE_NO_AUTO_CHAIN by default
243+
unless aws_lc?
244+
ctx_proc = -> ctx {
245+
# Sanity check: start_server won't set extra_chain_cert
246+
assert_nil ctx.extra_chain_cert
247+
ctx.cert_store = OpenSSL::X509::Store.new.tap { |store|
248+
store.add_cert(@ca_cert)
249+
}
250+
}
251+
start_server(ctx_proc: ctx_proc) { |port|
252+
server_connect(port) { |ssl|
253+
ssl.puts "abc"; assert_equal "abc\n", ssl.gets
254+
assert_equal @svr_cert.to_der, ssl.peer_cert.to_der
255+
assert_equal [@svr_cert, @ca_cert], ssl.peer_cert_chain
256+
}
257+
}
258+
end
259+
end
260+
233261
def test_sysread_and_syswrite
234262
start_server { |port|
235263
server_connect(port) { |ssl|
@@ -396,11 +424,15 @@ def test_verify_mode_client_cert_required
396424

397425
def test_client_auth_success
398426
vflag = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
399-
start_server(verify_mode: vflag,
400-
ctx_proc: proc { |ctx|
401-
# LibreSSL doesn't support client_cert_cb in TLS 1.3
402-
ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION if libressl?
403-
}) { |port|
427+
ctx_proc = proc { |ctx|
428+
store = OpenSSL::X509::Store.new
429+
store.add_cert(@ca_cert)
430+
store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
431+
ctx.cert_store = store
432+
# LibreSSL doesn't support client_cert_cb in TLS 1.3
433+
ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION if libressl?
434+
}
435+
start_server(verify_mode: vflag, ctx_proc: ctx_proc) { |port|
404436
ctx = OpenSSL::SSL::SSLContext.new
405437
ctx.key = @cli_key
406438
ctx.cert = @cli_cert
@@ -445,6 +477,10 @@ def test_client_ca
445477
pend "LibreSSL doesn't support certificate_authorities" if libressl?
446478

447479
ctx_proc = Proc.new do |ctx|
480+
store = OpenSSL::X509::Store.new
481+
store.add_cert(@ca_cert)
482+
store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
483+
ctx.cert_store = store
448484
ctx.client_ca = [@ca_cert]
449485
end
450486

@@ -510,7 +546,7 @@ def test_verify_result
510546
ssl.sync_close = true
511547
begin
512548
assert_raise(OpenSSL::SSL::SSLError){ ssl.connect }
513-
assert_equal(OpenSSL::X509::V_ERR_SELF_SIGNED_CERT_IN_CHAIN, ssl.verify_result)
549+
assert_equal(OpenSSL::X509::V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY, ssl.verify_result)
514550
ensure
515551
ssl.close
516552
end
@@ -1162,9 +1198,7 @@ def test_connect_certificate_verify_failed_exception_message
11621198
start_server(ignore_listener_error: true) { |port|
11631199
ctx = OpenSSL::SSL::SSLContext.new
11641200
ctx.set_params
1165-
# OpenSSL <= 1.1.0: "self signed certificate in certificate chain"
1166-
# OpenSSL >= 3.0.0: "self-signed certificate in certificate chain"
1167-
assert_raise_with_message(OpenSSL::SSL::SSLError, /self.signed/) {
1201+
assert_raise_with_message(OpenSSL::SSL::SSLError, /unable to get local issuer certificate/) {
11681202
server_connect(port, ctx)
11691203
}
11701204
}

test/openssl/utils.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,7 @@ def start_server(verify_mode: OpenSSL::SSL::VERIFY_NONE,
201201
accept_proc: proc{},
202202
ignore_listener_error: false, &block)
203203
IO.pipe {|stop_pipe_r, stop_pipe_w|
204-
store = OpenSSL::X509::Store.new
205-
store.add_cert(@ca_cert)
206-
store.purpose = OpenSSL::X509::PURPOSE_SSL_CLIENT
207204
ctx = OpenSSL::SSL::SSLContext.new
208-
ctx.cert_store = store
209205
ctx.cert = @svr_cert
210206
ctx.key = @svr_key
211207
ctx.verify_mode = verify_mode

0 commit comments

Comments
 (0)