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