Essenciais do OpenSSL: Trabalhando com Certificados SSL, Chaves Privadas e CSRs

Introdução

O OpenSSL é uma ferramenta de linha de comando versátil que pode ser usada para uma grande variedade de tarefas relacionadas à Infraestrutura de Chave Pública (PKI) e HTTPS (HTTP sobre TLS). Este guia no estilo de folha de dicas fornece uma referência rápida aos comandos do OpenSSL que são úteis em cenários comuns do dia a dia. Isso inclui exemplos do OpenSSL para gerar chaves privadas, solicitações de assinatura de certificado e conversão de formato de certificado. Não abrange todos os usos do OpenSSL.

Como Usar Este Guia:

  • Se você não está familiarizado com solicitações de assinatura de certificado (CSRs), leia a primeira seção
  • Além da primeira seção, este guia está em formato de folha de dicas: uma lista de trechos de linha de comando autocontidos
  • Vá para qualquer seção relevante para a tarefa que você está tentando completar (Dica: use o menu Conteúdo ou a função Localizar do seu navegador)
  • A maioria dos comandos são trechos de linha única que foram expandidos para várias linhas (usando o símbolo \) para clareza

Sobre Solicitações de Assinatura de Certificado (CSRs)

Se deseja obter um certificado SSL de uma autoridade de certificação comercial (CA), é necessário gerar um pedido de assinatura de certificado (CSR). Um CSR consiste principalmente na chave pública de um par de chaves e em algumas informações adicionais. Ambos esses componentes são inseridos no certificado quando ele é assinado.

Sempre que gerar um CSR, será solicitado a fornecer informações sobre o certificado. Essas informações são conhecidas como Nome Distinto (DN). Um campo importante no DN é o Nome Comum (CN), que deve ser o Nome de Domínio Totalmente Qualificado (FQDN) exato do host que pretende usar com o certificado. Também é possível pular as solicitações interativas ao criar um CSR passando as informações via linha de comando ou de um arquivo.

Os outros itens em um DN fornecem informações adicionais sobre sua empresa ou organização. Se estiver adquirindo um certificado SSL de uma autoridade de certificação, geralmente é necessário que esses campos adicionais, como “Organização”, reflitam com precisão os detalhes de sua organização.

Aqui está um exemplo de como será a solicitação de informações do CSR:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

Se deseja responder não interativamente à solicitação de informações do CSR, pode fazer isso adicionando a opção -subj a quaisquer comandos OpenSSL que solicitem informações do CSR. Aqui está um exemplo da opção, usando as mesmas informações exibidas no bloco de código acima:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Agora que você entende os CSRs, sinta-se à vontade para navegar para a seção deste guia que cubra suas necessidades de OpenSSL.

Gerando CSRs

Esta seção aborda comandos OpenSSL relacionados à geração de CSRs (e chaves privadas, se estas ainda não existirem). CSRs podem ser usadas para solicitar certificados SSL de uma autoridade de certificação.

Tenha em mente que você pode adicionar as informações do CSR de forma não interativa com a opção -subj, mencionada na seção anterior.

Gerar uma Chave Privada e um CSR

Use este método se desejar usar HTTPS (HTTP sobre TLS) para proteger seu servidor web Apache HTTP ou Nginx, e se quiser usar uma Autoridade de Certificação (CA) para emitir o certificado SSL. O CSR gerado pode ser enviado para uma CA para solicitar a emissão de um certificado SSL assinado pela CA. Se sua CA suportar SHA-2, adicione a opção -sha256 para assinar o CSR com SHA-2.

Este comando cria uma chave privada de 2048 bits (domain.key) e um CSR (domain.csr) do zero:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

Responda à solicitação de informações do CSR para concluir o processo.

A opção -newkey rsa:2048 especifica que a chave deve ter 2048 bits, gerada usando o algoritmo RSA. A opção -nodes especifica que a chave privada não deve ser criptografada com uma frase secreta. A opção -new, que não está incluída aqui mas é implícita, indica que um CSR está sendo gerado.

Gerar um CSR a partir de uma Chave Privada Existente

Use este método se você já tiver uma chave privada que gostaria de usar para solicitar um certificado de uma AC.

