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
):
- Crie a pasta para nossos certificados:
mkdir C:\mysqlCerts
- 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
- 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"
- 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"
- 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"
- Atualize o arquivo de configuração do MySQL (no Windows, é chamado
my.ini
, nãomy.cnf
como no Linux e nãomy-default.ini
porque o último é um modelo), que normalmente vive emC:\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 .