jka*_*ale 6 ruby ssl openssl ruby-on-rails keytool
我正在为需要与API进行SSL连接的客户端开发应用程序.我已经获得了三个文件; 信任根证书(.cer)文件,中间证书(.cer)文件和签名响应文件.我给出的安装指令涉及IIS或Java keytool程序; 我正在使用Ruby on Rails构建应用程序,因此两者都不是一个选项(据我所知).
证书由运行API服务的组织自签名,并且看起来我得到了客户端证书以相互验证https连接.我不确定如何
我在Ruby中阅读了"使用自签名证书"和OpenSSL上的这篇文章,但似乎都没有达到目的(并且两者都依赖Java/JRuby来混淆事物).
任何指针都将非常感激.
根据您的评论,我假设证书采用 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 连接内容。当然,这样的库是否合适或有用将取决于您正在使用的服务。
| 归档时间: |
|
| 查看次数: |
4178 次 |
| 最近记录: |