Este comando cria um novo CSR (domain.csr) com base em uma chave privada existente (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

Responda às informações do CSR solicitadas para concluir o processo.

A opção -key especifica uma chave privada existente (domain.key) que será usada para gerar um novo CSR. A opção -new indica que um CSR está sendo gerado.

Gerar um CSR a partir de um Certificado e Chave Privada Existente

Use este método se quiser renovar um certificado existente, mas você ou sua CA não tiverem o CSR original por algum motivo. Basicamente, isso evita que você tenha que digitar novamente as informações do CSR, pois extrai essas informações do certificado existente.

Este comando cria um novo CSR (dominio.csr) com base em um certificado existente (dominio.crt) e chave privada (dominio.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

A opção -x509toreq especifica que você está usando um certificado X509 para fazer um CSR.

Gerando Certificados SSL

Se desejar usar um certificado SSL para proteger um serviço, mas não precisar de um certificado assinado por uma CA, uma solução válida (e gratuita) é assinar seus próprios certificados.

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

Esta seção abrange comandos do OpenSSL relacionados à geração de certificados autoassinados.

Gerar um Certificado Autoassinado

Use este método se quiser usar HTTPS (HTTP sobre TLS) para proteger seu servidor web Apache HTTP ou Nginx e não precisar que seu certificado seja assinado por uma CA.

Este comando cria uma chave privada de 2048 bits (domain.key) e um certificado autoassinado (domain.crt) a partir do zero:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

Responda à solicitação de informações CSR para concluir o processo.

A opção -x509 diz ao req para criar um certificado autoassinado. A opção -days 365 especifica que o certificado será válido por 365 dias. Um CSR temporário é gerado para reunir informações a serem associadas ao certificado.

Gerar um Certificado Autoassinado a partir de uma Chave Privada Existente

Use este método se já tiver uma chave privada com a qual deseja gerar um certificado autoassinado.

Este comando cria um certificado autoassinado (domain.crt) a partir de uma chave privada existente (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

Responda à solicitação de informações CSR para concluir o processo.

A opção -x509 diz ao req para criar um certificado autoassinado. A opção -days 365 especifica que o certificado será válido por 365 dias. A opção -new habilita a solicitação de informações CSR.

Gerar um Certificado Autoassinado a partir de uma Chave Privada e CSR Existente

Use este método se já tiver uma chave privada e CSR, e desejar gerar um certificado autoassinado com eles.

Este comando cria um certificado autoassinado (dominio.crt) a partir de uma chave privada existente (dominio.key) e (dominio.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

A opção -days 365 especifica que o certificado será válido por 365 dias.

Visualizar Certificados

Os arquivos de Certificado e CSR estão codificados no formato PEM, que não é facilmente legível por humanos.

Esta seção abrange comandos OpenSSL que irão produzir as entradas reais dos arquivos codificados em PEM.

Visualizar Entradas CSR

Este comando permite visualizar e verificar o conteúdo de um CSR (dominio.csr) em texto simples:

  1. openssl req -text -noout -verify -in domain.csr

Ver Entradas de Certificados

Este comando permite visualizar o conteúdo de um certificado (domain.crt) em texto simples:

  1. openssl x509 -text -noout -in domain.crt

Verificar se um Certificado foi Assinado por uma CA

Utilize este comando para verificar se um certificado (domain.crt) foi assinado por uma CA específica (ca.crt):

  1. openssl verify -verbose -CAFile ca.crt domain.crt

Chaves Privadas

Esta seção abrange comandos do OpenSSL específicos para criar e verificar chaves privadas.

Criar uma Chave Privada

Utilize este comando para criar uma chave privada de 2048 bits protegida por senha (domain.key):

  1. openssl genrsa -des3 -out domain.key 2048

Informe uma senha quando solicitado para concluir o processo.

Verificar uma Chave Privada

Use este comando para verificar se uma chave privada (domain.key) é uma chave válida:

  1. openssl rsa -check -in domain.key

Se a sua chave privada estiver cifrada, você será solicitado a inserir sua frase de senha. Após o sucesso, a chave não cifrada será exibida no terminal.

Verificar se uma Chave Privada Corresponde a um Certificado e CSR

Use estes comandos para verificar se uma chave privada (domain.key) corresponde a um certificado (domain.crt) e CSR (domain.csr):

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

Se a saída de cada comando for idêntica, há uma probabilidade extremamente alta de que a chave privada, o certificado e o CSR estejam relacionados.

Encriptar uma Chave Privada

Este comando recebe uma chave privada não cifrada (unencrypted.key) e gera uma versão cifrada dela (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

Insira a senha desejada para cifrar a chave privada.

Descriptografar uma Chave Privada

Isso leva uma chave privada criptografada (encrypted.key) e gera uma versão descriptografada dela (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

Insira a frase secreta para a chave criptografada quando solicitado.

Converter Formatos de Certificado

Todos os certificados com os quais temos trabalhado têm sido certificados X.509 codificados em PEM ASCII. Existem vários outros tipos de codificação e formatos de contêiner de certificado; algumas aplicações preferem determinados formatos em relação a outros. Além disso, muitos desses formatos podem conter vários itens, como uma chave privada, certificado e certificado de CA, em um único arquivo.

O OpenSSL pode ser usado para converter certificados para e de uma grande variedade desses formatos. Esta seção abordará algumas das conversões possíveis.

Converter PEM para DER

Use este comando se desejar converter um certificado codificado em PEM (domain.crt) para um certificado codificado em DER (domain.der), um formato binário:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

O formato DER é tipicamente usado com Java.

Converter DER para PEM

Use este comando se desejar converter um certificado codificado em DER (dominio.der) para um certificado codificado em PEM (dominio.crt):

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

Converter PEM para PKCS7

Use este comando se desejar adicionar certificados PEM (dominio.crt e ca-chain.crt) a um arquivo PKCS7 (dominio.p7b):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

Observe que você pode usar uma ou mais opções -certfile para especificar quais certificados adicionar ao arquivo PKCS7.

Arquivos PKCS7, também conhecidos como P7B, são tipicamente usados em Keystores Java e no Microsoft IIS (Windows). São arquivos ASCII que podem conter certificados e certificados de CA.

Converter PKCS7 para PEM

Use este comando se desejar converter um arquivo PKCS7 (dominio.p7b) para um arquivo PEM:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

Observe que se o seu arquivo PKCS7 tiver vários itens (por exemplo, um certificado e um certificado intermediário de CA), o arquivo PEM criado conterá todos os itens nele.

Converter PEM para PKCS12

Use este comando se você quiser pegar uma chave privada (domain.key) e um certificado (domain.crt) e combiná-los em um arquivo PKCS12 (domain.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

Você será solicitado a fornecer senhas de exportação, que você pode deixar em branco. Observe que você pode adicionar uma cadeia de certificados ao arquivo PKCS12 concatenando os certificados em um único arquivo PEM (domain.crt) neste caso.

Arquivos PKCS12, também conhecidos como arquivos PFX, são geralmente usados para importar e exportar cadeias de certificados no Microsoft IIS (Windows).

Converter PKCS12 para PEM

Use este comando se você quiser converter um arquivo PKCS12 (domain.pfx) e convertê-lo para o formato PEM (domain.combined.crt):

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

Observe que se o seu arquivo PKCS12 tiver vários itens nele (por exemplo, um certificado e uma chave privada), o arquivo PEM criado conterá todos os itens nele.

Versão do OpenSSL

O comando openssl version pode ser usado para verificar qual versão você está executando. A versão do OpenSSL que você está executando e as opções com as quais foi compilado afetam as capacidades (e às vezes as opções de linha de comando) que estão disponíveis para você.

O seguinte comando exibe a versão do OpenSSL que você está executando e todas as opções com as quais foi compilado:

openssl version -a

Este guia foi escrito usando um binário OpenSSL com os seguintes detalhes (a saída do comando anterior):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Conclusão

Isso deve cobrir como a maioria das pessoas usa o OpenSSL para trabalhar com certificados SSL. Ele tem muitos outros usos que não foram abordados aqui, então sinta-se à vontade para perguntar ou sugerir outros usos nos comentários.

Se você estiver tendo problemas com algum dos comandos, certifique-se de comentar (e incluir a saída da versão do seu OpenSSL).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs