1

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

4

1 回答 1

0

好的,在发布此消息后的 34 分钟内,我已经弄清楚了。

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

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

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

于 2013-02-28T11:12:46.487 回答