Ruby SSL握手没有收到服务器Hello回来 – 使用代理Net :: HTTP

我使用Ruby SSL双向身份validation连接到外部API。

我的最新脚本在这里:

namespace :rnif_message do # With Proxy task send_test_index: :environment do our_cert = File.read(File.join(Rails.root, 'ssl', 'invoice', 'test', 'cert20190116_ourcert.der')) their_test_cert = File.read(File.join(Rails.root, 'ssl', 'invoice', 'test', 'testcert2016_theircert.der')) cert_store = OpenSSL::X509::Store.new # Contains their intermediate CA files cert_store.add_path File.join(Rails.root, 'ssl', 'invoice', 'test', 'ca') cert_store.add_cert OpenSSL::X509::Certificate.new(their_test_cert) uri = URI("https://xml.digital.com/wm.rn/receive") proxy_host = "us-static-02.qg.com" proxy_port = "port" proxy_user = "user" proxy_pass = "pass" proxy_request = Net::HTTP.new(uri.hostname, '443', proxy_host, proxy_port, proxy_user, proxy_pass) proxy_request.verify_mode = OpenSSL::SSL::VERIFY_PEER proxy_request.use_ssl = true proxy_request.ssl_version = :TLSv1_2 proxy_request.ciphers = ["AES256-SHA:AES128-SHA:DES-CBC3-SHA"] proxy_request.cert = OpenSSL::X509::Certificate.new(our_cert) proxy_request.cert_store = cert_store post_request = Net::HTTP::Post.new(uri) response = proxy_request.request(post_request) end 

回复(因为我更新了密码)现在

OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL返回= 5 errno = 0 state =未知状态

而不是我之前的两个问题中的老年人

OpenSSL :: SSL :: SSLError:SSL_connect SYSCALL返回= 5 errno = 0 state = SSLv3读取服务器hello A

  # /Users/me/projects/proj/lib/tasks/rnif_message_builder.rake:217:in `block (2 levels) in ' 

这是我最新的wireshark

Wireshark的

在我的证书和他们的服务器配置上的IP的初始配置中,我可能给了他们错误的IP地址,所以我可能会被他们的防火墙阻止。 有没有办法使用openssl s_client我可以测试一下吗?

到目前为止,我一直在努力

openssl s_client -showcerts -connect xml.digitaloilfield.com:https

但我对使用openssl s_client不是很熟悉

任何有关故障排除的帮助将不胜感激!

更新

到目前为止,非常感谢你的帮助。 我正在试验你发给我的那些命令,并试图看看我能从他们那里得到什么信息来帮助我。 目前,在他们更改我的IP地址并允许我通过防火墙后,我得到了这个

  EOFError: end of file reached /Users/me/projects/xtiri/xtiri.com/lib/tasks/rnif_message_builder.rake:219:in `block (2 levels) in ' 

这通常会连接到几乎所有服务器。 它使用TLS 1.2和SNI。 这应该建立TCP连接并启动TLS握手。 握手可能会在以后失败,但这是一个不同的问题。

 $ openssl s_client -connect xml.digitaloilfield.com:443 -tls1_2 \ -servername xml.digitaloilfield.com -debug  connect: Connection timed out connect:errno=110 

但是,当s_client挂起时,跳转到另一个终端并发出:

 $ sudo netstat -a | grep openssl $ 

Netstat不会向您显示SYN_SEND状态,因此请使用tcptrack

 $ sudo tcptrack -i eth0 #  172.16.2.4:43302 208.38.22.37:443 SYN_SENT 15s 0 B/s 

你在TCP的等待计时器。 另一方没有与你进行三方握手。 事实上,他们没有承认你的SYN 。 可能有几个原因,但……

鉴于目标,看起来您遇到了防火墙。 它不是拒绝连接,而是连接。 它有时被称为“隐身模式” ; 它使得它看起来没有服务器在机器上运行。 这与OpenSSL的connect: Connection timed out消息一致。

问题可能出在代理上。 你真的想从那里运行测试,但你可能无法做到。 可能是您正在使用远程站点指定的密码,协议和端口; 但是代理正在做自己的事情。 另请参阅Jarmock的SSL拦截代理和传递信任 。

以下是一些参考:

  • 如何监控应用程序的网络连接
  • 在iptables中设置-j REJECT或-j DROP是否更好?
  • Wireshark Wiki上的TCP三向握手