【发布时间】:2015-04-30 03:12:10
【问题描述】:
尝试在命令行上从 SOAP Web 服务获取 WSDL 时,我从 CURL 获得以下输出(这用于测试基本连接)。
服务器特定信息已被编辑,因为它属于供应商。供应商表示他们没有收到其他用户的任何类似报告。
curl -v WEB-SERVICE-URL Hostname was NOT found in DNS cache
Trying WEB-SERVICE-HOST-IP...
Connected to WEB-SERVICE-HOST-NAME (WEB-SERVICE-HOST-IP) port 443 (#0)
successfully set certificate verify locations:
CAfile: none
CApath: /etc/ssl/certs
SSLv3, TLS handshake, Client hello (1):
SSLv3, TLS handshake, Server hello (2):
SSLv3, TLS handshake, CERT (11):
SSLv3, TLS handshake, Server key exchange (12):
SSLv3, TLS alert, Server hello (2):
error:1408D172:SSL routines:SSL3_GET_KEY_EXCHANGE:wrong signature type
Closing connection 0
curl: (35) error:1408D172:SSL routines:SSL3_GET_KEY_EXCHANGE:wrong signature type
我在 Ubuntu 14.04 机器上运行这个命令,下面是 curl 和 openssl 版本信息。
curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3
pop3s rtmp rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP
这个错误似乎相当模糊,谷歌搜索它发现的结果很少。
如果我指定 --tlsv1.1 选项,curl 命令在 Ubuntu 14.04 上有效,因此问题似乎是 TLSv1.2 特定的(它也适用于没有该选项的 Ubuntu 13.04,因为它默认为 TLSv1.1)。
我还测试了通过 SoapUI 访问 WSDL,这适用于 Ubuntu 14.04,我猜这是因为 SoapUI 是 Java 并且不使用 Openssl?因此,TLSv1.1 工作正常,我认为问题不是由防火墙或代理引起的。
TLSv1.2 似乎也是 PHP SoapClient 的默认设置,当使用 WSDL 加载它时,我收到 failed to load external entity 错误,我认为这是由与 curl 调用相同的问题引起的。
如果我能找到强制 SoapClient 使用 TLSv1.1 的方法,那么这将是一个有效的解决方法,但是看来您只能通过创建启用了特定密码的流上下文来做到这一点,我已经尝试过了,但是使用到目前为止没有运气。
其他替代方法是实现一个避免 Openssl 或允许我指定 TLS 版本的 Soap 集成。
由于 14.04 是 LTS,我希望这项工作能够完成,如果问题出在 Openssl,我想深入了解它,有人有什么想法吗?。
编辑
使用 s_client 我会在错误消息中获得更多信息。
139860433102496:error:1408D172:SSL routines:SSL3_GET_KEY_EXCHANGE:wrong signature type:s3_clnt.c:1765:
这表明在 openssl 代码中抛出了错误here。
编辑 2
SoapUI 使用(成功)的密码是
TLS_DHE_RSA_WITH_AES_128_CBC_SHA, looking at the result ofopenssl 密码
我看不到等效密码。
编辑 3
以下命令openssl s_client -tls1_2 -cipher DHE-RSA-AES128-SHA -prexit -connect 产生以以下结尾的输出。
New, (NONE), Cipher is (NONE)
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID: 3ED4F6AB3EAD9BAD50059F9881951D2A759DC10FA1108B3107EA3374CC4922EE
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1430373464
Timeout : 7200 (sec)
Verify return code: 0 (ok)
【问题讨论】:
-
这是一个奇怪的错误,但有人在服务器端的一些 Java 实现中看到了这些错误,请参阅 ietf.org/mail-archive/web/tls/current/msg15961.html。最好知道真实的 URL 以检查这是同一类型的问题还是不同的问题。
-
我假设 OpenSSL 与各种 TLS 版本和 SOAP UI 之间的区别在于所用密码的选择。有关 ServerDHParams 错误编码的引用问题应该只发生在特定密码中,并且选择的密码还取决于客户端功能和 TLS 版本。
-
我会询问供应商,但我不确定它会有多大帮助,因为它不会公开访问。我已经添加了一些关于错误和密码的更多信息,基于你的 cmets 我开始认为 SoapUI 的 TLS 实现知道 OpenSSL 不知道的密码,这可能吗?。
-
OpenSSL 实现的密码通常比 Java 多,但使用不同的命名方案:
TLS_DHE_RSA_WITH_AES_128_CBC_SHA在那里称为DHE-RSA-AES128-SHA(两者都是密码代码0x00,0x33)。而且由于您的问题仅发生在 TLS1.2 上,我假设 TLS1.2 中的新密码之一是问题(检查openssl ciphers -V | grep TLSv1.2),并且 Java UI 使用的密码不是新的 TLS1.2 密码。跨度> -
如果您可以进行数据包捕获,这将有助于调试,以便您可以查看与wireshark握手的详细信息。您还应该能够通过限制使用的密码来解决问题,例如
--cipher DHE-RSA-AES128-SHA带有 curl,-cipher DHE-RSA-AES128-SHA带有 s_client 以及 somehow with PHP。