加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – OpenSSL :: SSL :: SSLContext SNI servername_cb不工作

发布时间:2020-12-17 02:55:22 所属栏目:百科 来源:网络整理
导读:如 OpenSSL::X509::Certificate Showing Certificate for Wrong Domain中所述,我需要使用TLSv1或更高版本以及 Server Name Indication扩展名. 即使通过SSLContext设置了ssl_version和servername_cb,我仍然会获得myproair.com的错误证书. begin timeout(1) do
如 OpenSSL::X509::Certificate Showing Certificate for Wrong Domain中所述,我需要使用TLSv1或更高版本以及 Server Name Indication扩展名.

即使通过SSLContext设置了ssl_version和servername_cb,我仍然会获得myproair.com的错误证书.

begin 
    timeout(1) do
      tcp_client = TCPSocket.new("#{instance["domain"]}",443)
      ssl_context = OpenSSL::SSL::SSLContext.new()
      ssl_context.ssl_version = :TLSv1
      ssl_context.servername_cb = "https://#{instance["domain"]}"
      ssl_client = OpenSSL::SSL::SSLSocket.new(tcp_client,ssl_context)
      ssl_client.connect
      cert = OpenSSL::X509::Certificate.new(ssl_client.peer_cert)
      ssl_client.sysclose
      tcp_client.close
      #http://ruby-doc.org/stdlib-2.0/libdoc/openssl/rdoc/OpenSSL/X509/Certificate.html
      date = Date.parse((cert.not_after).to_s)
      row.push("#{date.strftime('%F')} #{cert.signature_algorithm} #{cert.subject.to_a.select{|name,_,_| name == 'CN' }.first[1]}".downcase.ljust(57))
    end
  rescue SocketError
    row.push("down".ljust(57))
  rescue Errno::ECONNREFUSED
    row.push("connection refused".ljust(57))
  rescue Errno::ECONNRESET
    row.push("connection reset".ljust(57))
  rescue Timeout::Error
    row.push("no 443 listener".ljust(57))
  rescue OpenSSL::SSL::SSLError
    row.push("bad certificate - ssl error".ljust(57))
  rescue Exception => ex
    row.push("error: #{ex.class} #{ex.message}".ljust(57))
  end

如何在OS X上的Ruby 2.0中设置服务器名称?

$ruby --version
ruby 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]

$openssl version
OpenSSL 0.9.8zc 15 Oct 2014

解决方法

当然,您对OpenSSL :: SSLSocket使用 undocumented‘主机名’方法!

tcp_client = TCPSocket.new("#{instance["domain"]}",443)
ssl_context = OpenSSL::SSL::SSLContext.new()
ssl_context.ssl_version = :TLSv1
ssl_client = OpenSSL::SSL::SSLSocket.new(tcp_client,ssl_context)
ssl_client.hostname = instance["domain"]
ssl_client.connect
cert = OpenSSL::X509::Certificate.new(ssl_client.peer_cert)
ssl_client.sysclose
tcp_client.close

我在编写具有类似目标的代码时发现了here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读