我试图让我们的ActiveResource从一个内部API中提取,我们在PEM格式中有一个带有3个证书的自发证书链。 ActiveResource只是将ssl_options
传递给Net :: HTTP,因此不应该成为一个因素。
我尝试了很多选项让它发挥作用,包括:
store = OpenSSL::X509::Store.new
store.add_file('foo.com.chained.crt')
self.ssl_options = {
cert_store: store,
verify_depth: 3,
verify_mode: OpenSSL::SSL::VERIFY_PEER,
}
我也尝试过使用source
中所述的这种方法 class Person < ActiveResource::Base
self.site = "https://secure.api.people.com/"
File.open(pem_file_path, 'rb') do |pem_file|
self.ssl_options = {
cert: OpenSSL::X509::Certificate.new(pem_file),
# key: OpenSSL::PKey::RSA.new(pem_file),
verify_depth: 3,
verify_mode: OpenSSL::SSL::VERIFY_PEER }
end
end
以及key
这些和其他输入的许多排列,并将.crt
文件设置为ca_file
。没有工作,所有人都给我以下错误:
ActiveResource::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
除非我使用key
参数,否则会给我:
OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key: nested asn1 error
我真的被困在这里,这个API严重让我质疑我对SSL的理解。我会假设对服务器进行身份验证,您需要的只是链式证书。我很困惑公钥是如何适应的,我真的不明白为什么明确地创建一个本地可信商店并引用那些不起作用的商店。
我使用verify_depth: 3
,因为链式证书有三个签名,但我已经尝试过没有该选项但它仍然无法正常工作。唯一可行的方法是使用VERIFY_NONE
,这显然是错误的。
我的问题是我应该如何在Ruby中正确配置OpenSSL,以便在一个.crt
文件中使用自行发布的链式证书?为什么我上面列出的方法无效?