2016-11-29 24 views
8

Tôi cố kết nối qua fsockopen đến sendm.cert.legalmail.it trên cổng 465, là dịch vụ SMTPS được gọi là PEC ở Italy.Bắt tay PHP không TLS1.0

Với bất kỳ phiên bản của PHP tôi đã cố gắng làm việc đoạn này:

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

tất cả đó là ok với OpenSSL 1.0.2h, nếu tôi nâng cấp lên OpenSSL 1.0.2j đoạn này thất bại với lỗi này:

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 

Vì vậy, với OpenSSL 1.0.2j tôi cố gắng kết nối qua dòng lệnh:

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

Nó hoạt động hoàn hảo.

tôi cố gắng kiểm tra SSL trên máy chủ với testssl đây là bãi (tước):

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) 

Chỉ TLS 1 là avaiable, tôi cố gắng để buộc bắt tay để TLS1 với uri này: 'tlsv1.0:://sendm.cert.legalmail.it' nhưng kết quả là giống nhau.

Tôi đang sử dụng Ubuntu 16.04, được thử nghiệm với PHP5.6 và PHP7.1.

Lỗi ở đâu? trong openssl? trong PHP? trong cái bắt tay của máy chủ?

Cập nhật nếu tôi nhìn vào chiper luôn với ./testssl.sh -E sendm.cert.legalmail.it:465 với OpenSSL 1.0.2j trở lại:

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  

Với phiên bản 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 

Và php const OPENSSL_DEFAULT_STREAM_CIPHERS là accross cùng tất cả Phiên bản có chứa:

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 

Trả lời

2

Ok, sau một số nghiên cứu tôi tìm thấy lý do:

PHP có một OPENSSL_DEFAULT_STREAM_CIPHERS chứa các truy vấn mặc định cho openssl, với lệnh này:

openssl ciphers -v `php -r 'echo OPENSSL_DEFAULT_STREAM_CIPHERS;'` 

tôi nhận được tất cả các thuật toán mã hóa PHP có thể xử lý với các phiên bản hiện tại của openssl cài đặt.

giữa 1.0.2h1.0.2j cùng trở lại truy vấn mật mã khác nhau liệt kê một hỗ trợ thả cho các:

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

Vì vậy, theo mặc định PHP không thể xử lý các kết nối một cách chính xác , nhưng nếu tôi ép buộc $context bằng mật mã này, kết nối sẽ diễn ra:

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

Câu trả lời đã chỉnh sửa hoàn toàn: xem câu trả lời tại đây HTTPS and SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, CA is OK

Đây có thể là nguyên nhân cho fsock cũng như curl. Mặc dù câu hỏi của anh ta là trên windows/xampp, tôi cho rằng nó sẽ giúp ích, tôi cho rằng người nâng cấp hệ điều hành đã không hợp nhất php.ini với phiên bản mới

+0

nhưng câu hỏi này không phải là về xác thực xác thực, nó không thành công khi bắt tay. – Cronos

0

Đối với những người khác gặp sự cố tương tự: có vẻ như máy chủ Tmail Legalmail hiện hỗ trợ TLSv1.2, vì vậy đây không còn là vấn đề nữa với họ.

Các vấn đề liên quan