Skip to content

Commit e8486e1

Browse files
committed
applied #386 for fixing CI error.
1 parent c709305 commit e8486e1

File tree

3 files changed

+100
-11
lines changed

3 files changed

+100
-11
lines changed

lib/httpclient/ssl_config.rb

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ def initialize(client)
146146
return unless SSLEnabled
147147
@client = client
148148
@cert_store = X509::Store.new
149+
@cert_store.set_default_paths
150+
@cacerts_loaded = working_openssl_platform?
151+
149152
@cert_store_crl_items = []
150153
@client_cert = @client_key = @client_key_pass = @client_ca = nil
151154
@verify_mode = SSL::VERIFY_PEER | SSL::VERIFY_FAIL_IF_NO_PEER_CERT
@@ -162,7 +165,6 @@ def initialize(client)
162165
@options |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3)
163166
# OpenSSL 0.9.8 default: "ALL:!ADH:!LOW:!EXP:!MD5:+SSLv2:@STRENGTH"
164167
@ciphers = CIPHERS_DEFAULT
165-
@cacerts_loaded = false
166168
end
167169

168170
# Sets certificate and private key for SSL client authentication.
@@ -413,10 +415,21 @@ def change_notify
413415
nil
414416
end
415417

418+
def working_openssl_platform?
419+
File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE) && Dir.exist?(OpenSSL::X509::DEFAULT_CERT_DIR)
420+
end
421+
416422
# Use 2048 bit certs trust anchor
417423
def load_cacerts(cert_store)
418-
file = File.join(File.dirname(__FILE__), 'cacert.pem')
419-
add_trust_ca_to_store(cert_store, file)
424+
certs = if ENV.key?('SSL_CERT_DIR'.freeze) || ENV.key?('SSL_CERT_FILE')
425+
[ ENV['SSL_CERT_DIR'], ENV['SSL_CERT_FILE'] ].compact
426+
else
427+
[ File.join(File.dirname(__FILE__), 'cacert.pem') ]
428+
end
429+
430+
certs.each do |cert|
431+
add_trust_ca_to_store(cert_store, cert)
432+
end
420433
end
421434
end
422435

test/helper.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
66
SimpleCov.start
77
rescue LoadError
8-
end
8+
end if ENV['CI']
9+
910
require 'test/unit'
1011

1112
require 'httpclient'

test/test_ssl.rb

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,42 @@ def test_debug_dev
8181
end
8282

