Ativando o SSL no MySQL ao usar o Windows como servidor e cliente

1

Eu queria ativar o SSL nas conexões para o meu servidor MySQL que eu instalei em uma máquina Windows, então eu pesquisei "usar windows ssl mysql".

O primeiro resultado é este guia simples e direto .

Da aparência, parece o guia que eu precisava. No entanto:

  • Depois de seguir as etapas, não funciona.
  • Depois de ler mais profundamente alguns dos links que ele referencia (como os bugs que ele enviou para o cliente aceitando sinalizadores --ssl-key vazios), alguns deles são obsoletos (porque eu estou usando uma versão do MySQL que não tem esses problemas).
  • Depois de solucionar meus problemas, descobri que há algumas ambiguidades e coisas que poderiam ter sido melhoradas, mas não posso sugerir edições porque o autor fechou os comentários em seu blog (ou entrada de blog).

Portanto, acho que esse tipo de guia é melhor se colocado em um site como o serverfault.com, onde qualquer um pode propor alterações nas respostas posteriormente.

Estou, então, disposto a aceitar uma resposta a essa pergunta, que é apenas uma cópia + pasta deste blog, para que eu possa propor alterações posteriores a ela. E da próxima vez que eu precisar configurar o SSL no meu servidor MySQL, eu não encontrarei os mesmos truques e eu tenho um guia direto e completo a ser seguido. E espero que isso fique mais alto depois pelo google. Obrigado

    
por user1623521 14.06.2016 / 15:29

1 resposta

5

Normalmente, os binários para o servidor MySQL para Windows que você pode baixar do site MySQL, foram compilados com suporte a SSL. Isso significa que o servidor suporta esse recurso, mas não está ativado por padrão. Para verificar novamente que este é o caso, podemos nos conectar à nossa instância por meio de mysql -uroot -p (no Windows, mysql.exe está localizado em C:\Program Files\MySQL\MySQL Server 5.7\bin ) e executar:

mysql> show global variables like '%ssl%';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ...           | ...      |

Ok, o SSL está disponível, mas DISABLED por enquanto (se tivesse um 'NO' no valor, o SSL não estava habilitado para nossos binários, precisaríamos procurar novos). Nosso objetivo é configurar o MySQL primeiro para que ele mostre um 'YES' nesses valores.

Você também pode ver se o SSL está sendo usado para a conexão atual emitindo uma consulta status :

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          551
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 13 days 22 hours 23 min 24 sec

(Isso se tornará útil quando habilitarmos o SSL no servidor, mas queremos ainda ter certeza de que o SSL está sendo usado para um usuário / conexão em particular.)

Agora que estamos dentro deste console mysql, vamos criar o usuário que usará o modo SSL (o nome de usuário é ssluser , a senha é sslpassword ):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'ssluser'@'localhost' IDENTIFIED BY 'sslpassword' REQUIRE SSL;
mysql> FLUSH PRIVILEGES;

O equivalente também pode ser feito para um usuário existente, para forçá-lo a usar o SSL (e não permitir que ele se conecte se não o fizer), emitindo a seguinte consulta:

mysql> UPDATE mysql.user SET ssl_type = 'ANY' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

(e para recuperá-lo para permitir que ele se conecte sem SSL seria:)

mysql> UPDATE mysql.user SET ssl_type = '' WHERE user = 'someUser';
mysql> FLUSH PRIVILEGES;

Agora você precisa ter o OpenSSL instalado / disponível em sua máquina. Muitos já têm isso, certamente a maioria dos Linux de qualquer maneira. Para o Windows, você pode fazer o download em aqui .

Agora que está fora do caminho, você está basicamente analisando um processo de 6 etapas, que precisa ser executado a partir de uma linha de comando ( cmd ) da pasta onde instalamos o OpenSSL (por exemplo, C:\OpenSSL-Win64\bin ):

  1. Crie a pasta para nossos certificados:

mkdir C:\mysqlCerts

  1. Configure a variável de ambiente para a configuração do OpenSSL (porque infelizmente não está configurado por padrão no Windows , no momento da escrita deste artigo:

set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfg

  1. Crie certificados de CA (os dois comandos a seguir criam dois arquivos: ca-cert.pem e ca-key.pem):

openssl genrsa 2048 > "C:\mysqlCerts\ca-key.pem"

openssl req -new -x509 -nodes -days 3600 -key "C:\mysqlCerts\ca-key.pem" > "C:\mysqlCerts\ca-cert.pem"

  1. Criar certificados de servidor (os dois comandos a seguir criam três arquivos: server-cert.pem, server-key.pem e server-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\server-key.pem" > "C:\mysqlCerts\server-req.pem"

openssl x509 -req -in "C:\mysqlCerts\server-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\server-cert.pem"

  1. Crie certificados de cliente (os dois comandos a seguir criam três arquivos: client-cert.pem, client-key.pem e client-req.pem):

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout "C:\mysqlCerts\client-key.pem" > "C:\mysqlCerts\client-req.pem"

openssl x509 -req -in "C:\mysqlCerts\client-req.pem" -days 3600 -CA "C:\mysqlCerts\ca-cert.pem" -CAkey "C:\mysqlCerts\ca-key.pem" -set_serial 01 > "C:\mysqlCerts\client-cert.pem"

  1. Atualize o arquivo de configuração do MySQL (no Windows, é chamado my.ini , não my.cnf como no Linux e não my-default.ini porque o último é um modelo), que normalmente vive em C:\ProgramData\MySQL\MySQL Server 5.7\ (nota: ProgramData is uma pasta oculta), para incluir isso na seção [mysqld] :

ssl-ca = "C:\mysqlCerts\ca-cert.pem"

ssl-cert = "C:\mysqlCerts\server-cert.pem"

ssl-key = "C:\mysqlCerts\server-key.pem"

e reinicie o serviço / servidor mysql.

Agora vamos nos conectar novamente via nosso usuário normal (não o ssluser ) com mysql -uroot -p , e verificar nossas variáveis ssl:

mysql> show global variables like '%ssl%';
+---------------+----------------------------------------+
| Variable_name | Value                                  |
+---------------+----------------------------------------+
| have_openssl  | YES                                    |
| have_ssl      | YES                                    |
| ssl_ca        | C:\mysqlCerts\ca-cert.pem              |
| ssl_capath    |                                        |
| ssl_cert      | C:\mysqlCerts\server-cert.pem          |
| ssl_cipher    |                                        |
| ssl_crl       |                                        |
| ssl_crlpath   |                                        |
| ssl_key       | C:\mysqlCerts\server-key.pem           |
+---------------+----------------------------------------+

Se você não tem algo como o acima, algo não funcionou bem. Talvez você tenha atribuído uma frase secreta ao criar os certificados / chaves? Se for esse o caso, o MySQL não pode usar aqueles sem a frase secreta. Podemos removê-lo, emitindo este comando openssl:

openssl rsa -in "C:\mysqlCerts\server-key.pem" -out "C:\mysqlCerts\server-key-ppless.pem"

Em seguida, altere my.ini novamente para apontar para esse novo arquivo -ppless.pem -suffixed. Reinicie o mysql novamente, conecte-se novamente e verifique se have_ssl é YES agora. É isso? Verifique novamente, mostrando o status:

mysql> status
--------------
mysql.exe  Ver 14.14 Distrib 5.7.12, for Win64 (x86_64)

Connection id:          2
Current database:
Current user:           root@localhost
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
Using delimiter:        ;
Server version:         5.7.12-log MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    cp850
Conn.  characterset:    cp850
TCP port:               3306
Uptime:                 46 sec

Agora o SSL tem algo nele! Vamos nos conectar com nosso novo ssluser , agora com o - sinalizador -ssl-mode :

mysql.exe -ussluser -p --ssl-mode=REQUIRED

Se ele se conectar, terminaremos.

(Mas para checar, você pode tentar se conectar sem SSL para ver se ele rejeita sua conexão, desta forma:)

mysql.exe -ussluser -p --ssl=0

Agora você deve configurar seu aplicativo para usar seu conector via SSL. Por exemplo, se você estiver usando o .NET Connector, verifique a documentação aqui .

    
por 15.06.2016 / 08:35