Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby OpenSSL::SSL::SSLContext SNI服务器名\u cb不工作_Ruby_Macos_Openssl_Sni_Server Name - Fatal编程技术网

Ruby OpenSSL::SSL::SSLContext SNI服务器名\u cb不工作

Ruby OpenSSL::SSL::SSLContext SNI服务器名\u cb不工作,ruby,macos,openssl,sni,server-name,Ruby,Macos,Openssl,Sni,Server Name,如中所述,我需要使用TLSv1或更高版本和扩展 即使通过SSLContext设置了ssl\u版本和servername\u cb,我仍然得到了myproair.com的错误证书 begin timeout(1) do tcp_client = TCPSocket.new("#{instance["domain"]}", 443) ssl_context = OpenSSL::SSL::SSLContext.new() ssl_context.ss

如中所述,我需要使用TLSv1或更高版本和扩展

即使通过
SSLContext
设置了
ssl\u版本
servername\u 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修订版45883)[universal.x86_64-darwin14]
$openssl版本
OpenSSL 0.9.8zc 2014年10月15日
当然,您可以为OpenSSL::SSLSocket使用“主机名”方法

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

我在编写代码时发现了一个类似的目标。

servername\u cb
用于服务器端。当服务器获得连接时,它调用回调以允许服务器选择与SNI相关的证书:)在客户端上,您正在寻找与
SSL\u set\u tlsext\u host\u name
等效的Ruby。您可以在OpenSSL上看到一个基于C的示例。它向您展示了如何在Ruby中获得“TLS 1.0及以上版本”。@jww感谢您的所有见解-我正在进入edge case领域,但很有趣:)仍在四处寻找Ruby等价物…Ruby让我非常沮丧。我发现安全地做一些基本的事情太难了,比如建立一个安全的通道。(对于安全通道,我有自己的“安全”定义)。我最终放弃了它,不再尝试学习它。在过去几个月沉浸在Ruby中之后,我得出了同样的结论——我正在讨论用Python重写。你喜欢什么?