8383
def test_verification_without_httpclient
84-
raw_cert = "-----BEGIN CERTIFICATE-----\nMIIDOTCCAiGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBCMRMwEQYKCZImiZPyLGQB\nGRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMRAwDgYDVQQDDAdSdWJ5\nIENBMB4XDTE2MDgxMDE3MjEzNFoXDTE3MDgxMDE3MjEzNFowSzETMBEGCgmSJomT\n8ixkARkWA29yZzEZMBcGCgmSJomT8ixkARkWCXJ1YnktbGFuZzEZMBcGA1UEAwwQ\nUnVieSBjZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB\nAJCfsSXpSMpmZCVa+ZCM+QDgomnhDlvnrGDq6pasTaIspGTXgws+7r8Dt/cNe6EH\nHJpRH2cGRiO4yPcfcT9eS4X7k8OC4f33wHfACOmLu6LeoNE8ujmSk6L6WzLUI+sE\nnLZbFrXxoAo4XHsm8vEG9C+jEoXZ1p+47wrAGaDwDQTnzlMy4dT9pRQEJP2G/Rry\nUkuZn8SUWmh3/YS78iaSzsNF1cgE1ealHOrPPFDjiCGDaH/LHyUPYlbFSLZ/B7Qx\nLxi5sePLcywWq/EJrmWpgeVTDjtNijsdKv/A3qkY+fm/oD0pzt7XsfJaP9YKNyJO\nQFdxWZeiPcDF+Hwf+IwSr+kCAwEAAaMxMC8wDgYDVR0PAQH/BAQDAgeAMB0GA1Ud\nDgQWBBQNvzYzJyXemGhxbA8NMXLolDnPyjANBgkqhkiG9w0BAQsFAAOCAQEARIJV\noKejGlOTn71QutnNnu07UtTu0IHs6YqjYzzND+m4JXLN+wvYm72AFUG0b1L7dRg0\niK8XjQrlNQNVqP1Mc6tffchy20neOPOHeiO6qTdRU8P2S8D3Uwe+1qhgxjfE+cWc\nwZmWxYK4HA8c58PxWMqrkr2QqXDplG9KWLvOgrtPGiLLZcQSKhvvB63QzItHBDU6\nRayiJY3oPkK/HrIvFlySqFqzWmuyknkciOFywEHQMz/tcSFJ2QFpPj/tBz9VXohH\nZ8KscmfhZrTPBjo+ky1lz/WraWoz4LMiLnkC2ABczWLRSawu+v3Irx1NFJngt05e\npqwtqIUeg7j+JLiTaA==\n-----END CERTIFICATE-----"
85-
raw_ca_cert = "-----BEGIN CERTIFICATE-----\nMIIDYjCCAkqgAwIBAgIBATANBgkqhkiG9w0BAQsFADBCMRMwEQYKCZImiZPyLGQB\nGRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMRAwDgYDVQQDDAdSdWJ5\nIENBMB4XDTE2MDgxMDE3MjA1NFoXDTE4MDgxMDE3MjA1NFowQjETMBEGCgmSJomT\n8ixkARkWA29yZzEZMBcGCgmSJomT8ixkARkWCXJ1YnktbGFuZzEQMA4GA1UEAwwH\nUnVieSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALKGwyM3Ejtl\npo7CqaDlS71gDZn3gm6IwWpmRMLJofSI9LCwAbjijSC2HvO0xUWoYW40FbzjnnEi\ngszsWyPwuQIx9t0bhuAyllNIfImmkaQkrikXKBKzia4jPnbc4iXPnfjuThjESFWl\ntfbN6y1B5TjKhD1KelfakUO+iMu8WlIA9NKQZYfJ/F3QSpP5Iqb3KN/jVifFbDV8\nbAl3Ln4rT2kTCKrZZcl1jmWsJv8jBw6+P7hk0/Mu0JeHAITsjbNbpHd8UXpCfbVs\nsNGZrBU4uJdZ2YTG+Y27/t25jFNQwb+TWbvig7rfdX2sjssuxa00BBxarC08tIVj\nZprM37KcNn8CAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAQYwHQYDVR0OBBYEFA2/NjMnJd6YaHFsDw0xcuiUOc/KMB8GA1UdIwQYMBYEFA2/\nNjMnJd6YaHFsDw0xcuiUOc/KMA0GCSqGSIb3DQEBCwUAA4IBAQAJSOw49XqvUll0\n3vU9EAO6yUdeZSsQENIfYbRMQgapbnN1vTyrUjPZkGC5hIE1pVdoHtEoUEICxIwy\nr6BKxiSLBDLp+rvIuDdzMkXIWdUVvTZguVRyKtM2gfnpsPLpVnv+stBmAW2SMyxm\nkymhOpkjdv3He+45uorB3tdfBS9VVomDEUJdg38UE1b5eXRQ3D6gG0iCPFzKszXg\nLoAYhGxtjCJaKlbzduMK0YO6aelgW1+XnVIKcA7DJ9egk5d/dFZBPFfwumwr9hTH\nh7/fp3Fr87weI+CkfmFyJZrsEBlXJBVuvPesMVHTh3Whm5kmCdWcBJU0QmSq42ZL\n72U0PXLR\n-----END CERTIFICATE-----"
86-
ca_cert = ::OpenSSL::X509::Certificate.new(raw_ca_cert)
87-
cert = ::OpenSSL::X509::Certificate.new(raw_cert)
84+
ca_cert = ::OpenSSL::X509::Certificate.new(%w[-----BEGIN\ CERTIFICATE-----
85+
MIIC3jCCAcYCCQCUWi3t8e122TANBgkqhkiG9w0BAQsFADAxMQ0wCwYDVQQKDARS
86+
dWJ5MRMwEQYDVQQLDApodHRwY2xpZW50MQswCQYDVQQDDAJDQTAeFw0xODAyMjcx
87+
MTM0NDRaFw0yODAyMjUxMTM0NDRaMDExDTALBgNVBAoMBFJ1YnkxEzARBgNVBAsM
88+
Cmh0dHBjbGllbnQxCzAJBgNVBAMMAkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
89+
MIIBCgKCAQEAs6FPPj8PVl1uxsMZas4VC/ibRvtyXQkfrEa7TO032Kh+ETsOQNS8
90+
QJedhw/BMHuoVbU0/b6PZ//LJTUDN/C77/QWHKzcMoxkNye5PC2cJlSQMosaKjYG
91+
1ERYmJ+FBiMMSpcLOCS5cYoP2fJHGtHqZPkxIPYy+IKQ7WuP3tUXkVC+ftpD6H4V
92+
6MUnfLwagpaAAbRoFUJQoZISmH2+F5GOKX9KKiMBI94yqRRN4K/B9iqXgld45Hmg
93+
67vX0ckRbqBhrz1CwPtaETLFB4hZT2ouBkMQYtrvpNXv80p7vcz+BwORo8b2Ns9B
94+
4FqtpjMaS9Mf95z4Mn+NG7lanYtsHO2svwIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
95+
AQBu614zHB5SS+ORYrRwl7tICKUipWHdCJfYsJOQy/FKwe7vedwd/Uclfe06GU+m
96+
bNv0y22/oF7vrM3EfnxFe2DNIKXTndszrQSLpT6OPBe4mAOSJxnIMy6B6/PyhK6I
97+
D7TWFSVlYX9a4OfolsoE0gQtxhyLud4rvJgXyAq9kRZ1FcNfI75cImk67rCa8jRY
98+
TJOTidKq1Kcn6RY7d8cf581HP7y/eK887K6lBvGiQE1aFDSLe2ZLY+rxS9GSMYfK
99+
81XhUX2QKytGYch2y95ThMwOljVTg6fKDrtKGwj9mSsnlfTFX3gikvLLtB/o7JPR
100+
2pWBic8PX7gnANQqH/4ahv1M
101+
-----END\ CERTIFICATE-----].join("\n"))
102+
cert = ::OpenSSL::X509::Certificate.new(%w[-----BEGIN\ CERTIFICATE-----
103+
MIIC5zCCAc8CCQCz/lMJNLxQDjANBgkqhkiG9w0BAQsFADAxMQ0wCwYDVQQKDARS
104+
dWJ5MRMwEQYDVQQLDApodHRwY2xpZW50MQswCQYDVQQDDAJDQTAeFw0xODAyMjcx
105+
MTM1MTNaFw0yNzExMjcxMTM1MTNaMDoxDTALBgNVBAoMBFJ1YnkxEzARBgNVBAsM
106+
Cmh0dHBjbGllbnQxFDASBgNVBAMMC0NlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0B
107+
AQEFAAOCAQ8AMIIBCgKCAQEAo/zP4oPyqerNyJYNTKzAGGQR8uKmP9wLnLm/yTf/
108+
jwzVLj3rvunw54aw89V3R4LLwBBMgFlE9OrUa+2zCvZJ8ykSoltU+w9E2EdXnXAR
109+
C/GW678MA06NPBuMNQyf+7Lv7dipdv+0hUNXFarwGiJkCms0zcmTonkOC8Bh7stZ
110+
EykkvQs5zmYVd+G26D5un8Wzjl6OckbBDcKTS9u9H1YveRcnN7odsh+qI4PjDmKG
111+
PXR8Gz/loNYN/I55Hqe7vkQJZ7r1PjSBp/fIcb4pNEkKS9DAcNWkoHF2j5nBNdOq
112+
mH3WR36vKlw5S4HLzDXQDeueFbtk3QGrWY2MWrpJNapeAQIDAQABMA0GCSqGSIb3
113+
DQEBCwUAA4IBAQB2CiGKAvHjr4kjOavWqGfPv115N4fhmBcPH4YAeJB9mHTzpoPV
114+
BCm0ouRG5Oqj/DJhm+mckFKSorZFSgVb/G92w0uXRvBMPJb4wyIbp5ld6K3138cn
115+
DtmeON3gbHwh3or741LdD6GIaulA9CL/qI3bbiyrJrHAZuHbpA6UqHfTKTBVi0uq
116+
kv8qmA8FrzI2itDqdp0dq3QMNGnG40OM8NSDX+8A9wMahPh+Oe3TePSvDTahXIU1
117+
o+dzaUEIVhUWEikQBnfeEnxzN8B/qtt3wEpliAip9Z3LuN0pVFb81Mx1wEZls2Bd
118+
Kj83iBw7flO651USNPnkOkU3DegNtcpTaT5M
119+
-----END\ CERTIFICATE-----].join("\n"))
88120
store = ::OpenSSL::X509::Store.new
89121
store.add_cert(ca_cert)
90122
assert(store.verify(cert))
@@ -245,10 +277,39 @@ def test_set_default_paths
245277
end
246278
end
247279

