为PHP 5.4.4 SoapClient启用SSLv3支持

时间:2014-07-02 06:57:32

标签: php soap-client

使用此代码:

$soap = new SoapClient('https://test-api.geotrust.com/webtrust/query.jws?WSDL');

我看到了这个错误:

  

PHP致命错误:SOAP-ERROR:解析WSDL:无法从' https://test-api.geotrust.com/webtrust/query.jws?WSDL'加载:未能加载外部实体" https://test-api.geotrust.com/webtrust/query.jws?WSDL"

如果你有PHP 5.5,你可以这样做:

$soap = new SoapClient($url),
array (
"ssl_method" => "SOAP_SSL_METHOD_SSLv23"
)

PHP 5.4.4的任何此类解决方案?我目前无法升级PHP。

我已经尝试过在网上找到的sslv3://建议,但它并不适用于Debian。

感谢。

1 个答案:

答案 0 :(得分:0)

  

SoapClient :: SoapClient():SSL操作失败,代码为1. OpenSSL错误消息:错误:140770FC:SSL例程:SSL23_GET_SERVER_HELLO:未知协议

听起来你没有让SSL / TLS服务器正在收听。您可以使用以下内容重现它​​。注意使用端口80而不是443。

$ openssl s_client -connect stackoverflow.com:80
CONNECTED(00000003)
140735323054556:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:787:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 320 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

如果您执行侦听SSL / TLS服务器,那么您可以尝试使用单一协议连接到它:

SSL v3

openssl s_client -ssl3 -connect example.com:443

TLS 1.0

openssl s_client -tls1 -connect example.com:443 -servername example.com

TLS 1.1

openssl s_client -tls1_1 -connect example.com:443 -servername example.com

TLS 1.2

openssl s_client -tls1_2 -connect example.com:443 -servername example.com

array (
  "ssl_method" => "SOAP_SSL_METHOD_SSLv23"
)

只是自行车脱落,但在C中我们通常使用2/3方法,然后禁用无用的协议和选项。例如:

const SSL_METHOD* method = SSLv23_method();
if(method == NULL) handleFailure();

SSL_CTX* ctx = SSL_CTX_new(method);
if(ctx == NULL) handleFailure();

/* Cannot fail ??? */
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
SSL_CTX_set_options(ctx, flags);

在上面的代码中,我们使用2/3方法,然后我们禁用SSLv2(损坏),SSLv3(弱/受伤)和压缩(损坏,泄漏信息)。这意味着我们使用TLS 1.0及更高版本进行连接。如果TLS 1.2可用,则使用;否则如果TLS 1.1可用,则使用它;否则使用TLS 1.0。