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.
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?
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.