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