如何使用 SoapClient 强制 TLS 1.2?
How to force TLS 1.2 with SoapClient?
我使用的 PSP 最近切换为仅支持 TLS 1.2(根据 PCI-DSS)。
在 php7 应用程序中,我可以连接到他们的 SOAP API。但是,自从他们升级后,我收到一个 SSL 错误,表明他们的服务器不支持我的 TLS 版本。我 运行 一个 wireshark 并且可以确认只有一个 client hell
o,所以 server hello
并且它在 TLS 1.0 上。
我正在使用以下代码:
$this->soapClient = new SoapClient('some/wsdl'), [
'location' => 'https://endpoint.of.server',
'soap_version' => SOAP_1_1,
'stream_context' => stream_context_create([
'ssl' => [
'local_cert' => '/path/to/client.crt',
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
],
])
]);
但是,此代码仍使用 TLS 1.0 而不是所需的 TLS 1.2。
版本
OpenSSL 1.1.0h 27 Mar 2018
PHP 7.1.6-1~ubuntu16.04.1+deb.sury.org+1 (cli) ( NTS )
.
事实证明,上面的代码是 100% 正确的。
就我而言,错误出在证书中的某处。由于仍然未知的原因,我们自行生成的 SSL 客户端证书不能很好地应对 TLS 1.2。在我们生成新证书后,一切都像魔术一样。
我尝试/验证的事情
- 确保您有受支持的
openssl
版本 (>= 1.0.1)
- 考虑手动指定密码
- 使用 Wireshark 调试连接以验证协议
另外,看看How to force a certain TLS version in a PHP stream context for the ssl:// transport?
我使用的 PSP 最近切换为仅支持 TLS 1.2(根据 PCI-DSS)。
在 php7 应用程序中,我可以连接到他们的 SOAP API。但是,自从他们升级后,我收到一个 SSL 错误,表明他们的服务器不支持我的 TLS 版本。我 运行 一个 wireshark 并且可以确认只有一个 client hell
o,所以 server hello
并且它在 TLS 1.0 上。
我正在使用以下代码:
$this->soapClient = new SoapClient('some/wsdl'), [
'location' => 'https://endpoint.of.server',
'soap_version' => SOAP_1_1,
'stream_context' => stream_context_create([
'ssl' => [
'local_cert' => '/path/to/client.crt',
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
],
])
]);
但是,此代码仍使用 TLS 1.0 而不是所需的 TLS 1.2。
版本
OpenSSL 1.1.0h 27 Mar 2018
PHP 7.1.6-1~ubuntu16.04.1+deb.sury.org+1 (cli) ( NTS )
.
事实证明,上面的代码是 100% 正确的。
就我而言,错误出在证书中的某处。由于仍然未知的原因,我们自行生成的 SSL 客户端证书不能很好地应对 TLS 1.2。在我们生成新证书后,一切都像魔术一样。
我尝试/验证的事情
- 确保您有受支持的
openssl
版本 (>= 1.0.1) - 考虑手动指定密码
- 使用 Wireshark 调试连接以验证协议
另外,看看How to force a certain TLS version in a PHP stream context for the ssl:// transport?