“Falha na validação do certificado SSL” ao verificar o certificado do servidor curinga no MariaDB 5.5

1

Estou tentando migrar de um certificado autoassinado para um certificado curinga de uma autoridade de certificação bem conhecida para reduzir a sobrecarga de manutenção e melhorar a segurança. O certificado já está em uso há meses nos servidores de teste. A configuração está funcionando bem o suficiente para que eu possa fazer o seguinte (nome de domínio anônimo):

mysql --host=host.example-dot-com-equivalent-for.co.uk --user=query_user --password --ssl

Isso se conecta com sucesso depois de fornecer a senha. No entanto, quando tento realmente verificar o nome comum do certificado falha:

$ mysql --host=host.example-dot-com-equivalent-for.co.uk --user=query_user --password --ssl --ssl-verify-server-cert
ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure

Depois de compilar o MariaDB 5.5 usando cmake -DCMAKE_BUILD_TYPE=Debug -DWITH_SSL=yes e executar o cliente com --debug , recebo o seguinte log de rastreio (aparado):

mysql_real_connect: info: Connecting
mysql_real_connect: info: net->vio: 0x0  protocol: 0
mysql_real_connect: info: Server name: 'host.example-dot-com-equivalent-for.co.uk'.  TCP sock: 3306
mysql_real_connect: info: IP 'client'
mysql_real_connect: info: IPV6 getaddrinfo host.example-dot-com-equivalent-for.co.uk
mysql_real_connect: info: Try connect on all addresses for host.
mysql_real_connect: info: Create socket, family: 2  type: 1  proto: 6
mysql_real_connect: info: Connect socket
mysql_real_connect: info: End of connect attempts, sock: 4  status: 0  error: 0
mysql_real_connect: info: net->vio: 0x263c540
mysql_real_connect: info: Read first packet.
mysql_real_connect: info: mysql protocol version 10, server=10
get_charsets_dir: info: charsets dir: '/usr/local/mysql/share/charsets/'
my_stat: error: Got errno: 2 from stat
run_plugin_auth: info: using plugin mysql_native_password
native_password_auth_client: info: no password
native_password_auth_client: info: IO layer change in progress...
ssl_do: info: ssl: 0x2823e50 timeout: 0
ssl_do: info: SSL connection succeeded
ssl_do: info: Using cipher: 'AES256-GCM-SHA384'
ssl_do: info: Peer certificate:
ssl_do: info:    subject: '/OU=Domain Control Validated/OU=Gandi Standard Wildcard SSL/CN=*.example-dot-com-equivalent-for.co.uk'
ssl_do: info:    issuer: '/C=FR/ST=Paris/L=Paris/O=Gandi/CN=Gandi Standard SSL CA 2'
ssl_do: info: no shared ciphers!
native_password_auth_client: info: IO layer change done!
ssl_verify_server_cert: info: Server hostname in cert: *.example-dot-com-equivalent-for.co.uk
run_plugin_auth: info: authenticate_user returned CR_ERROR
run_plugin_auth: info: res=0
mysql_real_connect: error: message: 2026/HY000 (SSL connection error: SSL certificate validation failure)
end_server: info: Net:
main: info: Shutting down: infoflag: 3  print_info: 1

Observe especificamente que o valor Server name corresponde ao valor CN .

O certificado é válido para o nome do host fornecido e não está expirado, conforme verificado por openssl s_client -connect host.example-dot-com-equivalent-for.co.uk:443 -verify_return_error < /dev/null . O campo "X509v3 Subject Alternative Name" contém "DNS: *. Example-dot-com-equivalent-for.co.uk, DNS: example-dot-com-equivalent-for.co.uk"

A cadeia de certificados inteira está no arquivo apontado pela configuração ssl-cert do servidor, como recomendado em outro lugar . "USERTrust RSA Certification Authority" está no /etc/pki/tls/certs/ca-bundle.crt e /etc/pki/tls/certs/ca-bundle.trust.crt do cliente. Eu tentei adicionar --ssl-ca=/etc/pki/tls/certs/ca-bundle.crt ao comando, mas isso não mudou nada.

A questão acaba sendo: Os clientes MySQL / MariaDB suportam certificados curinga? Se o fizerem, há algo errado com minha conexão?

Cliente original:

$ mysql --version
mysql  Ver 15.1 Distrib 10.1.21-MariaDB, for Linux (x86_64) using readline 5.1

Cliente de depuração:

$ ./client/mysql --version
./client/mysql  Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

Servidor:

# rpm -q mariadb
mariadb-5.5.52-1.el7.x86_64

Postado em unix.SE ao invés de dba.SE porque o problema pode estar nas bibliotecas SSL e não no cliente.

    
por l0b0 15.06.2017 / 15:23

1 resposta

2

As bibliotecas-cliente MariaDB não ofereciam certificados curinga até MariaDB 10.1.23 .

A biblioteca cliente do Percona-Server começou a suportar o curinga em e Servidor Percona 5.6.36-82.1

Para as bibliotecas clientes do MariaDB e do Percona-Server que suportam esse recurso, o OpenSSL 1.0.2+ é adicionalmente necessário para esse suporte para a função x509_check_host subjacente

Os clientes MySQL upstream a partir de 5.7.22 e 8.0.11 não suportam certificados curinga.

Isso se aplica apenas aos clientes baseados em libmysqlclient.so (libperconaserverclient.so). O suporte a curinga SSL para outros conectores (por exemplo, JDBC, Go, etc.) que não envolvem a API C do mysql dependerá da implementação específica.

    
por 27.04.2018 / 05:45