使用Ruby OpenSSL下载和读取证书

时间:2016-01-04 22:45:56

标签: ruby ssl openssl

我正在尝试使用stdlib中的OpenSSL从web地址/ uri下载证书,然后在警报应用程序中使用它。

目前,我实际上是使用s_client调用openssl可执行文件并解析响应以获取证书但是当我有一个完整的lib来处理这个时,它只是觉得愚蠢/笨拙(那个我肯定已经知道了。)

我花了一些时间试图用Ruby包围我的openssl源代码,但我觉得它被它击败了;互联网似乎充斥着许多红宝石试图绕过他们的SSL(wince),而不是OpenSSL本身的有用信息,所以我也没有太多运气。

有人能指出我正确的方向吗?也许通过文档或类似的东西能够处理这个特定的任务?如果你有一个更好的例子,但我更愿意尝试自己解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:6)

实际上它非常简单。要获取远程证书,您需要尝试建立SSL连接,然后从那里读取对等证书,

# Get OpenSSL context
ctx = OpenSSL::SSL::SSLContext.new

# Get remote TCP socket
sock = TCPSocket.new(remote_host, 443)

# pass that socket to OpenSSL
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)

# establish connection, if possible
ssl.connect

# get peer certificate and do things with it
cert = ssl.peer_cert
cert.version
cert.subject.to_s

现在,这个简单的方法不能与SNI一起使用,但它会让你开始。

答案 1 :(得分:0)

我假设“来自网址”是指HTTPS。然后,您可以只使用net/http

require 'net/http'
cert = Net::HTTP.start(host, '443', use_ssl: true) { |http| http.peer_cert }

如果设置了http_proxy env var,这在代理服务器之后也可以工作。