2011-11-02 120 views
6

我正在为需要与API进行SSL连接的客户端开发应用程序。我已经提供了三个文件;信任根证书(.cer)文件,中间证书(.cer)文件和已签名的响应文件。我已经给出的安装指令与IIS或Java keytool程序相关;我在Ruby on Rails中构建应用程序,因此这两者都不是一个选项(据我所知)。在Ruby on Rails应用程序中使用客户端SSL

证书由运行API服务的组织自签名,看起来我获得了客户端证书以相互验证https连接。我不能确定如何

  1. 使用我的应用程序的证书连接和使用API​​
  2. 的签名响应文件做什么

我读过"Using a self-signed certificate"this article on OpenSSL in Ruby但既不似乎相当受欢迎(并且都对Java/JRuby有一定的依赖性,这会使事情混淆)。

任何指针将不胜感激。

+0

为了澄清,您链接的mathish.com文章实际上与jRuby没有任何关系。我演示的代码必须与基于Java的ActiveMQ消息代理交谈,并使用Java的SSL证书约定。该代码中的大部分注释提醒我如何将Java的SSL证书从密钥库中取出,并转换为OpenSSL可以识别的格式。 –

+0

如果你在文本编辑器中打开.cer文件,它们是以“----- BEGIN CERTIFICATE -----”还是别的什么开头的? –

+0

嘿@ian,谢谢澄清。他们不以'----- BEGIN CERTIFICATE -----'开头;没有。用文本编辑器打开它;它看起来像内容以某种方式加密(只是随机一堆的ASCII符号和空格等,没有可读的字母)。 – jkale

回答

4

根据您的意见,我假设的证书是DER格式,它可以转换为PEM与openssl x509命令(见:openssl x509 command):

openssl x509 -inform DER -outform PEM -in certfile.cer -out certfile.pem 

之后,您可以指示Ruby的OpenSSL库使用受信任的根证书对这样的事情SSL连接进行验证:

require 'socket' 
require 'openssl' 

tcp_sock = TCPSocket.new("my.host.tld", 443) 
ctx = OpenSSL::SSL::SSLContext.new 
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT 
#You may need to specify the absolute path to the file 
ctx.ca_file = "certfile.pem" 

ssl_sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx) 
ssl_sock.sync_close = true 
ssl_sock.connect 
begin 
    ssl_sock.post_connection_check('my.host.tld') 
rescue 
    puts "Certificate host did not match expected hostname" 
end 

之后,你应该能够读取和写入ssl_sock像任何其他Ruby的IO对象。创建ssl_sock之前

ctx.cert = OpenSSL::X509::Certificate.new(File.read("my_cert.pem")) 
ctx.key = OpenSSL::PKey::RSA.new(File.read("my_key.rsa")) 

:如果您将得到使用,以使服务器验证您客户端证书,你可以配置SSL环境。 OpenSSL库还支持除了RSA等重点类型,如DSA(参见:OpenSSL::PKey module

最后,最后一条建议,如果你正在访问一个RESTful API,你可能要考虑使用的宝石一样rest-client而不是直接处理所有的HTTP/S连接。当然,这样的图书馆是否合适或有用取决于您使用的服务。

+0

只是想说明,与'SSLContext'对象'ca_file'属性不同,'cert'和'key'需要实际的文件数据,而不仅仅是文件名。 –

+0

如果您不关心验证证书上的名称,您也不必执行'post_connection_check'和周围的'begin ... rescue'块。 –

+0

大代码块的第4行应该是'tcp_sock'而不是'sock' – SnareChops