Habilitando o SSL no MySQL

24

Estou executando o Ubuntu Server 12.04 e quero habilitar conexões SSL com o MySQL.

Eu gerei os seguintes arquivos de chaves / certs com o OpenSSL:

  • ca-cert.pem
  • server-cert.pem
  • server-key.pem

Guardei-as em /etc/mysqle adicionei as seguintes linhas a /etc/mysql/my.cnf:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

Em seguida, reiniciei o servidor com sudo service restart mysql.

No entanto, isso não parece ativar o SSL. Dentro de uma sessão mysql:

mysql> show variables like '%ssl%';
+---------------+----------------------------+
| Variable_name | Value                      |
+---------------+----------------------------+
| have_openssl  | DISABLED                   |
| have_ssl      | DISABLED                   |
| ssl_ca        | /etc/mysql/ca-cert.pem     |
| ssl_capath    |                            |
| ssl_cert      | /etc/mysql/server-cert.pem |
| ssl_cipher    |                            |
| ssl_key       | /etc/mysql/server-key.pem  |
+---------------+----------------------------+

Alguma idéia do que estou perdendo? obrigado

visitor93746
fonte
2
Confira este tópico incrível . Talvez ele possa ajudá-lo.
SirCharlo
Obrigado pelo link SirCharlo, mas o problema abordado nesse segmento não parece se aplicar à minha situação.
usar o seguinte código
1
O que o @SirCharlo menciona é onde você deseja procurar. Especificamente, a parte Apparmor e o post nº 10 . As chaves que eu gerei no Debian Squeeze ou em um Ubuntu mais antigo funcionam bem - a regeneração no 12.04 faz com que falhe novamente. Veja os logs de erro do MySQL também.
gertvdijk
2
Eu tive essa mesma pergunta e passei horas nela, mas a resposta da @ user262116 a resolveu. Eu o incentivaria a aceitar essa resposta, se isso o ajudasse!
Elixenide

Respostas:

33

O Ubuntu 12.04 vem com um OpenSSL 1.0.1, que possui padrões um pouco diferentes dos da versão mais antiga do OpenSSL 0.9.8.

Entre outras coisas, se você estiver usando openssl req -newkey rsa:2048para gerar uma chave RSA, terá uma chave em um formato chamado PKCS # 8 . Representadas no formato PEM, essas chaves têm o -----BEGIN PRIVATE KEY-----cabeçalho mais genérico , que não informa qual é o tipo de chave (RSA, DSA, EC).

Anteriormente, com o OpenSSL 0.9.8, as chaves estavam sempre em um formato chamado PKCS # 1 , representado como PEM, tinha o cabeçalho -----BEGIN RSA PRIVATE KEY-----.

Por isso, você não pode simplesmente mudar o cabeçalho e rodapé de:

-----BEGIN PRIVATE KEY-----

para