280+
def test_load_cacerts
281+
omit_if(RUBY_ENGINE == 'jruby', 'SSL_CERT_FILE environment does not work on JRuby')
282+
283+
# disables loading default openssl paths
284+
stub_x509_const(:DEFAULT_CERT_FILE, '/invalid') do
285+
assert_raise(OpenSSL::SSL::SSLError) do
286+
@client.get(@url)
287+
end
288+
289+
setup_client
290+
291+
escape_env do
292+
ENV['SSL_CERT_FILE'] = File.join(DIR, 'ca-chain.pem')
293+
@client.get(@url)
294+
end
295+
end
296+
end
297+
298+
def test_default_paths
299+
assert_raise(OpenSSL::SSL::SSLError) do
300+
@client.get(@url)
301+
end
302+
escape_env do
303+
ENV['SSL_CERT_FILE'] = File.join(DIR, 'ca-chain.pem')
304+
setup_client
305+
@client.get(@url)
306+
end
307+
end
308+
248309
def test_no_sslv3
249310
teardown_server
250311
setup_server_with_ssl_version(:SSLv3)
251-
assert_raise(OpenSSL::SSL::SSLError) do
312+
assert_raise() do
252313
@client.ssl_config.verify_mode = nil
253314
@client.get("https://localhost:#{serverport}/hello")
254315
end
@@ -264,7 +325,7 @@ def test_allow_tlsv1
264325
end
265326

