我在尝试使用在ruby上有密码的证书时遇到了很多麻烦。我正在使用rest-client,但这不是必需的。
这是我需要进行的cURL等效呼叫:
curl -E certificate.pem:PASSWORD -d ident=language -d data="test" "https://theurl"
我尝试了很多东西,但我无法让密码部分正常工作。这是我到目前为止所做的:
cert = OpenSSL::X509::Certificate.new(File.read("#{RAILS_ROOT}/certificate.pem"))
reply = RestClient.post("https://theurl", {:ident => 'language', :data => 'test'}, {:ssl_client_cert => cert})
我已经尝试过将密码放在任何地方,如:密码和:ssl_client_key,我查看了我能找到的所有文档但是没有任何地方可以接受此密码。
这是我经常遇到的错误:
SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure
我错过了什么?
答案 0 :(得分:6)
使用带有选项-E的curl的方式是指定带有证书的私钥。
(来自cURL手册页)
-E / - cert
(SSL)告诉curl使用指定的 获取客户端证书文件 使用HTTPS,FTPS或其他文件 基于SSL的协议。证书 必须采用PEM格式。如果是可选的 密码未指定,它将是 在终端上查询。注意 此选项假定为“证书” 作为私钥的文件和 私人证书连接!看到 --cert和--key独立指定它们。
因此,为了与RestClient做同样的事情,您可以尝试使用ssl_client_key选项。像:
:ssl_client_key => OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),