Gerando certificado ssl/tls auto-assinado e obtendo (cadeado verde)

Alan Victor Sabado, 10 de Novembro de 2018


Quando precisamos proteger uma aplicação web com ssl/tls, temos várias opções no mercado, tanto pago como gratuito, eu por exemplo, uso os certificados da letsencrypt no meu servidor/blog à bastante tempo. Para aplicações de teste ou locais, uma boa opção é usar certificado auto-assinado, mas de um tempo para cá, os procedimentos de geração de certificado e a importação da CA no navegador não funcionam como deveriam nas versões atuais de alguns navegadores, como o google chrome.

Sempre traz o erro ERR_CERT_COMMON_NAME_INVALID, pelo fato do certificado não cumprir novas exigências de versões atuais de navegadores.

O google chome por exemplo, suspendeu o suporte para commonName dos certificados e exigindo agora o subjectAltName desde o começo de 2017.

Mais detalhes sobre isso: https://groups.google.com/a/chromium.org/forum/m/#!topic/security-dev/IGT2fLJrAeo

Antes de tudo, vale lembrar que esse procedimento é usado para testes de aplicações ou para aplicações locais ou independentes. Para uma aplicação geral com acesso externo, o ideal seria pagar por um certificado ou usar certificados válidos gratuitos.

Para contornar essas novas exigências, precisamos seguir os seguintes passos:

Gerando chave RSA para criação de certificado Raiz:

openssl genrsa -des3 -out ca.key 2048

Gerando certificado Raiz a partir da chave RSA:

openssl req -x509 -new -nodes -key ca.key -sha256 -days 2048 -out ca.pem

Importe a CA ca.pem no navegador

Antes, precisamos criar 2 arquivos com informações para criação do certificado, isso substitui você escrever tudo na linha de comando.

#Arquivo 1: file.csr.conf

[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=BR
ST=PB
L=JP
O=consultalinux
OU=consultalinux
emailAddress=admin@consultalinux.org
CN = localhost

Agora o arquivo de configuração com informações do x509 v3

# Arquivo 2: x509.conf

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = teste.com

Criando uma chave do certificado usando as configurações do file.csr.conf

openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat file.csr.conf )

Solicitando assinatura a partir da CA:

openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.crt -days 1024 -sha256 -extfile x509.conf

Configure seu servidor Web / Virtual Host para usar a server.key e o server.crt, exemplo:

SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key

Levo em consideração que o web server está configurado para escutar na porta 443 e o modulo ssl levantado!