Utilizando SSL e JDBC no JBoss AS 5.1

Postado em Atualizado em

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 no post de hoje.

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 -p123456

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 tables: 1  Open tables: 8  Queries per second avg: 0.42
 --------------

Crie o diretório mysql:

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
 --------------

Agora o SSL está habilitado.

Agora vamos “transformar” os certificados gerado para que eles sejam reconhecidos pelo Java. 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</pre>

Agora no JBoss AS 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.

Espero que tenha ajudado.

Abraços

Fontes:


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s