gpt4 book ai didi

PHP 握手失败 TLS1.0

转载 作者:可可西里 更新时间:2023-11-01 12:38:00 25 4
gpt4 key购买 nike

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

对于任何版本的 PHP,我都尝试过这个片段:

<?php
fsockopen('tls://sendm.cert.legalmail.it', 465);

OpenSSL 1.0.2h 一切正常,如果我升级到 OpenSSL 1.0.2j,此代码段将失败并出现此错误:

    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,我尝试通过命令行进行连接:

openssl s_client -connect sendm.cert.legalmail.it:465

它完美地工作。

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

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 强制握手到 TLS1:'tlsv1.0:://sendm.cert.legalmail.it' 但结果是一样的。

我在 Ubuntu 16.04 上,用 PHP5.6 和 PHP7.1 测试过。

错误在哪里?在 openssl 中?在 PHP 中?在服务器握手中?

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

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

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 const OPENSSL_DEFAULT_STREAM_CIPHERS 在它包含的所有版本中都是相同的:

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

最佳答案

好的,经过一些研究我找到了原因:

PHP 有一个 OPENSSL_DEFAULT_STREAM_CIPHERS,其中包含 openssl 的默认查询,使用此命令:

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 连接发生:

$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
);

关于PHP 握手失败 TLS1.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com