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

Listar conexões de rede sem netstat