【问题标题】:Using Ruby OpenSSL to download and read certificates使用 Ruby OpenSSL 下载和读取证书
【发布时间】:2016-01-04 22:45:56
【问题描述】:

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

目前,我实际上是在使用 s_client 调用 openssl 可执行文件并解析响应以获取证书,但是当我有一个完整的库来处理这个(以及那个我肯定知道已经这样做了)。

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

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

提前致谢。

【问题讨论】:

    标签: ruby ssl openssl


    【解决方案1】:

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

    【讨论】:

    • 非常感谢,先生。 5 行让它在高水平上发生确实让我感到非常愚蠢。 :)
    • 如果您在此行之后添加ssl.hostname = remote_host,它将与SNI一起使用:ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
    • 不幸的是,它不适用于多个虚拟主机......它不支持 SNI。
    【解决方案2】:

    我假设“来自一个网址”是指 HTTPS。然后你可以使用net/http

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

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

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-22
      相关资源
      最近更新 更多