-----BEGIN RSA PRIVATE KEY-----`

Não é a mesma coisa e não vai funcionar. Em vez disso, você precisa converter a chave para o formato antigo usando openssl rsa. Como isso:

openssl rsa -in key_in_pkcs1_or_pkcs8.pem -out key_in_pkcs1.pem

O MySQL (v5.5.35) no Ubuntu 12.04 está usando uma implementação SSL chamada yaSSL (v2.2.2). Ele espera que as chaves estejam no formato PKCS # 1 e não suporte o formato PKCS # 8 usado pelo OpenSSL 1.0 e mais recente. Se você simplesmente alterar o cabeçalho e o rodapé, conforme sugerido por outras postagens neste segmento, o MySQL / yaSSL não reclamará, mas você não poderá se conectar e, em vez disso, terá um erro como este:

ERROR 2026 (HY000): SSL connection error: protocol version mismatch

O Ubuntu 14.04 vem com o OpenSSL 1.0.1f e novas configurações. Entre outras coisas, ele irá gerar certificados com resumos SHA256 em vez de SHA1, que foi usado em versões anteriores. Incidencialmente, a versão yaSSL incluída no MySQL também não suporta isso.

Se você estiver gerando certificados para uso com o MySQL, lembre-se de garantir que as chaves RSA sejam convertidas no formato PKCS # 1 PEM tradicional e que os certificados estejam usando resumos SHA1.

Aqui está um exemplo de como gerar sua própria CA, um certificado de servidor e um certificado de cliente.

# Generate a CA key and certificate with SHA1 digest
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem

# Create server key and certficate with SHA1 digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl x509 -sha1 -req -in server-req.pem -days 730  -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl rsa -in server-key.pem -out server-key.pem

# Create client key and certificate with SHA digest, sign it and convert
# the RSA key from PKCS #8 (OpenSSL 1.0 and newer) to the old PKCS #1 format
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
openssl rsa -in client-key.pem -out client-key.pem
user262116
fonte
1
Este post salvou o dia para mim! Explicação e solução fantásticas.
generalopinion
Eu recebi 'ERRO 2026 (HY000): Erro de conexão SSL: ASN: antes da data no futuro'
Nitsan Baleli
Infelizmente, ainda recebi os ERROR 2026 (HY000): SSL connection error: protocol version mismatcherros (usando o OpenSSL 1.0.1f). Eu mudei para o OpenSSL 1.0.1e e funcionou com as instruções acima.
Jarrett
2
Essa resposta é incrível - daria uma recompensa enorme se eu pudesse. Ótima explicação do problema.
Elixenide
Outra voz para adicionar à horda. Tenho vasculhado a Internet tentando encontrar uma solução para o motivo pelo qual a configuração documentada do MySQL simplesmente não funcionaria - a parte inferior deste post salvou completamente meu dia.
Steve Chambers
4

Isso me ajudou:

O cabeçalho e o rodapé do arquivo server-key.pem eram assim:

-----BEGIN PRIVATE KEY-----
...
...
-----END PRIVATE KEY-----

Mas isso requer algo assim:

-----BEGIN RSA PRIVATE KEY-----
...
...
-----END RSA PRIVATE KEY-----

Observe a BEGIN RSA PRIVATE KEY

Para ver o log:

sudo vim /var/log/mysql/error.log

Espero que isto ajude.

user194410
fonte
Eu tive um problema semelhante no meu Ubunbtu 12.04 com o mysql 5.5.34, onde todos os arquivos pem eram legíveis por todos e ainda assim me deram o mesmo problema. Mas essa resposta combinada com a mudança de proprietário fez o truque.
Tommy Andersen
Não adicione manualmente "RSA" - isso suprimirá o erro, mas o SSL não funcionará (você receberá outro erro, " Erro de conexão SSL: incompatibilidade de versão do protocolo "). Converter de PKCS # 8 a PKCS # 1 formato em vez de usaropenssl rsa
rustyx
3

Eu tive os mesmos problemas no dia 12.04, mas foi de fato o que causou os problemas.

Encontrei uma solução nos Fóruns do Ubuntu , movendo os .pemarquivos para /etc/mysqlresolvê-lo.

Você também pode alterar a configuração do apparmor em /etc/apparmor.d/usr.sbin.mysqld.

user273610
fonte
Este foi o problema que tive também
Jonathan
isso é um erro de digitação? você quer dizer "mover arquivos pem para" em vez de "mover arquivos pem para"? Desculpe por ser tão pedante, mas eu tenho um pouco confuso
knocte
1

Certifique-se de que o usuário que está executando o processo mysqld tenha acesso de leitura às chaves e arquivos de certificado. Se você iniciar o MySQL usando a conta "mysql", você:

/etc/mysql$ chown mysql:mysql *.pem
/etc/mysql$ ls -l *.pem
-rwxrwx--- 1 mysql mysql 1631 2013-09-16 14:27 ca-cert.pem
-rwxrwx--- 1 mysql mysql 1281 2013-09-16 14:27 server-cert.pem
-rwxrwx--- 1 mysql mysql 1679 2013-09-16 14:27 server-key.pem

Caso contrário, você poderá obter o seguinte em seu log de erros:

SSL error: Unable to get certificate from '/etc/mysql/server-cert.pem'
130916 13:32:25 [Warning] Failed to setup SSL
130916 13:32:25 [Warning] SSL error: Unable to get certificate
Isabi
fonte
Ótimo. Mas como isso poderia ser feito? Dê um tempo e explicar melhor, dando mais informações :)
Lucio
Isso combinado com a adição de RSA ao arquivo server-key.pem fez o truque.
Tommy Andersen
1

No Ubuntu 16.04, eu corri mysql_ssl_rsa_setup, podia ver os arquivos no show variáveis como na pergunta, mas have_ssle have_opensslcontinuou a ser DISABLED.

A solução foi chown mysql.mysql /var/lib/mysql/*.pem. Como alternativa, suponho que se você executar o mysql_ssl_rsa_setup como usuário do mysql, ele criará os arquivos com as permissões corretas.

Craig Wright
fonte
A pergunta tem quatro anos e dois meses ... É improvável que o OP responda à sua resposta.
WinEunuuchs2Unix
1
Publiquei isso simplesmente como um serviço para futuros leitores, porque este é um dos principais resultados de pesquisa do Google para esse problema e nada que eu tenha lido ajudou a resolver o meu problema. O valor desta resposta referente ao estado do mundo no Ubuntu 12.04 e até 14.04 está perdendo relevância.
Craig Wright
@ WinEunuuchs2Unix Talvez não seja o OP, mas aqui estou eu, quase dois anos depois, procurando exatamente essa resposta. Então, obrigado Craig!
Oldskool
0

O arquivo de chave privada deve se parecer (formato PKCS # 1):

-----BEGIN RSA PRIVATE KEY-----
. . .
-----END RSA PRIVATE KEY-----

Se sua chave privada começar com:

-----BEGIN PRIVATE KEY-----

(Formato PKCS # 8), você deve convertê-lo assim:

openssl rsa -in server-key.pem -out server-key.pem

Não adicione manualmente a RSAtag "ausente" " " manualmente, porque o formato é diferente.

rustyx
fonte
-1

As opções de inicialização do SSL devem estar próximas à parte superior do arquivo my.cnf ou podem ser ignoradas. Eu tive problemas ao executar o mysql 5.6 no RHEL 6.4, onde as variáveis ​​SSL estavam sendo ignoradas, eu as tive no final do arquivo my.cnf. Mudei-os para o topo do arquivo (logo abaixo de [mysqld]), reiniciei o servidor e estava tudo bem.

Christine
fonte