Configurando SSL no servidor de aplicação Tomcat/JBOSS – Aceitar conexões SSL somente se o cliente apresentar um certificado válido


Prezados leitores,

há algum tempo não escrevo nada e não alimento o blog com informações.

Quando criei este blog não tinha ideia do quanto é necessário tempo para manter as informações daqui em dia. Como todos vocês devem saber tempo é uma coisa cada vez mais rara e comigo não é diferente. Devemos nos manter sempre atualizados para garantir empregabilidade e competitividade neste nosso mercado de tecnologia e para isto é necessário muito estudo e dedicação e com isto as prioridades surgem e acabamos deixando várias coisas de lado. Bom, agora que justifiquei minha ausência por este longo período vamos ao que interessa realmente.

Neste post irei detalhar e apresentar um “how-to” para configurar seu servidor de aplicações tomcat para aceitar conexões “ssl” (Secure Socket Layer) apenas se o “client” apresentar um certificado válido emitido e assinado pela sua própria “CA” (Certificate authority).

Vamos ao “how-to”:

1 – Criar diretórios:

CA e dentro do diretório CA criar os diretórios private e newcerts

2 – Criar, dentro do diretório CA, a base de dados e o arquivo de índice para os certificados que vamos assinar:

echo ’01’ > serial

touch index.txt

3 – Criar, dentro do diretório CA, um arquivo de configuração openssl.cnf com o seguinte conteúdo:

#

# OpenSSL configuration file.

#

# Establish working directory.

dir = .

[ ca ]

default_ca = MINHA_CA

[ MINHA_CA ]

serial = $dir/serial

database = $dir/index.txt

new_certs_dir = $dir/newcerts

certificate = $dir/cacert.pem

private_key = $dir/private/cakey.pem

default_days = 365

default_md = md5

preserve = no

email_in_dn = no

nameopt = default_ca

certopt = default_ca

policy = policy_match

[ policy_match ]

countryName = match

stateOrProvinceName = match

organizationName = match

organizationalUnitName = optional

commonName = supplied

emailAddress = optional

[ req ]

default_bits = 1024 # Size of keys

default_keyfile = key.pem # nome das chaves que serao criadas

default_md = md5 # algoritmo de digest utilizado

string_mask = nombstr # tipo de caracteres permitidos

distinguished_name = req_distinguished_name

req_extensions = prefeituras_req

[ req_distinguished_name ]

# Variable name Prompt string

#———————- ———————————-

0.organizationName = Organization Name (company)

organizationalUnitName = Organizational Unit Name (department, division)

emailAddress = Email Address

emailAddress_max = 40

localityName = Locality Name (city, district)

stateOrProvinceName = State or Province Name (full name)

countryName = Country Name (2 letter code)

countryName_min = 2

countryName_max = 2

commonName = Common Name (hostname, IP, or your name)

commonName_max = 64

# Valores padrao para evitar digitar tanto.

# Variable name Value

#————————————————————

0.organizationName_default = MINHA_CA

localityName_default = Belo Horizonte

stateOrProvinceName_default = Minas Gerais

countryName_default = BR

[ CA_PARTICULAR ]

basicConstraints = CA:TRUE

subjectKeyIdentifier = hash

authorityKeyIdentifier = keyid:always,issuer:always

[ prefeituras_req ]

basicConstraints = CA:FALSE

subjectKeyIdentifier = hash

Rode dentro do diretório CA:

openssl req -new -x509 -extensions CA_PARTICULAR -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf

Este comando vai gerar dois arquivos, são eles:

Uma chave privada em private/cakey.pem .

Um certificado raiz CA cacert.pem.

Obtendo informações do certificado gerado:

openssl x509 -in cacert.pem -noout -text

Informação sobre datas de criação e expiração:

openssl x509 -in cacert.pem -noout -dates

Informação da finalidade do certificado:

openssl x509 -in cacert.pem -noout -purpose

Criar as requisições de assinatura:

openssl req -new -nodes -out req.pem -config ./openssl.cnf

Este processo irá gerar dois arquivos:

Uma chave privada chamada key.pem

Uma requisição de assinatura de certificados req.pem

Renomear os arquivos acima. Colocar um nome sugestivo:

mv key.pem chave_privada-key.pem

mv req.pem chave_publica-req.pem

certificado_assinado.pemVerificar informações da requisição com o comando abaixo:

openssl req -in chave_publica-req.pem -text -verify -noout

Assinar a requisição:

openssl ca -out certificado_assinado.pem -config ./openssl.cnf -infiles chave_publica-req.pem

Este comando acima atualizou a database CA (index.txt) e produziu dois arquivos:

O certificado certificado_assinado.pem

A cópia do certificado newcerts/01.pem

Gerar o arquivo pkcs12 (pfx) e pkcs7 (JKCES) para a inclusão no servidor de aplicação tomcat ou no browser:

openssl pkcs12 -export -in certificado_assinado.pem -inkey chave_privada-key.pem -out CERTIFICADO-pkcs12.pfx

keytool -genkey -alias MINHA_CA -keyalg RSA -validity 7 -keystore MINHA_CA.jks

keytool -import -alias cacert -keystore MINHA_CA.jks -trustcacerts -file cacert.pem

*Atentar para os certificados usados no comando, todo certificado que for assinado deverá ser inserido neste keystore com o comando (keytool -import -alias certificado1 -keystore MINHA_CA.jks -trustcacerts -file certificado1.pem) para que o tomcat confie no mesmo.

Revogar certificados:

openssl ca -revoke newcerts/cert.pem -config ./openssl.cnf

Configurar TOMCAT/JBOSS:

Edite o arquivo server.xml e adicione/altere a lina como demonstrado abaixo:

Linha necessária no conf do JBOSS e TOMCAT para forçar a solicitação de um certificado válido para estabelecer a conexão:

<Connector acceptCount=”100″ clientAuth=”true” disableUploadTimeout=”true” enableLookups=”false” keystoreFile=”caminho_para_o_arquivo_pfx” keystorePass=”senha” keystoreType=”PKCS12″ maxHttpHeaderSize=”8192″ maxSpareThreads=”75″ maxThreads=”150″ minSpareThreads=”25″ port=”443″ scheme=”https” secure=”true” sslProtocol=”TLS” truststoreFile=”caminho_para_o_arquivo_jks” truststorePass=”senha” truststoreType=”JCEKS”/>

Bom pessoal, espero que seja útil para alguém. Lembro que tive que estudar muito para fazer isto funcionar e para chegar nesta documentação na época em que fui mexer com isto pela primeira vez.

Forte abraço a todos e até a próxima.

Att.

Leonardo Gomes Duarte

Deixe um comentário