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.
这里有一些参考资料:
我正在使用 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.
这里有一些参考资料: