使用 Ruby OpenSSL 下载和读取证书

Using Ruby OpenSSL to download and read certificates

我正在尝试研究如何使用 stdlib 中的 OpenSSL 从网络 address/uri 下载证书,然后在警报应用程序中使用它。

目前,我实际上是在使用 s_client 调用 openssl 可执行文件并解析响应以获取证书,但感觉 silly/clunky 当我有一个整个库来处理这个(而且我肯定已经知道了)。

我花了一些时间试图了解 Ruby 中的 openssl 源代码,但我觉得自己被它打败了;互联网上似乎也充斥着许多试图绕过 SSL (wince) 的 ruby​​ist,而不是 OpenSSL 本身的有用信息,所以我在那里也没有太多运气。

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

提前致谢。

其实很简单。要获取远程证书,您需要尝试 建立 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,但它可以帮助您入门。

我假设 "from a web address" 表示 HTTPS。然后你可以只使用 net/http.

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

如果设置了 http_proxy env var,这也适用于代理服务器。