首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP握手失败TLS1.0

PHP握手失败TLS1.0
EN

Stack Overflow用户
提问于 2016-11-29 13:22:15
回答 3查看 1.3K关注 0票数 8

我试图通过fsockopen连接到sendm.cert.legalmail.it上的465端口,这是在意大利名为PEC的SMTPS服务。

对于任何版本的PHP,我都尝试过这样的代码片段工作:

代码语言:javascript
复制
<?php
fsockopen('tls://sendm.cert.legalmail.it', 465);

OpenSSL 1.0.2h没有问题,如果我升级到OpenSSL 1.0.2j,这个代码段会因为以下错误而失败:

代码语言:javascript
复制
    PHP Warning:  fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
    error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure in ~/Development/experimental/php-handshake/connect.php on line 3
    PHP Warning:  fsockopen(): Failed to enable crypto in ~/Development/experimental/php-handshake/connect.php on line 3
    PHP Warning:  fsockopen(): unable to connect to tls://sendm.cert.legalmail.it:465 (Unknown error) in ~/Development/experimental/php-handshake/connect.php on line 3

因此,使用OpenSSL 1.0.2j,我尝试通过命令行连接:

代码语言:javascript
复制
openssl s_client -connect sendm.cert.legalmail.it:465

它工作得很完美。

我尝试使用testssl检查服务器上的SSL --这是转储(已剥离):

代码语言:javascript
复制
SSLv2               not offered (OK)
SSLv3               not offered (OK)
TLS 1               offered
TLS 1.1             not offered
TLS 1.2             not offered
Version tolerance   downgraded to TLSv1.0 (OK)

只有TLS 1是可以获得的,我尝试用uri:'tlsv1.0:://sendm.cert.legalmail.it'强制握手到TLS1,但是结果是一样的。

我在Ubuntu16.04上,用PHP5.6和PHP7.1测试。

窃听器在哪里?在openssl?用PHP吗?在服务器握手中?

如果我看到chiper总是使用带有./testssl.sh -E sendm.cert.legalmail.it:465OpenSSL 1.0.2j返回更新:

代码语言:javascript
复制
x05     RC4-SHA                           RSA        RC4       128      TLS_RSA_WITH_RC4_128_SHA                           
x04     RC4-MD5                           RSA        RC4       128      TLS_RSA_WITH_RC4_128_MD5                           
x16     EDH-RSA-DES-CBC3-SHA              DH 1024    3DES      168      TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA                  
x0a     DES-CBC3-SHA                      RSA        3DES      168      TLS_RSA_WITH_3DES_EDE_CBC_SHA                      
x15     EDH-RSA-DES-CBC-SHA               DH 1024    DES       56       TLS_DHE_RSA_WITH_DES_CBC_SHA                       
x09     DES-CBC-SHA                       RSA        DES       56       TLS_RSA_WITH_DES_CBC_SHA                           
x14     EXP-EDH-RSA-DES-CBC-SHA           DH(512)    DES       40,exp   TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA              
x08     EXP-DES-CBC-SHA                   RSA(512)   DES       40,exp   TLS_RSA_EXPORT_WITH_DES40_CBC_SHA                  
x06     EXP-RC2-CBC-MD5                   RSA(512)   RC2       40,exp   TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5                 
x03     EXP-RC4-MD5                       RSA(512)   RC4       40,exp   TLS_RSA_EXPORT_WITH_RC4_40_MD5      

使用版本OpenSSL 1.0.2h

代码语言:javascript
复制
x05     RC4-SHA                           RSA        RC4       128       
x04     RC4-MD5                           RSA        RC4       128       
x16     EDH-RSA-DES-CBC3-SHA              DH 1024    3DES      168       
x0a     DES-CBC3-SHA                      RSA        3DES      168

而php OPENSSL_DEFAULT_STREAM_CIPHERS是相同的,它包含的所有版本包括:

代码语言:javascript
复制
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:HIGH:!SSLv2:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!RC4:!ADH
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-30 09:19:22

好吧,经过一些研究,我发现了原因:

PHP有一个OPENSSL_DEFAULT_STREAM_CIPHERS,它包含openssl的默认查询,并使用以下命令:

代码语言:javascript
复制
openssl ciphers -v `php -r 'echo OPENSSL_DEFAULT_STREAM_CIPHERS;'`

我得到了PHP能够处理的所有密码,并安装了openssl的当前版本。

1.0.2h1.0.2j之间,相同的查询返回不同的密码,列出对以下内容的删除支持:

  1. EDH-RSA-DES-CBC3-SHA
  2. DES-CBC3-SHA

因此,在默认情况下,PHP无法正确处理连接,但如果我强制$context使用此密码,则会发生连接:

代码语言:javascript
复制
$context = stream_context_create(
    [
        'ssl' => [
            'ciphers' => 'EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA',
        ],
    ]
);

$fp = stream_socket_client(
  'tls://sendm.cert.legalmail.it:465',
  $errno,
  $errstr,
  30,
  STREAM_CLIENT_CONNECT,
  $context
);
票数 2
EN

Stack Overflow用户

发布于 2017-05-05 14:56:05

对于所有经历同样问题的人: Legalmail服务器现在似乎支持TLSv1.2,所以这不再是他们的问题了。

票数 1
EN

Stack Overflow用户

发布于 2016-11-29 22:37:20

完全编辑的答案:请看这里的答案,CERTIFICATE:certificate verify failed, CA is OK

这可能是袜子和卷发的原因。虽然他的问题在windows / xampp上,但我认为这会有所帮助,我想升级操作系统的人没有将php.ini与新版本合并。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40867007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档