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

Introdução

O OpenSSL é uma ferramenta versátil de linha de comando que pode ser usada para uma grande variedade de tarefas relacionadas à Infraestrutura de Chave Pública (PKI) e HTTPS (HTTP sobre TLS). Este guia em estilo de folha de trapaça fornece uma referência rápida aos comandos do OpenSSL que são úteis em cenários comuns e cotidianos. 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 trapaça: 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 em uma linha e foram expandidos para várias linhas (usando o símbolo \) para maior clareza

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

Se você deseja obter um certificado SSL de uma autoridade de certificação comercial (CA), você deve gerar uma solicitação 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 você gera um CSR, será solicitado a fornecer informações sobre o certificado. Essas informações são conhecidas como Nome Distinguido (DN). Um campo importante no DN é o Nome Comum (CN), que deve ser o exato Nome de Domínio Totalmente Qualificado (FQDN) do host que você 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 o seu negócio ou organização. Se você 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 da 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 você deseja responder de forma não interativa à solicitação de informações do CSR, pode fazê-lo adicionando a opção -subj a quaisquer comandos do 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 CSRs, sinta-se à vontade para navegar para a seção deste guia que aborda suas necessidades do OpenSSL.

Gerando CSRs

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

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 deseja utilizar HTTPS (HTTP sobre TLS) para proteger seu servidor web Apache HTTP ou Nginx e deseja utilizar uma Autoridade Certificadora (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 às solicitações 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 de acesso. 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á possui uma chave privada que gostaria de usar para solicitar um certificado de uma AC.

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

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

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

A opção -key especifica uma chave privada existente (dominio.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 você deseja renovar um certificado existente, mas você ou sua CA não têm o CSR original por algum motivo. Basicamente, isso economiza o trabalho de reentrar as informações do CSR, pois extrai essas informações do certificado existente.

Este comando cria um novo CSR (domain.csr) com base em um certificado existente (domain.crt) e chave privada (domain.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 você deseja usar um certificado SSL para proteger um serviço, mas não precisa 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 OpenSSL relacionados à geração de certificados autoassinados.

Gerar um Certificado Autoassinado

Use este método se você deseja usar HTTPS (HTTP sobre TLS) para proteger seu servidor web Apache HTTP ou Nginx e não requer 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) do zero:

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

Responda às solicitações de informações do 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 coletar informações para associar com o 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 gostaria de 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 às solicitações de informações do 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 do CSR.

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

Use este método se você já possui uma chave privada e CSR e deseja 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

Arquivos de certificado e CSR são codificados no formato PEM, que não é facilmente legível para humanos.

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

Visualizar Entradas de 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

Visualizar Entradas de Certificado

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

Use este comando para verificar se um certificado (domain.crt) foi assinado por um certificado de CA específico (ca.crt):

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

Chaves Privadas

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

Criar uma Chave Privada

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

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

Insira 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 sua chave privada estiver criptografada, você será solicitado a inserir sua frase de acesso. Após o sucesso, a chave descriptografada 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

Isto recebe uma chave privada não criptografada (unencrypted.key) e produz uma versão criptografada dela (encrypted.key):

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

Insira sua frase de acesso desejada para criptografar a chave privada.

Descriptografar uma Chave Privada

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

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

Informe a frase de senha para a chave criptografada quando solicitado.

Converter Formatos de Certificado

Todos os certificados com os quais estivemos trabalhando foram certificados X.509 que estão codificados em PEM ASCII. Existem vários outros tipos de codificação e contêiner de certificado; algumas aplicações preferem certos formatos em detrimento de 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 de e para uma grande variedade desses formatos. Esta seção abordará algumas das conversões possíveis.

Converter PEM para DER

Use este comando se deseja 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 utilizado com Java.

Converter DER para PEM

Utilize este comando se quiser 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

Utilize este comando se quiser 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 utilizados em Keystores Java e Microsoft IIS (Windows). São arquivos ASCII que podem conter certificados e certificados de CA.

Converter PKCS7 para PEM

Utilize este comando se quiser 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 nele (por exemplo, um certificado e um certificado intermediário CA), o arquivo PEM criado conterá todos os itens nele.

Converter PEM para PKCS12

Use este comando se desejar combinar uma chave privada (domain.key) e um certificado (domain.crt) 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 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 tipicamente usados para importar e exportar cadeias de certificados no Microsoft IIS (Windows).

Converter PKCS12 para PEM

Use este comando se desejar 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 compilada 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 ele 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