php - 如何在 ssl ://transport? 的 PHP 流上下文中强制使用某个 TLS 版本

标签 php ssl

尝试访问 https URL 时如何在 PHP 流上下文中强制使用 TLSv1.0?

我正在寻找与此类似的东西:

$context = stream_context_create(
  array(
    'ssl' => array(
      'protocol_version' => 'tls1',
    ),
  ));
file_get_contents('https://example.com/test', false, $context);

背景

其实我面对的是an issue in Ubuntu 12.04使用 PHP 的 SoapClient 时.不幸的是,我尝试连接的服务器只支持 SSLv3.0/TLSv1.0,默认的 TLSv1.1 协商失败。因此,我想将 ssl:// 传输协议(protocol)显式设置为 TLSv1.0。

最佳答案

PHP 5.6+ 用户

这是 PHP 5.6 OpenSSL Changes page 中记录的新功能.

在撰写本文时,PHP5.6 处于 Beta1 阶段,因此这并不是很有用。 future 的人——你真幸运!

future 就在我们身边。 PHP 5.6 很重要,应该鼓励使用它。请注意,它弃用了一些相当广泛使用的东西,例如 mysql_* 函数,因此在升级时应该小心。

其他人

@toubsen 的回答是正确的——这不可能直接实现。详细说明他建议的解决方法……在解决供应商的 API 服务器未正确协商 TLSv1.2 到其支持的 TLSv1.0 的问题时,发送一小部分密码似乎可以让协商正确完成。流上下文代码是:

$context = stream_context_create(
    [
        'ssl' => [
            'ciphers' => 'DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:KRB5-RC4-MD5:KRB5-RC4-SHA:RC4-SHA:RC4-MD5:RC4-MD5:KRB5-DES-CBC-MD5:KRB5-DES-CBC-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-KRB5-RC2-CBC-MD5:EXP-KRB5-DES-CBC-MD5:EXP-KRB5-RC2-CBC-SHA:EXP-KRB5-DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-KRB5-RC4-MD5:EXP-KRB5-RC4-SHA:EXP-RC4-MD5:EXP-RC4-MD5',
        ],
    ]
);

SOAP 用户

PHP 的 SOAP 客户端不使用 curl,它似乎也不使用通过 stream_context_set_default 设置的默认上下文。因此,需要将创建的上下文传递给第二个参数中的 SOAPClient 构造函数:

$soap_client = new SOAPClient('http://webservices.site.com/wsdlfile.wsdl', array('stream_context' => $context));

为什么使用这些密码?

在服务器上运行命令 openssl ciphers 会为您提供上述格式的受支持密码列表。运行 openssl ciphers -v 会告诉您那些特定于 TLSv1.2 的密码。上面的列表是根据 OpenSSL 报告的所有非 TLSv1.2 密码编译的。

openssl 密码 -v | grep -v 'TLSv1.2' |剪切-d ' ' -f 1 | tr "\n"':'

关于php - 如何在 ssl ://transport? 的 PHP 流上下文中强制使用某个 TLS 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547163/

相关文章:

vb.net - 如何在我的网络浏览器应用程序中包含证书

ssl - 在使用 HTTP 的反向代理后面时 Jetty 安全 session cookie

asp.net - 网络 API : Basic Authentication or HMAC over SSL?

Php 代码结果与 mySQL 查询不匹配

php - 使用 Swiftmailer 通过 Symfony2 命令从本地主机发送邮件

php - connect_error 什么都不返回,但代码不工作

php - 在运行时在 php 中添加文本字段

ssl - 我在哪里可以看到 "Certification Path tab"?

javascript - Facebook 应用程序 SSL 更改 - AJAX Flash/服务器数据安全

php - paypal 自定义金额变量 BMUpdate?