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:
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
):
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
):
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:
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
):
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
):
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:
Ver Entradas de Certificados
Este comando permite visualizar o conteúdo de um certificado (domain.crt
) em texto simples:
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
):
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
):
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:
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
):
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
):
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
):
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:
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
):
Converter PEM para PKCS7
Use este comando se desejar adicionar certificados PEM (dominio.crt
e ca-chain.crt
) a um arquivo PKCS7 (dominio.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:
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
):
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).