Gerar uma cadeia de certificados usando OpenSSL

Nesse post vou explicar como criar uma cadeia de certificação utilizando apenas o OpenSSL.

É muito comum em ambientes corporativos que se use Autoridades Certificadoras Privadas (Private CAs) para gerar cadeias de certificados para uso interno, normalmente para proteger com SSL/HTTPS sites privados (domínios *.corp, *.local, *.inet, etc.)

Normalmente para isso usamos um serviço de Private CA, como o Microsoft Active Directory Certificate Services (AD CS).

No entanto, para empresas menores que não queiram usar softwares proprietários com custo de licenciamento e que demandem manutenção e gerenciamento, ou então para pequenos projetos e ambientes de teste, podemos utilizar apenas o OpenSSL para gerar toda uma cadeia certificadora.

O primeiro passo é gerar um certificado raiz (Root CA) composto com um par de chaves pública/privada.

openssl req -x509 \
      -sha256 -days 10950 \
      -nodes \
      -newkey rsa:2048 \
      -subj "/CN=rootca.exemplo.corp/O=Empresa XPTO/OU=IT/C=BR/L=Sao Paulo" \
      -keyout rootCA.key -out rootCA.crt

O comando acima vai gerar um par de chaves público/privada (rootCA.crt/rootCA.key) com validade de 30 anos. Este será nosso certificado raiz que será utilizado para assinar/emitir todos os demais certificados.

Em seguida vamos gerar um certificado para ser utilizado em um site fictício. O certificado para esse site vai incluir também um wildcard para subdomínios desse site (*.portal-xpto.exemplo.corp). Isso apenas para mostrar as possibilidades de configuração.

## Gerando a chave privada para o certificado do site
openssl genrsa -out portal-xpto.key 2048

## Gerando o arquivo de configuração que vai ser usado para gerar o CSR do certificado
cat > portal-xpto.csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = BR
ST = Sao Paulo
L = Sao Paulo
O = Grupo Santander
OU = IT
CN = portal-xpto.exemplo.corp
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1=*.portal-xpto.exemplo.corp
EOF

## Gerando o CSR do certificado a partir da configuração
openssl req -new -key devops.key -out portal-xpto.csr -config portal-xpto.csr.conf

## Gerando o arquivo de configuração para o certificado. Será usado pra gerar a chave pública
cat > portal-xpto.cert.conf <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName = @alt_names
[ alt_names ]
DNS.1=*.portal-xpto.exemplo.corp
EOF

## Gerando a chave publica do certificado com validade de 10 anos
openssl x509 -req \
  -in portal-xpto.csr \
  -CA rootCA.crt -CAkey rootCA.key \
  -CAcreateserial -out portal-xpto.crt \
  -days 3650 \
  -sha256 -extfile portal-xpto.cert.conf

Após rodar os comandos explicados acima, teremos os arquivos de chave pública e privada (portal-xpto.crt e portal-xpto.key) que poderão ser utilizados no servidor web (Apache, por exemplo).

Esses certificados estão no formato PEM/base64. Para poder utilizar em servidores Windows com IIS, pode efetuar a conversão para o formato PFX usando o procedimento mostrado aqui.

Agora basta apenas importar a chave pública do certificado raiz (rootCA.crt) nos computadores/dispositivos cliente para que os sites apareçam como confiados (certificado válido).

Todos os certificados criados utilizando o mesmo rootCA.crt serão válidos nos clientes que tiverem esse root instalado.

Comentários

Postagens mais visitadas deste blog

Migrar Replicação do SYSVOL de FRS para DFS

Converter um certificado PEM/CRT + KEY para PFX