Infraestrutura de Chave Pública (PKI) Básica em Criptografia

LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você explorará os fundamentos da Infraestrutura de Chave Pública (PKI - Public Key Infrastructure), o sistema que sustenta grande parte da segurança na internet, incluindo o HTTPS. PKI é um conjunto de papéis, políticas, hardware, software e procedimentos necessários para criar, gerenciar, distribuir, usar, armazenar e revogar certificados digitais, além de gerenciar a criptografia de chave pública.

Você terá experiência prática com a ferramenta de linha de comando openssl para executar as funções centrais de uma PKI. Você atuará como sua própria Autoridade Certificadora (CA), emitirá um certificado para um servidor web, verificará a cadeia de confiança do certificado e, finalmente, revogará o certificado. Todas as operações serão realizadas dentro do diretório ~/project.

Compreendendo os Fundamentos da PKI

Nesta etapa, abordaremos os conceitos fundamentais da PKI. Não há comandos para executar nesta etapa; o objetivo é construir uma base teórica sólida antes de começarmos a prática.

Infraestrutura de Chave Pública (PKI)

PKI é uma estrutura projetada para aumentar a segurança em comunicações eletrônicas. Ela utiliza criptografia de chave pública para vincular chaves públicas às respectivas identidades de usuário por meio de uma Autoridade Certificadora (CA - Certificate Authority). Esse vínculo é estabelecido através de um processo de registro e emissão.

Autoridade Certificadora (CA)

Uma Autoridade Certificadora é uma entidade confiável que emite certificados digitais. A CA atua como uma terceira parte confiável, sendo confiável tanto pelo sujeito (proprietário) do certificado quanto pela parte que confia no certificado. O papel principal da CA é assinar digitalmente e publicar a chave pública vinculada a um determinado usuário.

Certificado Digital

Um certificado digital é um documento eletrônico (frequentemente seguindo o padrão X.509) que contém:

  • A chave pública do proprietário.
  • As informações de identificação do proprietário (como um nome ou nome de host).
  • As informações e a assinatura digital da entidade emissora (CA).
  • Um período de validade (data de início e fim).
  • Um número de série exclusivo.

A assinatura da CA no certificado atesta que a chave pública contida no certificado pertence à entidade nomeada no certificado.

Cadeia de Confiança (Trust Chain)

Uma cadeia de confiança (ou cadeia de certificados) é uma sequência de certificados, começando por um certificado de entidade final (por exemplo, para example.com) e terminando em um certificado de CA Raiz (Root CA).

  1. Certificado de CA Raiz (Root CA Certificate): Este é um certificado autoassinado da autoridade máxima, a CA Raiz. Esses certificados são pré-instalados no "repositório de confiança" (trust store) do seu navegador ou sistema operacional.
  2. Certificado(s) de CA Intermediária (Intermediate CA Certificate(s)): CAs grandes frequentemente usam CAs intermediárias para emitir certificados a usuários finais, protegendo a chave raiz. Um certificado intermediário é assinado pela CA Raiz.
  3. Certificado de Entidade Final (End-Entity Certificate): Este é o certificado emitido para um servidor ou usuário específico. Ele é assinado por uma CA intermediária (ou diretamente pela CA Raiz em configurações mais simples).

Quando seu navegador recebe o certificado de um servidor, ele verifica a assinatura checando o certificado da entidade emissora. Ele segue essa cadeia até atingir uma CA Raiz que já está em seu repositório de confiança. Se a cadeia for válida e todas as assinaturas estiverem corretas, o servidor é considerado confiável.

Na próxima etapa, você criará sua própria CA Raiz.

Criar uma Autoridade Certificadora

Nesta etapa, você atuará como uma Autoridade Certificadora (CA) e criará seus componentes fundamentais: uma chave privada e um certificado raiz autoassinado. Todos os comandos serão executados no terminal, e todos os arquivos serão criados no seu diretório atual, ~/project.

Primeiro, gere a chave privada da CA. Esta chave é o segredo mais crítico da PKI; ela é usada para assinar todos os certificados emitidos pela CA.

openssl genpkey -algorithm RSA -out ca.key

Em seguida, você criará um certificado raiz autoassinado. Um certificado raiz é autoassinado porque é a âncora final de confiança; não há autoridade superior para assiná-lo.

Execute o seguinte comando para gerar o certificado. Usamos o argumento -subj para fornecer as informações do sujeito do certificado de forma não interativa.

openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.pem -subj "/C=US/ST=California/L=MountainView/O=MyLab/CN=MyLabRootCA"

Vamos analisar este comando:

  • req: Utilidade para geração de Solicitação de Assinatura de Certificado (CSR - Certificate Signing Request) e certificado.
  • -x509: Gera um certificado autoassinado em vez de uma CSR.
  • -new: Cria um novo certificado.
  • -nodes: "No DES", o que significa que a chave privada não será criptografada com uma senha (passphrase). Isso é feito por simplicidade em nosso laboratório.
  • -key ca.key: Especifica a chave privada a ser usada para assinatura.
  • -sha256: Usa o algoritmo de hash SHA-256 para a assinatura.
  • -days 365: Define o período de validade do certificado para 365 dias.
  • -out ca.pem: Especifica o arquivo de saída para o novo certificado.
  • -subj "/C=.../CN=...": Fornece os detalhes do sujeito. CN (Common Name) é a identidade principal, que para uma CA é o seu nome.

Agora você tem uma chave privada de CA (ca.key) e um certificado raiz (ca.pem). Você pode inspecionar o conteúdo do seu novo certificado de CA:

openssl x509 -in ca.pem -text -noout

Percorra a saída e observe que os campos Issuer (Emissor) e Subject (Sujeito) são idênticos, confirmando que ele é autoassinado.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            ...
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = California, L = MountainView, O = MyLab, CN = MyLabRootCA
        Validity
            Not Before: ...
            Not After : ...
        Subject: C = US, ST = California, L = MountainView, O = MyLab, CN = MyLabRootCA
        Subject Public Key Info:
            ...

Emitir um Certificado de Servidor

Nesta etapa, você simulará um proprietário de servidor solicitando um certificado. Você gerará uma chave privada e uma Solicitação de Assinatura de Certificado (CSR - Certificate Signing Request) para o servidor e, em seguida, usará sua CA da etapa anterior para assinar a CSR e emitir um certificado válido.

Primeiro, gere uma chave privada para o servidor. Esta chave deve ser mantida em segredo no próprio servidor.

openssl genpkey -algorithm RSA -out server.key

Em seguida, crie uma Solicitação de Assinatura de Certificado (CSR). Uma CSR é um bloco de texto codificado contendo a chave pública e outras informações que serão incluídas no certificado, como o nome da organização e o nome de domínio. A CSR é enviada à CA para assinatura.

openssl req -new -key server.key -out server.csr -subj "/C=US/ST=California/L=MountainView/O=MyWebServer/CN=example.com"

Observe que, para um certificado de servidor, o CN (Common Name) deve corresponder ao nome de domínio do servidor, neste caso, example.com.

Agora, agindo como a CA, você assinará a CSR do servidor (server.csr) com a chave privada da sua CA (ca.key). Esta ação cria o certificado final do servidor (server.crt).

openssl x509 -req -in server.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.crt -days 300 -sha256

Vamos revisar as novas opções:

  • x509 -req: Isso instrui o OpenSSL a processar uma CSR.
  • -in server.csr: O arquivo CSR de entrada.
  • -CA ca.pem: O certificado da CA a ser usado como emissor.
  • -CAkey ca.key: A chave privada da CA para assinatura.
  • -CAcreateserial: Isso cria e gerencia um arquivo de número de série (ca.srl), que é necessário para garantir que cada certificado emitido pela CA tenha um número de série exclusivo.
  • -days 300: A validade para o certificado do servidor. Isso deve ser menor do que a validade do certificado da CA.

Finalmente, inspecione o certificado de servidor recém-criado.

openssl x509 -in server.crt -text -noout

Na saída, observe os campos Issuer (Emissor) e Subject (Sujeito). O Issuer deve ser sua CA (MyLabRootCA), e o Subject deve ser seu servidor (example.com). Isso confirma que o certificado foi emitido corretamente pela sua CA.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: ...
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = California, L = MountainView, O = MyLab, CN = MyLabRootCA
        Validity
            Not Before: ...
            Not After : ...
        Subject: C = US, ST = California, L = MountainView, O = MyWebServer, CN = example.com
        ...
    Signature Algorithm: sha256WithRSAEncryption
         ...

Verificar Cadeia de Certificados

Nesta etapa, você aprenderá como verificar uma cadeia de certificados. Este é o processo que um cliente (como um navegador web) executa para determinar se o certificado de um servidor é confiável. O cliente verifica se o certificado foi assinado por uma CA em que ele confia.

Você pode usar o comando openssl verify para realizar essa verificação. Você precisa informar ao OpenSSL quais CAs você confia, fornecendo o certificado raiz.

Execute o seguinte comando para verificar o server.crt em relação ao seu certificado raiz ca.pem:

openssl verify -CAfile ca.pem server.crt

A saída deve ser:

server.crt: OK

Este status OK confirma que:

  1. O certificado server.crt foi de fato assinado pela chave privada correspondente à chave pública em ca.pem.
  2. O certificado não expirou.

Agora, vamos ver o que acontece se o verificador não tiver nossa CA na sua lista de CAs confiáveis. Você pode simular isso executando o comando verify sem a opção -CAfile.

openssl verify server.crt

Desta vez, o comando falhará com um erro semelhante a este:

C = US, ST = California, L = MountainView, O = MyWebServer, CN = example.com
error 20 at 0 depth lookup: unable to get local issuer certificate
error server.crt: verification failed

O erro "unable to get local issuer certificate" (incapaz de obter o certificado do emissor local) significa que o sistema não conseguiu encontrar o certificado do emissor (MyLabRootCA) em seu repositório de confiança padrão (trust store). Isso demonstra por que é essencial que os clientes tenham o certificado da CA raiz para estabelecer uma cadeia de confiança.

Simular Revogação de Certificado

Nesta etapa, você aprenderá como revogar um certificado. A revogação é um processo crítico para quando a chave privada de um certificado é comprometida, ou o certificado não é mais necessário antes de sua expiração natural. Isso é gerenciado usando uma Lista de Revogação de Certificados (CRL - Certificate Revocation List).

Uma CRL é uma lista assinada digitalmente, emitida por uma CA, que contém os números de série de todos os certificados que ela revogou. Os clientes podem baixar a CRL para verificar se um certificado que receberam ainda é válido.

Para gerenciar a revogação, o openssl precisa de um pequeno arquivo de configuração para saber onde encontrar os arquivos de banco de dados da CA (index.txt e serial). O script de configuração para este laboratório já criou o diretório necessário (my-ca) e os arquivos. Agora, crie o arquivo de configuração.

Use o comando cat para criar my-ca.conf:

cat << EOF > my-ca.conf
[ ca ]
default_ca = CA_default

[ CA_default ]
dir = ./my-ca
database = \$dir/index.txt
serial = \$dir/serial
private_key = ca.key
certificate = ca.pem
default_md = sha256
policy = policy_anything
crl_extensions = crl_ext
default_crl_days = 30

[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional

[ crl_ext ]
authorityKeyIdentifier=keyid:always
EOF

Este arquivo de configuração informa ao OpenSSL como operar como uma Autoridade Certificadora. Veja o que cada seção faz:

  • default_ca = CA_default: Aponta para a seção de configuração principal da CA.
  • dir = ./my-ca: Diretório de trabalho da CA para arquivos de banco de dados
  • database = $dir/index.txt: Banco de dados de certificados (rastreia certificados emitidos/revogados)
  • serial = $dir/serial: Arquivo de número de série para IDs de certificado exclusivos
  • private_key = ca.key: Chave privada da CA para assinar certificados
  • certificate = ca.pem: O próprio certificado da CA
  • default_md = sha256: Algoritmo de hash para assinaturas (SHA-256)
  • policy = policy_anything: Regras de validação de certificado
  • crl_extensions = crl_ext: Opções de formatação da CRL
  • default_crl_days = 30: Período de validade da CRL (30 dias)
  • countryName = optional: Código do país
  • stateOrProvinceName = optional: Estado/província
  • localityName = optional: Cidade/localização
  • organizationName = optional: Nome da organização
  • organizationalUnitName = optional: Departamento
  • commonName = supplied: Nome do domínio/servidor (obrigatório)
  • emailAddress = optional: Endereço de e-mail
  • authorityKeyIdentifier=keyid:always: Inclui o identificador da CA nas CRLs para verificação

Este arquivo de configuração é o "manual de operações" da sua CA. Ele informa ao OpenSSL onde encontrar chaves, como armazenar certificados e quais regras seguir para emitir e revogar certificados.

Agora, revogue o certificado do servidor (server.crt). Este comando procurará o número de série do certificado e o marcará como revogado no arquivo de banco de dados index.txt.

openssl ca -config my-ca.conf -revoke server.crt

Você verá uma saída confirmando a revogação.

Após a revogação, você deve gerar e publicar uma CRL atualizada.

openssl ca -config my-ca.conf -gencrl -out my-ca.crl

Isso cria o arquivo my-ca.crl, que contém a lista de certificados revogados.

Finalmente, vamos tentar verificar o certificado do servidor novamente, mas desta vez, também forneceremos a CRL. Um processo de verificação adequado deve verificar a revogação.

openssl verify -CAfile ca.pem -CRLfile my-ca.crl -crl_check server.crt

O comando agora falha com uma mensagem clara:

C = US, ST = California, L = MountainView, O = MyWebServer, CN = example.com
error 23 at 0 depth lookup: certificate revoked
error server.crt: verification failed

O erro "certificate revoked" (certificado revogado) confirma que nosso processo de revogação foi bem-sucedido. O cliente, ao verificar a CRL, identificou corretamente que o certificado para example.com não é mais confiável.

Resumo

Parabéns! Você concluiu com sucesso este laboratório sobre os fundamentos da Infraestrutura de Chave Pública (PKI - Public Key Infrastructure). Você adquiriu experiência prática com as operações fundamentais que protegem as comunicações digitais.

Neste laboratório, você aprendeu a:

  • Entender os conceitos centrais de PKI, Autoridades Certificadoras (CAs) e cadeias de confiança.
  • Criar sua própria CA Raiz simples, gerando uma chave privada e um certificado autoassinado.
  • Emitir um certificado de servidor assinando uma Solicitação de Assinatura de Certificado (CSR - Certificate Signing Request) com a chave da sua CA.
  • Verificar a cadeia de confiança de um certificado usando o comando openssl verify.
  • Revogar um certificado e confirmar seu status de revogado, gerando e utilizando uma Lista de Revogação de Certificados (CRL - Certificate Revocation List).

Estas habilidades são os blocos de construção para gerenciar sistemas seguros e entender como a confiança é estabelecida na internet.