我正在使用Cucumber测试系统,其中一部分涉及使用SSL客户端证书在远程.NET服务器上进行身份验证。这个.NET系统的开发人员以.pem文件的形式向我提供了这个证书,如下所示:
-----BEGIN CERTIFICATE-----
MIIFzTCCBLWgAwIBAgIKHNfvKAAAAAAAFDANBgkqhkiG9w0BAQUFADBKMRMwEQYK
...more lines...
aaG0c6enKQJiVcA4myLkBkN/wxiZsnBy/zGdj+u4RurxcS717FKm7oYY3JsuRSRH
Ow==
-----END CERTIFICATE-----
我用来连接的代码看起来像这样(取自http://www.rubyinside.com/nethttp-cheat-sheet-2940.html):
uri = URI.parse("https://secure.com/")
pem = File.read("/path/to/my.pem")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.cert = OpenSSL::X509::Certificate.new(pem)
http.key = OpenSSL::PKey::RSA.new(pem)
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Get.new(uri.request_uri)
然而,'http.key = OpenSSL :: PKey :: RSA.new(pem)'这一行引发了以下异常:
Neither PUB key nor PRIV key:: nested asn1 error (OpenSSL::PKey::RSAError)
我最初使用HTTParty来发出请求,但遇到了同样的问题,我在HTTParty本身内跟踪的基本相同。
看来我已经获得的这个证书可以很好地传递到OpenSSL :: X509 :: Certificate.new来创建证书对象,但是它不能用于创建OpenSSL :: PKey的实例: :RSA。我已经尝试删除设置密钥的行,但验证失败。事实上,这可能是我应该做的,而且由于某些其他原因,身份验证失败了,但在我开始在其他地方挖掘问题之前,我需要更清楚地了解这里发生了什么。
从这个问题:What causes "Neither PUB key nor PRIV key:: nested asn1 error" when building a public key in ruby? ...好像私钥应该以某种方式包含在pem文件中,但.NET开发人员似乎认为这不是必需的。
确定.NET开发人员以明确他们的身份验证工作的准确性是很困难的,我似乎无法在线找到明确的信息。任何人都可以对此有所了解吗?
答案 0 :(得分:0)
在发布此消息后的34分钟内,我已经明白了。
我使用的pem文件也应包含私钥。我从.NET人那里获得了一个受密码保护的.pfx文件,并生成了我自己的pem,如下所示:
openssl pkcs12 -in cert.pfx -out cert.pem -nodes
此文件包含证书和私钥,现在一切正常。