O OpenSSL pode ser usado para depurar uma conexão SSL com um servidor MySQL?

17

Eu quero que meu servidor da Web fale com o servidor de banco de dados MySQL através de uma conexão SSL. O servidor Web executa o CentOS5, o servidor de banco de dados executa o FreeBSD. Os certificados são fornecidos por um intermediário CA DigiCert.

O MySQL deve estar usando o ssl, de acordo com my.cnf :

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
ssl
ssl-capath = /opt/mysql/pki/CA
ssl-cert = /opt/mysql/pki/server-cert.pem
ssl-key = /opt/mysql/pki/server-key.pem

Quando inicio o MySQL, o daemon é iniciado sem erros. Isso sugere que os arquivos de certificado são todos legíveis.

Mas quando tento me conectar do servidor da Web ao servidor de banco de dados, recebo um erro:

[root@webserver ~]# mysql -h mysql.example.org -u user -p
ERROR 2026 (HY000): SSL connection error

E se eu tentar depurar ainda mais com o openssl:

[root@webserver ~]# openssl s_client -connect mysql.example.org:3306 0>/dev/null
CONNECTED(00000003)
15706:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:

Esta é uma maneira válida de testar a conexão SSL com um servidor de banco de dados MySQL? A mensagem SSL23_GET_SERVER_HELLO:unknown protocol é estranha, já que normalmente é o que você veria se estivesse falando SSL em uma porta destinada ao tráfego não SSL.

Este mesmo comando openssl parece funcionar bem com o LDAP & Servidores HTTP:

$ openssl s_client -connect ldap.example.org:636  0>/dev/null
CONNECTED(00000003)
depth=2 /C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority
...
$ openssl s_client -connect www.example.org:443  0>/dev/null
CONNECTED(00000003)
depth=0 /DC=org/DC=example/OU=Services/CN=www.example.org
    
por Stefan Lasiewski 16.07.2013 / 21:16

5 respostas

5

OpenSSL versão 1.1.1 (lançado em 11 de setembro de 2018) adicionou suporte para -starttls mysql em commit a2d9cfbac5d87b03496d62079aef01c601193b58 . Infelizmente não consigo encontrar a referência a esse novo recurso no changelog do OpenSSL.

Se a sua distribuição ainda não tem esta versão, existe um binário openssl compilado estaticamente em link que suporta -starttls mysql . Eu encontrei a referência para isso em link .

Para o Windows, os binários do OpenSSL 1.1.1 podem ser encontrados no link

Gerei os certificados SSL, conforme descrito no link , tentou e funciona:

$ echo | bin/openssl.Linux.x86_64.static s_client -starttls mysql -connect spx-bionic.censored.com:3306 -CAfile /tmp/ca.pem
CONNECTED(00000003)
depth=1 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = mysql test CA
verify return:1
depth=0 C = AU, ST = Some-State, O = Internet Widgits Pty Ltd, CN = spx-bionic.censored.com
verify return:1
---
Certificate chain
 0 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
 1 s:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
   i:/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
Server certificate
-----BEGIN CERTIFICATE-----
CENSORED
-----END CERTIFICATE-----
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=spx-bionic.censored.com
issuer=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=mysql test CA
---
No client certificate CA names sent
Client Certificate Types: RSA sign, DSA sign, ECDSA sign
Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
Peer signing digest: SHA512
Server Temp Key: ECDH, P-521, 521 bits
---
SSL handshake has read 2599 bytes and written 632 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: AD25B7C3018E4715F262188D982AAE141A232712316E0A3292B0C14178E0F505
    Session-ID-ctx: 
    Master-Key: C121967E8FAEC4D0E0157419000660434D415251B0281CCBFC6D7A2AE8B0CC63AEFE22B332E91D31424C1BF03E5AF319
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 7200 (seconds)
    TLS session ticket:
    0000 - 82 db 03 0f c0 ce f2 26-62 bd 1b 18 71 03 88 db   .......&b...q...
    0010 - a6 66 7c 71 94 0c d5 ec-96 30 46 53 4a e6 cd 76   .f|q.....0FSJ..v
    0020 - 66 b3 22 86 7d 9f 7e 2c-14 1d 66 f2 46 8f d2 d3   f.".}.~,..f.F...
    0030 - f7 0a 0b f5 9e 05 97 e1-2b b3 ba 79 78 16 b8 59   ........+..yx..Y
    0040 - dc c5 0d a8 de 0b 3a df-4b ec f9 73 3f 4c c3 f1   ......:.K..s?L..
    0050 - 86 b6 f7 aa a7 92 84 77-9f 09 b2 cc 5d dd 35 41   .......w....].5A
    0060 - 23 5d 77 74 e1 96 91 ac-28 81 aa 83 fe fc d2 3c   #]wt....(......<
    0070 - f9 23 09 6d 00 e0 da ef-48 69 92 48 54 61 69 e8   .#.m....Hi.HTai.
    0080 - 30 0e 1f 49 7d 08 63 9e-91 70 fc 00 9f cd fe 51   0..I}.c..p.....Q
    0090 - 66 33 61 24 42 8f c2 16-57 54 48 ec 6a 87 dc 50   f3a$B...WTH.j..P

    Start Time: 1537350458
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
DONE

Há também -starttls suporte para postgres e ldap também no OpenSSL 1.1.1. Consulte o link para obter a lista completa.

    
por 19.09.2018 / 11:58
11

Respondendo a minha própria pergunta. Se você tiver uma resposta melhor com fontes boas e confiáveis, poste uma resposta.

Resposta curta; Não, o OpenSSL não pode ser usado para depurar conexões SSL do MySQL. Isso ocorre porque o MySQL inicia a sessão usando texto simples e alterna para SSL posteriormente.

Ao ler o link , o MySQL inicia com uma conexão de texto simples, e então o SSL real é iniciado depois. Isso explica como o MySQL pode escutar em uma porta (porta 3306) para conexões criptografadas e de texto simples. Compare isso com um servidor HTTP ou LDAP, em que uma porta é usada para conexões de texto simples e uma segunda porta é usada para conexões criptografadas.

It starts with the client connect()ing to the server which may send a ERR packet and finish the handshake or send a Initial Handshake Packet which the client answers with a Handshake Response Packet. At this stage client can request SSL connection, in which case an SSL communication channel is established before client sends its authentication response

    
por 11.02.2014 / 21:54
2

Uma causa comum desse problema é que o Nome Comum (CN) do certificado da CA é o mesmo que o certificado do servidor e / ou do cliente.

Veja aqui: link

Tente recriar seu CA & certificado (s) e garantir a utilização de uma CN única em todos os casos.

    
por 13.09.2013 / 06:01
0

Estou me deparando com um problema semelhante com o cliente MacOS X se comunicando com um servidor Ubuntu.

Você pode verificar se a conexão funcionará se você deixar de fora o certificado do lado do cliente e a chave do cliente, tendo apenas a CA para o certificado do servidor? Você consegue estabelecer uma conexão criptografada? Isso normalmente exigirá a configuração ANY para a coluna ssl_type do usuário associado.

    
por 21.09.2013 / 03:02
0

Só queria observar para a posteridade que se você quiser usar um balanceador de carga (como um F5 ou HAProxy) entre o MySQL e o cliente, você vai querer importar seu certificado SSL do balanceador de carga para o servidor MySQL. Isso se deve à inicialização de conexão semelhante a STARTTLS.

    
por 27.05.2016 / 21:19

Tags