我正在使用 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 的实例。我尝试删除设置密钥的行,但随后身份验证失败。有可能这实际上是我应该做的,并且身份验证由于其他原因而失败,但是在我开始挖掘其他地方的问题之前,我需要更清楚地了解这里发生了什么。
从这个 SO 问题:在 ruby 中构建公钥时,是什么导致“既不是 PUB 密钥也不是 PRIV 密钥:: 嵌套 asn1 错误”? ...看起来好像私钥应该以某种方式包含在 pem 文件中,但 .NET 开发人员似乎认为这没有必要。
确定 .NET 开发人员以清楚地了解他们的身份验证如何工作是很困难的,而且我似乎也无法在网上找到明确的信息。任何人都可以对此有所了解吗?