Não é possível conectar-se ao mysql usando o certificado SSL auto-assinado

14

Depois de criar um certificado SSL autoassinado, configurei meu mysqld 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 o 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, eu lembro de ter lido algum problema de conexão com o mesmo servidor via SSL. Então eu baixo as chaves do cliente para a minha caixa local e testo de lá ...

~> 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 o que este erro "SSL connection error" se refere, mas se eu omitir o -ssl-ca, então eu posso conectar 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 esteja apenas criptografando a conexão e não realmente verificando a validade do certificado (o que significa que eu seria potencialmente vulnerável a ataques de intermediários)

Os certificados ssl são válidos (embora auto-assinados) e não têm uma frase-senha neles

Então, minha pergunta é: o que estou fazendo de errado? Como posso me conectar via SSL usando um certificado autoassinado?

A versão do servidor MySQL é 5.5.25 e o servidor e os clientes são Centos 5 Obrigado por qualquer conselho

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

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

A configuração do my.cnf é

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

Eu também tentei adicionar ssl-cipher = DHE-RSA-AES256-SHA, mas depois o removi, pois não ajudou

    
por carpii 17.06.2012 / 03:47

3 respostas

12

Sim, você está certo de que, se 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 para a falha é que o cliente não confia no certificado do servidor.

Se você estiver usando certificados de cliente e servidor autoassinados, o arquivo ca.cert 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 do servidor e o certificado:

$ 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 do cliente e o certificado:

$ 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 de CA:

$ cat server-cert.pem client-cert.pem > ca.pem
    
por 17.06.2012 / 21:37
3

Para usar um caminho, você deve tentar:

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

O --ssl-cert e --ssl-key no cliente mysql são usados para SSL de 2 vias. Isso significa autenticação baseada em certificado. O assunto do certificado do cliente deve ser o nome de usuário.

    
por 17.06.2012 / 22:25
0

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

    
por 17.06.2012 / 17:42