Olá,
Já precisei muitas vezes habilitar o connector HTTPS no JBoss para utilizar conexões seguras ( SSL ) mas nunca havia utilizado em conexões JDBC e é sobre isso que vamos falar nesse artigo.
A primeira coisa a ser feita é verificar se o banco de dados utilizado fornece suporte a SSL.
Para os nossos testes vamos utilizar o MySQL presumo que você já o tenha instalado.
Realize login no MySQL:
mysql -uroot -p mypassword
Verifique se o suporte ao SSL está habilitado:
mysql> show variables like "%ssl%"; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.00 sec)
Como podemos visualizar “DISABLED ” significa que o MySQL suporta SSL mas está desabilitado. Para mais informações execute:
mysql> \s -------------- mysql Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1 Connection id: 3 Current database: Current user: root@localhost SSL: Not in use Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.1.61 Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 3 min 54 sec Threads: 1 Questions: 10 Slow queries: 0 Opens: 15 Flush tabl
Crie o diretório mysql para armazenar os certificados:
mkdir -p /etc/mysql
Entre no diretório /etc/mysql e execute os comandos abaixo para gerar o certificado:
openssl genrsa -out ca-key.pem 2048; openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem; openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem; openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem; openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem; openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;
Edite o arquivo de configuração do MySQL:
vim /etc/my.cnf
Adicione as informações do certificado:
[client] ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/client-cert.pem ssl-key=/etc/mysql/client-key.pem [mysqld] ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem
Restart o MySQL:
service mysqld restart
Realize login novamente no MySQL e verifique se o suporte ao SSL foi habilitado:
mysql> show variables like "%ssl%"; +---------------+----------------------------+ | Variable_name | Value | +---------------+----------------------------+ | have_openssl | YES | | have_ssl | YES | | 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 | +---------------+----------------------------+ 7 rows in set (0.01 sec) mysql> \s -------------- mysql Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1 Connection id: 2 Current database: Current user: root@localhost SSL: Cipher in use is DHE-RSA-AES256-SHA Current pager: stdout Using outfile: '' Using delimiter: ; Server version: 5.1.61 Source distribution Protocol version: 10 Connection: Localhost via UNIX socket Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 UNIX socket: /var/lib/mysql/mysql.sock Uptime: 8 min 32 sec Threads: 1 Questions: 7 Slow queries: 0 Opens: 15 Flush tables: 1 Open tables: 8 Queries per second avg: 0.13 --------------
O SSL está habilitado.
Agora vamos “transformar” os certificados gerado para que eles sejam reconhecidos pelo Java / JBoss. Execute os comandos abaixo:
PKCS12
openssl pkcs12 -export -out cert-and-key.p12 -in client-cert.pem -inkey client-key.pem openssl pkcs12 -export -out cert-and-key-with-ca.p12 -in client-cert.pem -inkey client-key.pem -CAfile ca-cert.pem -chain openssl pkcs12 -export -out cacert.p12 -in ca-cert.pem -nokeys
JKS
keytool -importkeystore -destkeystore cert-and-key-with-ca.jks -srckeystore cert-and-key-with-ca.p12 -srcstoretype PKCS12 keytool -keystore cacert-added-then-cert-nokey.jks -import -file ca-cert.pem -alias cacert keytool -keystore cacert-added-then-cert-nokey.jks -import -file client-cert.pem -alias cert keytool -keystore cacert-added-then-cert-withkey.jks -import -file ca-cert.pem -alias cacert keytool -destkeystore cacert-added-then-cert-withkey.jks -importkeystore -srckeystore cert-and-key.p12 -srcstoretype PKCS12
No JBoss vamos adicionar as propriedades ao data source que permitem utilizar as conexões seguras fornecidas pelo banco de dados.
Em JBOSS_HOME/server/<config>/deploy crie o arquivo mysql-ds e deixe-o como abaixo:
<datasources> <local-tx-datasource> <jndi-name>MySqlDS</jndi-name> <connection-url>jdbc:mysql://localhost:3306/test</connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password>123456</password> <track-statements>true</track-statements> <connection-property name="verifyServerCertificate">false</connection-property> <connection-property name="requireSSL">true</connection-property> <connection-property name="useSSL">true</connection-property> <connection-property name="javax.net.ssl.trustStore">/etc/mysql/cert-and-key-with-ca.jks</connection-property> <connection-property name="javax.net.ssl.trustStorePassword">123456</connection-property> <connection-property name="javax.net.ssl.trustStoreType">JKS</connection-property> <connection-property name="javax.net.ssl.keyStore">/etc/mysql/cacert-added-then-cert-withkey.jks</connection-property> <connection-property name="javax.net.ssl.keyStorePassword">123456</connection-property> <connection-property name="javax.net.ssl.keyStoreType">JKS</connection-property> <metadata> <type-mapping>mySQL</type-mapping> </metadata> </local-tx-datasource> </datasources>
Finalmente nossas conexões JDBC que utilizam o Data Source do JBoss estão trafegando em canal seguro.
Esse tipo de configuração é bem útil para ambientes que existem dados altamente sensíveis.
Comments