在Ruby on Rails应用程序中使用客户端SSL

jka*_*ale 6 ruby ssl openssl ruby-on-rails keytool

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

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

  1. 使用我的应用程序中的证书来连接和使用API
  2. 签名的响应文件的作用

在Ruby中阅读了"使用自签名证书"OpenSSL上的这篇文章,但似乎都没有达到目的(并且两者都依赖Java/JRuby来混淆事物).

任何指针都将非常感激.

Ian*_*les 4

根据您的评论,我假设证书采用 DER 格式,您可以使用以下openssl x509命令将其转换为 PEM(请参阅:openssl x509 命令):

openssl x509 -inform DER -outform PEM -in certfile.cer -out certfile.pem
Run Code Online (Sandbox Code Playgroud)

之后,您可以指示 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
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够ssl_sock像任何其他 Ruby IO 对象一样读取和写入。如果您获得了客户端证书来允许服务器对您进行身份验证,则可以使用以下命令配置 SSL 上下文:

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

在创建之前ssl_sock。OpenSSL 库还支持除 RSA 之外的其他密钥类型,例如 DSA(请参阅:OpenSSL::PKey 模块。)

最后,最后一条建议是,如果您正在访问 RESTful API,您可能需要考虑使用像Rest-client这样的 gem ,而不是直接处理所有 HTTP/S 连接内容。当然,这样的库是否合适或有用将取决于您正在使用的服务。