Ruby SSL 握手未收到服务器问候回复 - 使用代理 Net::HTTP

Ruby SSL handshake not receiving Server Hello back - using proxy Net::HTTP

我正在使用 Ruby SSL 双向身份验证连接到外部 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 returned=5 errno=0 state=unknown state

而不是我之前两个问题中的旧问题

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A

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

这是我最新的 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 <top (required)>'

这通常会连接到几乎所有服务器。它使用 TLS 1.2 和 SNI。那应该建立 TCP 连接并开始 TLS 握手。稍后握手可能会失败,但那是另一个问题。

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

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

$ sudo netstat -a | grep openssl
$ 

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

$ sudo tcptrack -i eth0
# <next, use s_client>

172.16.2.4:43302      208.38.22.37:443      SYN_SENT     15s    0 B/s

您在 TCP 的等待计时器中。对方没有和你进行three-way握手。事实上,他们并没有承认你的 SYN。可能有几个原因,但是...

鉴于目标,您似乎遇到了防火墙。不是 Reject 连接,而是 Drop 'ing 连接。它有时被称为 "Stealth Mode";它使机器上似乎没有服务器 运行ning。这与 OpenSSL 的 connect: Connection timed out 消息一致。

问题可能出在代理上。你真的想 运行 从那里进行测试,但你可能做不到。可能是您正在使用远程站点指定的密码、协议和端口;但代理正在做自己的事情。另见 Jarmock 的 SSL Interception Proxies and Transitive Trust.

这里有一些参考资料: