Product SiteDocumentation Site

10.2. Certificados X.509

Certificados são um importante bloco de construção de muitos serviços de rede construídos sobre protocolos criptográficos quando precisam de alguma forma de autenticação central.
Entre esses protocolos, o SSL (Secure Socket Layer ou Camada de Soquete Seguro) foi inventado pela Netscape para dar segurança às conexões com servidores web. Posteriormente foi padronizado pela IETF sob o acrônimo TLS (Transport Layer Security ou Segurança de Camada de Transporte). Desde então, o TLS continuou a evoluir e hoje em dia o SSL está obsoleto devido a múltiplas falhas de projeto que têm sido descobertas.
O protocolo TLS tem o objetivo principal de fornecer privacidade e integridade de dados entre dois ou mais aplicativos de computador em comunicação. A maior parte dos casos comuns na Internet é a comunicação entre um cliente (por exemplo, um navegador web) e um servidor.
Um par de chaves é necessário para troca de informações, o que envolve uma chave pública que inclua informações sobre a identidade do(a) proprietário(a) e que corresponda à chave privada. A chave privada deve ser mantida em segredo, caso contrário a segurança ficará comprometida. Contudo, qualquer pessoa pode criar um par de chaves, armazenar qualquer identidade nele e fingir ser a identidade de sua escolha. Uma solução envolve o conceito de Autoridade Certificadora (Certification Authority - CA), formalizado pelo padrão X.509. Esse termo cobre uma entidade que possui um par de chaves confiável conhecido como um certificado raiz (root certificate). Esse certificado só é usado para assinar outros certificados (par de chaves) após os passos apropriados terem sido tomados para verificar a identidade armazenada no par de chaves. Aplicações usando o X.509 podem então verificar os certificados apresentados a elas se conhecerem os certificados raiz confiáveis.
Você pode implementar uma CA (como descrito em Seção 10.2.2, “Infraestrutura de Chaves Públicas: easy-rsa), mas se pretende usar o certificado para um site web, deve se basear em um CA confiável. Os preços variam significativamente, mas é possível implementar boa segurança gastando pouco ou nada.

10.2.1. Criando certificados confiáveis grátis

Muitos programas criam e usam certificados "snakeoil" por padrão (veja a barra lateral SEGURANÇA Certificados SSL Snake oil). Felizmente, o pacote certbot junta tudo o que é necessário para criar seu próprio certificado confiável, fornecido pela iniciativa "Lets Encrypt" (veja barra lateral CULTURA Iniciativa Let's Encrypt), que também pode ser usado por agentes de transporte de e-mail (Postfix), por agentes de entrega de e-mail (Dovecot, Cyrus, etc.) e outros serviços de rede.
Os(As) administradores(as) da Falcot só querem criar um certificado para o site web, o qual roda sobre o Apache. Existe uma extensão conveniente do Apache para certbot que automaticamente edita a configuração do Apache para servir o certificado obtido para que eles o usem:
# apt install python3-certbot-apache
[...]
# certbot --apache
aving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): admin@falcot.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:  N

Account registered.

No names were found in your configuration files. Please enter in your domain
name(s) (comma and/or space separated)  (Enter 'c' to cancel): falcot.com

Requesting a certificate for falcot.com
Performing the following challenges:
http-01 challenge for falcot.com
Enabled Apache rewrite module
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/apache2/sites-available/000-default-le-ssl.conf
Enabled Apache socache_shmcb module
Enabled Apache ssl module
Deploying Certificate to VirtualHost /etc/apache2/sites-available/000-default-le-ssl.conf
Enabling available site: /etc/apache2/sites-available/000-default-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Enabled Apache rewrite module
Redirecting vhost in /etc/apache2/sites-enabled/000-default.conf to ssl vhost in /etc/apache2/sites-available/000-default-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://falcot.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=falcot.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/falcot.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/falcot.com/privkey.pem
   Your cert will expire on 2022-06-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
Se você preferir manter o servidor rodando durante a criação do certificado, você pode utilizar a extensão webroot com os argumentos certonly e --webroot para obter o certificado. Você precisará utilizar o argumento --webroot-path (ou a abreviação -w), que deve especificar os arquivos que serão servidos. O comando ficaria do seguinte modo:
# certbot certonly --webroot -w /var/www/html -d www.DOMÍNIO.com -d DOMÍNIO.com
Você precisa reiniciar todos os serviços que estão utilizando os certificados que você criou.
Os certificados criados são chamados de certificados de curto prazo, que são válidos por 90 dias e devem ser renovados a cada 3 meses utilizando o comando certbot renew . Entretanto, não se deve renovar cada certificado manualmente, mas sim automaticamente. Um serviço cron básico é incluído pelo certbot no arquivo /etc/cron.d/certbot. Para assegurar que os certificados podem ser renovados automaticamente, você pode executar certbot renew --dry-run.

10.2.2. Infraestrutura de Chaves Públicas: easy-rsa

Também é possível criar a nossa própria autoridade certificadora (certificate authority - CA), para isso usaremos o algoritmo RSA, amplamente usado em criptografia de chave pública. Trata-se de um “par de chaves”, composto de uma chave privada e uma chave pública. As duas chaves são intimamente ligadas uma a outra, e suas propriedades matemáticas são tais que uma mensagem criptografada com a chave pública só pode ser descriptografada por alguém que conhece a chave privada, o que garante confidencialidade. Na direção oposta, uma mensagem criptografada com a chave privada pode ser descriptografada por qualquer pessoa que saiba a chave pública, o que permite autenticar a origem da mensagem já que apenas alguém com acesso a chave privada poderia gerá-la. Quando associada a uma função de hash digital (MD5, SHA1, ou uma variante mais recente), isso leva a um mecanismo de assinatura que pode ser aplicado a qualquer mensagem.
Como CAs públicos apenas emitem certificados em troca de uma (pesada) taxa, também é possível criar um certificado de autoridade privado dentro da companhia. O pacote easy-rsa provê ferramentas que servem como uma infraestrutura de certificação X.509, implementada como um conjunto de scripts usando o comando openssl.
Os(As) administradores(as) da Falcot Corp usam essa ferramenta para criar os certificados necessários, tanto para servidor quanto para clientes. Isso permite que a configuração de todos os clientes sejam similar já que eles apenas terão de ser configurados para confiar em certificados vindos da CA local da Falcot. Esse CA é o primeiro certificado a ser criado; para esse fim, os(as) administradores(as) configuram um diretório com os arquivos necessários para o CA em um local apropriado, preferencialmente em uma máquina não conectada a rede, de maneira a mitigar o risco da chave privada CA ser roubada.
$ make-cadir pki-falcot
$ cd pki-falcot
Eles então armazenam os parâmetros requeridos dentro do arquivo vars, o qual pode ser descomentado e editado:
$ grep EASYRSA vars
if [ -z "$EASYRSA_CALLER" ]; then
# easyrsa.  More specific variables for specific files (e.g., EASYRSA_SSL_CONF)
#set_var EASYRSA	"${0%/*}"
#set_var EASYRSA_OPENSSL	"openssl"
#set_var EASYRSA_OPENSSL	"C:/Program Files/OpenSSL-Win32/bin/openssl.exe"
#set_var EASYRSA_PKI		"$PWD/pki"
#set_var EASYRSA_TEMP_DIR	"$EASYRSA_PKI"
#set_var EASYRSA_DN	"cn_only"
set_var EASYRSA_REQ_COUNTRY	"FR"
set_var EASYRSA_REQ_PROVINCE	"Loire"
set_var EASYRSA_REQ_CITY	"Saint-Étienne"
set_var EASYRSA_REQ_ORG	"Falcot Corp"
set_var EASYRSA_REQ_EMAIL	"admin@falcot.com"
set_var EASYRSA_REQ_OU		"Certificate authority"
#set_var EASYRSA_KEY_SIZE	2048
#set_var EASYRSA_ALGO		rsa
#set_var EASYRSA_CURVE		secp384r1
#set_var EASYRSA_CA_EXPIRE	3650
#set_var EASYRSA_CERT_EXPIRE	825
#set_var EASYRSA_CRL_DAYS	180
#set_var EASYRSA_CERT_RENEW	30
#set_var EASYRSA_RAND_SN	"yes"
#set_var EASYRSA_NS_SUPPORT	"no"
#set_var EASYRSA_NS_COMMENT	"Easy-RSA Generated Certificate"
#set_var EASYRSA_TEMP_FILE	"$EASYRSA_PKI/extensions.temp"
# when undefined here, default behaviour is to look in $EASYRSA_PKI first, then
# fallback to $EASYRSA for the 'x509-types' dir.  You may override this
#set_var EASYRSA_EXT_DIR	"$EASYRSA/x509-types"
#set_var EASYRSA_KDC_REALM      "CHANGEME.EXAMPLE.COM"
# EASYRSA_PKI or EASYRSA dir (in that order.) NOTE that this file is Easy-RSA
#set_var EASYRSA_SSL_CONF	"$EASYRSA/openssl-easyrsa.cnf"
#set_var EASYRSA_REQ_CN		"ChangeMe"
#set_var EASYRSA_DIGEST		"sha256"
#set_var EASYRSA_BATCH		""
$ vim vars
$ 
Agora preparamos o diretório da infraestrutura de chave pública com a seguinte ordem:
$ ./easyrsa init-pki


init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/debian/pki-falcot/pki

O próximo passo é a criação do próprio par de chaves da CA (as duas partes do par de chaves serão armazenadas sob pki/ca.crt e pki/private/ca.key durante esse passo). Nós podemos adicionar a opção nopass para evitar digitar a senha toda vez que a chave privada for utilizada:
$ ./easyrsa build-ca nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating RSA private key, 2048 bit long modulus (2 primes)
..................+++++
...............................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/debian/pki-falcot/pki/ca.crt

O certificado pode, agora, ser criado, assim como os parâmetros Diffie-Hellman necessários para o lado do servidor em uma conexão SSL/TLS. Eles querem usá-lo como um servidor VPN (veja a seção Seção 10.3, “Rede Privada Virtual”) que é identificado pelo nome DNS vpn.falcot.com; esse nome é reutilizado nos arquivos de chave gerados (keys/vpn.falcot.com.crt para certificado público, keys/vpn.falcot.com.key para chave privada):
$ ./easyrsa gen-req vpn.falcot.com nopass

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating a RSA private key
......................................+++++
..........................................................................+++++
writing new private key to '/home/debian/pki-falcot/pki/easy-rsa-5515.0PwyXl/tmp.g1c6u6'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [vpn.falcot.com]:

Keypair and certificate request completed. Your files are:
req: /home/debian/pki-falcot/pki/reqs/vpn.falcot.com.req
key: /home/debian/pki-falcot/pki/private/vpn.falcot.com.key


$ ./easyrsa sign-req server vpn.falcot.com

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021


You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.

Request subject, to be signed as a server certificate for 825 days:

subject=
    commonName                = vpn.falcot.com


Type the word 'yes' to continue, or any other input to abort.
  Confirm request details: yes
Using configuration from /home/debian/pki-falcot/pki/easy-rsa-5603.87iCIa/tmp.u8r8Fj
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn.falcot.com'
Certificate is to be certified until May 27 15:26:29 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Certificate created at: /home/debian/pki-falcot/pki/issued/vpn.falcot.com.crt


$ ./easyrsa gen-dh

Using SSL: openssl OpenSSL 1.1.1k  25 Mar 2021
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[…]

DH parameters of size 2048 created at /home/debian/pki-falcot/pki/dh.pem

O próximo passo cria certificados para os clientes VPN; um certificado é necessário para cada computador ou pessoa ser autorizada a usar a VPN:
$ ./easyrsa build-client-full JoeSmith nopass

Note: using Easy-RSA configuration from: ./vars

Using SSL: openssl OpenSSL 1.1.1d  10 Sep 2019
Generating a RSA private key
.......................................................+++++
...........................+++++
writing new private key to '/root/pki-falcot/pki/private/JoeSmith.key.Tgr8kk0a6a'
-----
Using configuration from /root/pki-falcot/pki/safessl-easyrsa.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'JoeSmith'
Certificate is to be certified until Feb 20 04:52:43 2023 GMT (1080 days)

Write out database with 1 new entries
Data Base Updated