Eu quero que meu servidor web fale com o servidor de banco de dados MySQL através de uma conexão SSL. O servidor da Web executa o CentOS5, o servidor de banco de dados executa o FreeBSD. Os certificados são fornecidos por um CA DigiCert intermediário.
O MySQL deve estar usando 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 inicia sem erros. Isso sugere que os arquivos de certificado são todos legíveis.
Mas quando tento conectar-me 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 SSL23_GET_SERVER_HELLO:unknown protocol
mensagem é estranha, pois 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 servidores LDAP e 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
Respostas:
O OpenSSL versão 1.1.1 (lançado em 11 de setembro de 2018) adicionou suporte para
-starttls mysql
no commit a2d9cfbac5d87b03496d62079aef01c601193b58 . Infelizmente, não consigo encontrar a referência a esse novo recurso no changelog do OpenSSL.Se sua distribuição ainda não possui esta versão, existe um binário openssl compilado estaticamente em https://testssl.sh/openssl-1.0.2k-dev-chacha.pm.ipv6.Linux+FreeBSD.tar.gz que suporta
-starttls mysql
. Encontrei a referência em http://www.danneman.org/presentations/Automating_TLS_Configuration_Verification.pdf .Para Windows, os binários OpenSSL 1.1.1 podem ser encontrados em https://wiki.openssl.org/index.php/Binaries
Eu gerei os certificados SSL conforme descrito em https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html , tentei e funciona:
Também há
-starttls
suporte para postgres e ldap também no OpenSSL 1.1.1. Consulte https://github.com/openssl/openssl/blob/OpenSSL_1_1_1-stable/apps/s_client.c#L815-L831 para obter a lista completa.fonte
Respondendo a minha própria pergunta. Se você tiver uma resposta melhor com fontes boas e autorizadas, 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 sem formatação e depois muda para SSL.
Ao ler https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase.html , o MySQL inicia com uma conexão de texto sem formatação e, em seguida, o SSL real é iniciado posteriormente. Isso explica como o MySQL é capaz de escutar em uma porta (porta 3306) conexões de texto simples e criptografadas. Compare isso com um servidor HTTP ou LDAP, em que uma porta é usada para conexões de texto sem formatação e uma segunda porta é usada para conexões criptografadas.
fonte
Uma causa comum desse problema é que o Nome Comum (CN) do certificado da CA é o mesmo que o certificado do servidor e / ou cliente.
Veja aqui: https://dev.mysql.com/doc/refman/5.6/en/creating-ssl-certs.html
Tente recriar sua CA e certificado (s) e garanta o uso de uma CN exclusiva em todos os casos.
fonte
Estou 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, apenas tendo a CA para o certificado do servidor? Você é capaz de estabelecer uma conexão criptografada? Isso normalmente exigirá a configuração QUALQUER para a coluna ssl_type do usuário associado.
fonte
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, deverá importar seu certificado SSL do balanceador de carga para o servidor MySQL. Isso ocorre devido à inicialização da conexão do tipo STARTTLS.
fonte