php - 确保 SoapClient 在 PHP 5.5 中发送 TLS 1.2 请求
问题描述
我们在使用 PHP 5.5(目前)的旧代码库上有一个站点,我们与之交互的其中一个集成SoapClient
告诉我们,他们将很快禁用 TLS < 1.2。
目前我们的连接很简单:
$client = new SoapClient($soap_url);
我们必须做些什么来确保只发送 TLS 1.2 请求?我找到了这个答案,但我不完全确定这是否仍然适用于我们的情况;另外,不确定我们是否应该强制使用Soap 1.1?
确保我们发送 TLS 1.2 请求的要求是什么?
解决方案
在与服务器协商连接时,您的 TLS 库(假设为 openSSL)将告诉服务器您支持的最大版本是多少。然后服务器将选择它和客户端都支持的版本。因此,假设您的客户端系统支持 TLS1.2,您可能不需要执行任何操作。
TLS 1.2 支持在 1.0.1 中添加到 OpenSSL。如果您使用 el6 或更新版本并更新您的软件包,您应该没问题。像这样检查您的版本:
# openssl version
> OpenSSL 1.0.2k-fips 26 Jan 2017
您可以使用以下 nmap 命令检查服务器支持的协议/密码:
nmap --script ssl-enum-ciphers -p 443 stackoverflow.com
现在,如果您想在使用 TLS1.1 时测试失败,或者强制使用密码或其他东西,您将需要使用 PHP 的stream_context_create
.
crypto_method
使用下面的代码,您可以通过将 设置为来
强制使用 TLS1.2 STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT
。或者,也许对您的要求更有用,您可以在强制使用STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
.
<?php
$options = ['trace' => 1,
'soap_version' => SOAP_1_2,
'exceptions' => true,
'location' => 'https://stackoverflow.com/foo',
'uri' => "https://stackoverflow.com/bar",
'stream_context' => stream_context_create([
'ssl'=> [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT,
'ciphers' => 'SHA256'
]
])];
$client = new SoapClient(null, $options);
try {
$response = $client->getFoo();
} catch (\Exception $e){
var_dump($client->__getLastRequest());
var_dump($client->__getLastResponse());
throw $e;
}
//OR, an even easier test with out a Soap Client...
$opts = [
'ssl'=> [
'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT,
'ciphers' => 'SHA256',
'verify_peer' => false,
'verify_peer_name' => false
]
];
$context = stream_context_create($opts);
$fp = fopen('https://stackoverflow.com', 'r', false, $context);
如果事情适用于 1.2 并且您可以生成一个强制说 1.1 的错误,那么您可以非常确信事情设置正常。错误将大致如下:
警告:fopen():SSL 操作失败,代码为 1。OpenSSL 错误消息:错误:140830B5:SSL 例程:ssl3_client_hello:没有可用的密码
fopen():启用加密失败
当谈到 SOAP 版本1.1和1.2时,它们只是简单对象访问协议的不同 W3C 标准。更多关于一些差异的信息可以在这里找到。
最后我想说的是,我没有在 PHP 5.5 中测试过这个,这是一个太旧的版本,这些天我没有一个简单的方法来启动它。然而,认为这仍然适用。
推荐阅读
- php - 通过 PHP 将图像插入到特定于用户的集合 mongoDB
- django - 频道如何知道其中发送事件的组的名称?
- r - 毕达哥拉斯函数的 if 语句,其中“c”必须大于“a”或“b”
- java - 使用流 API 将数字列表拆分为两个单独的奇数和偶数列表
- algorithm - 用主定理求解 4T(n/5) + log5(n * sqrt(n))
- sql - 动态 SQL 错误地查找表变量
- c - 为什么即使输入的值使条件为假,这个while循环代码也不起作用?
- c - 编写字符串比较函数
- java - 如何在 QuerydslPredicateExecutor 中使用 IN 包含忽略大小写?
- r - 计算R中数据框中文本的出现次数