Não é possível conectar ao mysql usando o certificado SSL autoassinado

15

Após criar um certificado SSL autoassinado, configurei meu servidor MySQL remoto para usá-los (e o SSL está ativado)

Eu ssh no meu servidor remoto e tente conectar-se ao seu próprio mysqld usando SSL (o servidor MySQL é 5.5.25).

mysql -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert
Enter password: 
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

Ok, lembro de ter lido algum problema com a conexão ao mesmo servidor via SSL. Então, baixo as chaves do cliente para a minha caixa local e testei a partir daí ...

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key --ssl-ca=ca.cert 
Enter password: 
ERROR 2026 (HY000): SSL connection error

Não está claro a que esse erro de "erro de conexão SSL" se refere, mas se eu omitir o -ssl-ca, posso conectar-me usando SSL.

mysql -h <server> -u <user> -p --ssl=1 --ssl-cert=client.cert --ssl-key=client.key 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 37
Server version: 5.5.25 MySQL Community Server (GPL)

No entanto, acredito que isso apenas criptografa a conexão e não verifica a validade do certificado (o que significa que eu estaria potencialmente vulnerável a ataques intermediários)

Os certificados SSL são válidos (embora autoassinados) e não possuem uma senha. Então, minha pergunta é: o que estou fazendo de errado? Como conectar-me via SSL, usando um certificado autoassinado?

A versão do MySQL Server é 5.5.25 e o servidor e os clientes são o CentOS 5.

Obrigado por qualquer conselho

Editar : observe que, em todos os casos, o comando está sendo emitido do mesmo diretório em que as chaves ssl residem (portanto, nenhum caminho absoluto)

Editar (em resposta ao mgorven): ca.certé o certificado da Autoridade de Certificação, que deve informar ao mysql que minha autoridade de certificação é confiável.

A configuração de my.cnfé

[mysqld]
ssl-ca=/etc/ssl/mysql/ca.cert
ssl-cert=/etc/ssl/mysql/server.cert
ssl-key=/etc/ssl/mysql/server.key

Também tentei adicionar, ssl-cipher=DHE-RSA-AES256-SHAmas o removi, pois não ajudou.

carpii
fonte
2
O que é ca.cert? É o certificado autoassinado do servidor? Você está usando certificados de cliente para autenticação? Forneça a configuração relacionada ao SSL no servidor.
mgorven
Obrigado, atualizei minha pergunta com resposta e configuração de SSL do servidor. Os certificados transmitidos na linha de comando ao tentar conectar-se são de fato certificados de cliente.
Carpii
De fato, é uma boa pergunta. Em retrospectiva, não tenho certeza de que faz sentido para o cliente especificar os servidores ssl-ca. Mas, em seguida, sem Im sob a imrepssion a conexão criptografada não é stricly autenticado
carpii

Respostas:

12

Sim, você está certo de que, se você não especificar --ssl-ca, o cliente não verificará o certificado do servidor. Como funciona sem essa opção, o motivo mais provável da falha é que o cliente não confia no certificado do servidor.

Se você estiver usando certificados de cliente e servidor autoassinados, o ca.certarquivo deverá incluir esses dois arquivos. Dessa forma, o cliente confiará no certificado do servidor e o servidor confiará no certificado do cliente.

Por exemplo:
Gere a chave e o certificado do servidor:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout server-key-enc.pem -out server-cert.pem \
         -subj '/DC=com/DC=example/CN=server' -passout pass:qwerty

$ openssl rsa -in server-key-enc.pem -out server-key.pem \
         -passin pass:qwerty -passout pass:

Gere a chave e o certificado do cliente:

$ openssl req -x509 -newkey rsa:1024 \
         -keyout client-key-enc.pem -out client-cert.pem \
         -subj '/DC=com/DC=example/CN=client' -passout pass:qwerty

$ openssl rsa -in client-key-enc.pem -out client-key.pem \
         -passin pass:qwerty -passout pass:

Combine os certificados de cliente e servidor no arquivo de certificados da CA:

$ cat server-cert.pem client-cert.pem > ca.pem
Keith Burdis
fonte
Muito obrigado! A etapa que falta é que eu não estava concatenando certs de servidor e cliente em um ca.pem. Eu estava em vez de passar o ca.cert que foi gerada inicialmente (e, em seguida, passado como --ca-chave ao gerar certificados de cliente e servidor)
carpii
Estranho, mas sempre funcionou para mim com apenas um certificado CA - o mesmo no cliente e no servidor.
Dmitry Leskov
Sim, desde que não haja requisitos especiais para o DN - por exemplo, o CN sendo um valor específico -, você poderá usar a mesma chave e certificado autoassinado no cliente e no servidor.
Keith Burdis
3

Para usar o SSL unidirecional, você deve tentar com:

mysql -u <user> -p --ssl=1 --ssl-ca=ca.cert --ssl-verify-server-cert

O cliente --ssl-certe --ssl-keyno mysql são usados ​​para SSL bidirecional. Isso significa autenticação baseada em certificado. O assunto do certificado do cliente deve ser o nome de usuário.

Mircea Vutcovici
fonte
2
Lembre-se também de que, ao fazer uma conexão de soquete e ao usar --ssl-verify-server-certo CN do certificado do servidor, deve ser o mesmo que o host especificado para a opção de linha de comando -h.
Keith Burdis
0

Por acaso, você não digitou o mesmo nome comum para certificados de servidor e cliente? Se sim, substitua um deles para que Nomes comuns sejam diferentes.

Dmitry Leskov
fonte
Para mim, a solução de Dmitry Leskov funcionou. De acordo com a documentação SSL do MySQL: ( dev.mysql.com/doc/refman/5.0/en/creating-ssl-certs.html )> Qualquer que seja o método usado para gerar o certificado e os arquivos de chave, o valor de Nome comum usado para o servidor e cada certificado / chave do cliente deve diferir do valor do nome comum usado para o certificado da CA. Caso contrário, o certificado e os arquivos de chave não funcionarão para servidores compilados usando o OpenSSL. Um erro típico nesse caso é: ERRO 2026 (HY000): Erro de conexão SSL: erro: 00000001: lib (0): func (0): reason (1)
gmas