[PHP][PDO][TLS]OpenSSL 错误:tlsv1 警报协议版本

问题描述 投票:0回答:1

mysql端需要使用TLS1.2连接,如何在PHP或PDO上分配/设置TLS版本? 我确认mysql和证书是正确的,因为我使用python3实现它。这个错误困扰了我好几天,我查了很多资料,但仍然没有解决。下面是详细信息。感谢您的阅读和帮助。

版本列表:

  • PHP:5.6.40
  • OpenSSL:3.0.2(使用 php 回显它。)
  • mysql:8.0
  • nginx: nginx/1.18.0(Ubuntu)

错误信息

2023/04/04 17:08:41 [error] 756#756: *49 FastCGI sent in stderr: "PHP message: PHP Warning:  PDO::__construct(): SSL operation failed with code 1. OpenSSL Error messages:
error:0A00042E:SSL routines::tlsv1 alert protocol version
...
PHP message: PHP Warning:  PDO::__construct(): Cannot connect to MySQL by using SSL in /opt/web/libs/inc.db.php on line 52
PHP message: PHP Warning:  PDO::__construct(): [2002]  (trying to connect via tcp://0.0.0.0:3306) in /opt/web/libs/inc.db.php on line 52
...
PHP message: PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] ' in /opt/web/libs/inc.db.php:52
Stack trace:
#0 /opt/tci/web/libs/inc.db.php(52): PDO->__construct('mysql:host=0.0....', 'usr', 'pwd', Array)
#1 /opt/web/libs/inc.db.php(59): DBAL->__construct()
#2 /opt/web/libs/inc.db.php(94): DBAL::getInstance()
#3 /opt/web/libs/libtc.php(414): DBAL::do_select('SELECT * FROM u...')
#4 /opt/web/login.php(38): check_admin_exsit()
#5 {main}
  thrown in /opt/web/libs/inc.db.php on line 52" while reading response header from upstream, client: 192.168.0.1, server: _, request: "GET /rest/login.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php5.6-fpm.sock:", host: "192.168.0.1"

[PHP]PDO 代码:

    private function __construct() {
        $db_url = "0.0.0.0";
        $db_name = "test";
        $db_user = "usr";
        $db_pwd  = "pwd";
        $db_encoding = "utf8";
        $dsn="mysql:host=$db_url;dbname=$db_name;";
        if( version_compare(PHP_VERSION, '5.3.6', '<') ){
            if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
                $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . $db_encoding;
            }
        } else {
            $dsn .= ';charset=' . $db_encoding;
        }
        $options_ssl_arr = [
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_PERSISTENT         => true,
            PDO::MYSQL_ATTR_FOUND_ROWS   => true,
            PDO::MYSQL_ATTR_SSL_KEY      => '/path/to/cert/abc.pem.key',
            PDO::MYSQL_ATTR_SSL_CERT     => '/path/to/cert/abc.pem.crt',
            PDO::MYSQL_ATTR_SSL_CA       => '/path/to/cert/abc.ca.pem.crt',
            PDO::MYSQL_ATTR_SSL_CIPHER   => 'DHE-RSA-AES256-GCM-SHA384',  
          ];
        $this->connection = new PDO($dsn, $db_user, $db_pwd, $options_ssl_arr); //failed here.
    }

mysql端需要使用TLS1.2连接,如何在PHP或PDO上分配/设置TLS版本? 我确认mysql和证书是正确的,因为我使用python3实现它。这个错误困扰了我好几天,我查了很多资料,但仍然没有解决。下面是详细信息。感谢您的阅读和帮助。

我尝试了很多方法,我将以下部分附加到

/etc/ssl/openssl.cnf
尾部:但是失败了

[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=0

我尝试更改 nginx 配置文件

/etc/nginx/nginx.cnf
:但是失败了

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

php mysql pdo openssl tls1.2
1个回答
0
投票

面临同样的问题。这是由于 php 核心中的这个错误 https://bugs.php.net/bug.php?id=74445 造成的。虽然这个问题与 mysqli 有关,但 PDO 驱动程序也受到影响。不幸的是,我还没有找到任何方法可以在不将 php 版本升级到 7.2 的情况下解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.