Net :: HTTP的客户端证书问题(既不是PUB密钥也不是PRIV密钥::嵌套asn1错误)

时间:2013-02-28 10:35:21

标签: ruby https openssl client-certificates net-http

我正在使用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开发人员以明确他们的身份验证工作的准确性是很困难的,我似乎无法在线找到明确的信息。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

在发布此消息后的34分钟内,我已经明白了。

我使用的pem文件也应包含私钥。我从.NET人那里获得了一个受密码保护的.pfx文件,并生成了我自己的pem,如下所示:

openssl pkcs12 -in cert.pfx -out cert.pem -nodes

此文件包含证书和私钥,现在一切正常。