266327
def test_use_higher_TLS
267-
omit('TODO: it does not pass with Java 7 or old openssl ')
328+
# TODO: it does not pass with Java 7 or old openssl
268329
teardown_server
269330
setup_server_with_ssl_version('TLSv1_2')
270331
assert_nothing_raised do
@@ -429,6 +490,20 @@ def test_timeout
429490

430491
private
431492

493+
def stub_x509_const(name, value)
494+
OpenSSL::X509.module_eval do
495+
begin
496+
original = remove_const(name)
497+
const_set(name, value)
498+
499+
yield
500+
ensure
501+
remove_const(name)
502+
const_set(name, original)
503+
end
504+
end
505+
end
506+
432507
def cert(filename)
433508
OpenSSL::X509::Certificate.new(File.read(File.join(DIR, filename)))
434509
end
@@ -474,7 +549,7 @@ def setup_server_with_ssl_version(ssl_version)
474549
ssl_version = ssl_version.tr('_', '.')
475550
end
476551
logger = Logger.new(STDERR)
477-
logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level)
552+
logger.level = Logger::Severity::FATAL # avoid logging SSLError (ERROR level)
478553
@server = WEBrick::HTTPServer.new(
479554
:BindAddress => "localhost",
480555
:Logger => logger,

0 commit comments

Comments
 (0)