在我的PHP应用程序中,我使用PHP的CURL和openssl来连接和使用SOAP进行交谈。 到目前为止,远程服务器支持SSL和TLS,但由于“poodle”错误,管理员决定禁用SSL并仅使用TLS。 SSL支持到1月底。
我通过添加:
来更改我的代码curl_setopt($objCurl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
理论上应强制卷曲使用TLSv1.2。
但是这个理论 - 我需要验证它实际上是否使用了TLS - 有什么方法吗? 有一个名为curl_getinfo()的方法,但它返回的信息对我没用:
[url] => https://www.example.com/soap/MessagingPort
[content_type] => text/xml;charset=utf-8
[http_code] => 200
[header_size] => 293
[request_size] => 882
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.164487
[namelookup_time] => 3.4E-5
[connect_time] => 3.4E-5
[pretransfer_time] => 0.000122
[size_upload] => 604
[size_download] => 178
[speed_download] => 1082
[speed_upload] => 3672
[download_content_length] => 178
[upload_content_length] => 604
[starttransfer_time] => 0.164477
[redirect_time] => 0
提前致谢
答案 0 :(得分:92)
简答
使用curl向https://www.howsmyssl.com/
发出请求<?php
$ch = curl_init('https://www.howsmyssl.com/a/check');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);
$json = json_decode($data);
echo $json->tls_version;
应该输出用于连接的TLS版本。
深入挖掘
Curl依赖底层的OpenSSL(或NSS)库来进行安全连接的协商。所以我认为这里要问的正确问题是OpenSSL库能够做什么。如果它可以处理TLS连接,那么curl可以处理TLS连接。
那么如何弄清楚openssl(或NSS)库的功能呢?
<?php
$curl_info = curl_version();
echo $curl_info['ssl_version'];
将会转出像
这样的东西OpenSSL/1.0.1k
然后,您可以查看该版本的发行说明,看看它是否包含TLS支持。
OpenSSL发行说明 - https://www.openssl.org/news/changelog.html
NSS发行说明 - https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/NSS_Releases
扰流警报
答案 1 :(得分:4)
例如:
$ curl https://tlstest.paypal.com/
ERROR! Connection is using TLS version lesser than 1.2. Please use TLS1.2
$ ./src/curl https://tlstest.paypal.com/
PayPal_Connection_OK
答案 2 :(得分:1)
如果您想测试特定 url(如支付 api 端点)使用的协议,您可以 log curl's verbose output 并在那里查看。这是一个简单的例子:
bash-4.2$ ./wsadmin.sh -f test.py 'e:\\dir1\\dir2\\ta.prop'
WASX7209I: Connected to process "server1" on node DefaultNode01 using SOAP connector; The type of process is: UnManagedProcess
WASX7303I: The following options are passed to the scripting environment and are available as arguments that are stored in the argv variable: "[e:\\dir1\\dir2\\ta.prop]"
[DEBUG] This is the name of the script: e:\dir1\dir2\ta.prop
[DEBUG] Number of arguments: 1
[INFO] Script argument should be the path to the property file: ['e:\\dir1\\dir2\\ta.prop']
对我来说,输出如下:
$url = 'https://example.com/';
$ch = curl_init($url);
$out = fopen('php://temp', 'w+');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $out);
curl_exec($ch);
curl_close($ch);
rewind($out);
$debug = stream_get_contents($out);
if (preg_match('/SSL connection.*/', $debug, $match)) {
echo '<pre>' . $url . PHP_EOL . $match[0];
}