用于双向ssl身份validation的Ruby客户端

我有java web服务支持2路ssl auth 。 所以我在可信商店中拥有服务器证书的客户端密钥存储区( client.p12 )和在受信任存储区中具有客户端证书的服务器密钥存储区。

我可以使用浏览器或邮递员轻松调用我的服务(只需要在浏览器证书管理中导入client.p12 )但我遇到了ruby客户端的问题。

我目前的版本:

require 'rest_client' p12 = OpenSSL::PKCS12.new(File.read('client.p12'), 'password') client = RestClient::Resource.new('https://localhost:8080/service', :ssl_client_cert => p12.certificate, :ssl_cert_key => p12.key, :verify_ssl => OpenSSL::SSL::VERIFY_NONE, :ssl_version => 'TLSv1_2', :ssl_ciphers => 'ECDHE-RSA-AES128-GCM-SHA256').get 

失败了:

 connect_nonblock': SSL_connect SYSCALL returned=5 errno=0 state=unknown state (OpenSSL::SSL::SSLError) 

我的客户端代码有什么问题?

openssl s_client输出:

 $ openssl s_client -connect localhost:8080 .... SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 ... 

您需要将client.p12文件导入到nssdb位置。

 mkdir /root/nssdb pk12util -i /path-to/your/client.p12 -d /root/nssdb certutil -L -d /root/nssdb/ export SSL_DIR = /root/nssdb curl -X POST -H "Content-Type: text/xml" --data "#{xml}" --cert cert:password "https://localhost:8080/service" -v -k chmod -R 777 /root/nssdb chown -R user /root/nssdb 

在你的ruby客户端中嵌入这个curl调用。 它会工作。

注意:如果您使用的是其他ssl版本,则需要在curl命令中添加–tlsv1.0

传递密钥的选项不是:ssl_cert_key ,它是:ssl_client_key 。 这有什么不同吗?