Version 1

    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.