Não é possível conectar-se ao banco de dados mysql remoto usando autenticação de senha SSL e SHA256

0

Eu posso conectar-me com sucesso através de uma conexão segura da cli do servidor web, mas recebo uma mensagem de erro ao testar a conexão através do script php.

status do mysql do servidor web cli

mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

Connection id:      9
Current database:   
Current user:       [email protected]
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.21-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     0.0.0.0 via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
TCP port:       3306
Uptime:         3 days 4 hours 53 min 35 sec

Threads: 1  Questions: 17  Slow queries: 0  Opens: 107  Flush tables: 1  Open tables: 26  Queries per second avg: 0.000

Variáveis SSL do servidor web cli

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+

Subsídios do servidor da web cli

+-------------------------------------------------------------+
| Grants for [email protected]                             |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'0.0.0.0'              |
| GRANT SELECT ON 'testDB'.* TO 'test'@'0.0.0.0' |
+-------------------------------------------------------------+

Conjunto de caracteres usando utf8mb4 do servidor web cli

+--------------------------+------------------------+
| Variable_name            | Value                  |
+--------------------------+------------------------+
| character_set_client     | utf8mb4                |
| character_set_connection | utf8mb4                |
| character_set_database   | utf8mb4                |
| character_set_filesystem | binary                 |
| character_set_results    | utf8mb4                |
| character_set_server     | utf8mb4                |
| character_set_system     | utf8                   |
| collation_connection     | utf8mb4_unicode_520_ci |
| collation_database       | utf8mb4_unicode_520_ci |
| collation_server         | utf8mb4_unicode_520_ci |
+--------------------------+------------------------+

Permissões do usuário no banco de dados remoto

+------------------+-------------+-----------------------+----------+
| user             | host        | plugin                | ssl_type |
+------------------+-------------+-----------------------+----------+
| test             | 0.0.0.0     | sha256_password       | X509     |
+------------------+-------------+-----------------------+----------+

Permissões de certificado no servidor da web

apache@web:~$ ls -al /etc/mysql-client
total 20
drwxr-xr-x  2 root root 4096 Mar 24 02:30 .
drwxr-xr-x 99 root root 4096 Mar 30 20:04 ..
-r-xr-xr-x  1 root root 1107 Mar 24 02:30 ca.pem
-r-xr-xr-x  1 root root 1107 Mar 24 02:30 client-cert.pem
-r-xr-xr-x  1 root root 1679 Mar 24 02:30 client-key.pem

PHP Test Script no servidor da web

$dsn = 'mysql:host=db.test.com;port=3306;dbname=testDB;charset=utf8mb4';
$dbuser = 'test';
$dbpass = 'sha256-hash';

$dboptions = array (
    PDO::MYSQL_ATTR_SSL_KEY    =>'/etc/mysql-client/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT   =>'/etc/mysql-client/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA     =>'/etc/mysql-client/ca.pem',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false 
);

    try {
        $conn = new PDO($dsn,$dbuser,$dbpass,$dboptions);
        if($conn){
                echo "Connection established";
        }
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }

Conexão de rede bem-sucedida do servidor da web para o servidor de banco de dados

Connection to 0.0.0.0 3306 port [tcp/mysql] succeeded!

Mensagem de erro do servidor da web

apache@web:~$ php -f test.php
Connection failed: SQLSTATE[HY000] [2002]

As poucas perguntas que tenho são:

  • A senha do banco de dados usada no script php deve ser definida como a string de senha de texto simples ou o hash sha256? Eu tentei ambos e nem trabalho.

  • Como os certificados estão em / etc com permissões globais e o script php tem caminhos de arquivo explícitos, é necessário criar uma conta de usuário do banco de dados no servidor da web? Por exemplo, meu usuário "teste" no servidor web é realmente usado para testar a conexão mysql da linha de comando. Não vejo como o apache depende do usuário de teste.

  • Qualquer configuração do php.ini que eu deveria dar uma olhada? A única que testei foi a alteração de "open_basedir" para incluir o diretório / etc / mysql-client, mas também não fiz nada.

  • Alguém sabe se o Bug # 77595 foi corrigido?

  • Alguém realmente obteve autenticação sha256_password sobre SSL usando PHP para realmente funcionar?

UPDATE # 1

Supostamente Bug # 77595 foi corrigido no php7.2.3, então eu ativei uma nova VM com ubuntu18.04 que tem php7.2.3 como o pacote padrão, ainda sem sorte. A única string de erro que parecia útil de var_dump era

"PDO::__construct(): SSL operation failed with code 1. OpenSSL Error 
messages: error:0906D06C:PEM routines:PEM_read_bio:no start line"

mysql login a partir da linha de comando ainda funciona com os mesmos certificados, é apenas o php não gosta deles. Eu scp'd eles do servidor mysql, então a chance de erro de formatação é improvável.

    
por Kev 03.04.2018 / 11:28

1 resposta

0

Não tenho uma resposta clara para este problema. Minha suposição é que algo está acontecendo com o yaSSL. Acabei usando o Percona, que implementa o openSSL.

    
por 05.10.2018 / 06:58

Tags