Uma CA é uma organização confiável que pode emitir um certificado digital.
TLS e SSL podem tornar uma conexão segura, mas o mecanismo de criptografia precisa de uma maneira de validá-la; este é o certificado SSL / TLS. O TLS usa um mecanismo chamado criptografia assimétrica, que é um par de chaves de segurança chamadas chave privada e chave pública.
Um certificado auto assinado é um certificado TLS/SSL assinado pela pessoa que o cria e não por uma CA confiável. É fácil gerar um certificado auto-assinado a partir de um computador e pode permitir que você teste um site seguro sem comprar um certificado assinado pela CA.
Embora o certificado auto assinado seja definitivamente arriscado para uso em produção, é uma opção fácil e flexível para o desenvolvimento e teste nos estágios de pré-produção. Mas não é difícil acha-lo em uso em ambientes restritos, como redes internas.
Várias ferramentas de código aberto estão disponíveis para gerenciar certificados TLS / SSL. O mais conhecido é o OpenSSL, que está incluído em quase todas as distribuições
Linux. No entanto, outras ferramentas de código aberto também estão disponíveis.
Alguns outros:
- EasyRSA - Utilitário de linha de comando para criar e gerenciar uma CA PKI
- CFSSL - utilitário de PKI/TLS da Cloudflare
- Lêmure - Ferramenta de criação de TLS da Netflix
Como criar um certificado OpenSSL
Podemos criar certificados por conta própria. Este exemplo gera um certificado auto-assinado usando o OpenSSL.
Crie uma chave privada usando o comando "openssl":
openssl genrsa -out chaveprivada.key 2048
Crie uma solicitação de assinatura de certificado (CSR) usando a chave privada gerada na etapa anterior (irá responder dados de localização, email e empresa):
openssl req -new -key chaveprivada.key -out solicitacaochave.csr
Crie um certificado usando seu CSR e chave privada:
openssl x509 -req -days 365 -in solicitacaochave.csr -signkey chaveprivada.key -out certificado.crt
Converter Certificado PFX para PEM e usar no cUrl
Não importa como está o certificado, ele pode ser convertido para outros formatos usando o OpenSSL. No exemplo abaixo, mostro como usar um certificado SSL junto com o cUrl para login em site, via linha de comando.
Um exemplo prático disto, é usar o cUrl para validar o login com certificado digital no site da Sefaz. Você possui o certificado digital (arquivo ".cer"), e a chave privada no formato de arquivo ".pfx" (Personal Information Exchange File).
Para conseguir, será necessário converter o arquivo para PEM (X.509), no passo abaixo será necessário inserir a passphrase e a senha:
openssl pkcs12 -in original.pfx -out convertido.pem
Agora é necessário dividir o arquivo PEM, ou seja, separar o PEM e gerar arquivos individuais para a chave privada, certificado e CA dele.
Gerar CA root do PFX:
openssl pkcs12 -in original.pfx -out ca.pem -cacerts -nokeys
Gerar a chave privada do cliente através do PFX:
openssl pkcs12 -in original.pfx -out client.pem -clcerts -nokeys
Gerar a chave a partir do ".pfx":
openssl pkcs12 -in original.pfx -out key.pem -nocerts
Agora é possível fazer a autenticação via cUrl no site da Sefaz, usando o PFX convertido:
curl -k https://www.site.exemplo.com -v --key key.pem --cacert ca.pem --cert client.pem
Encriptar e Descriptar um arquivo usando o OpenSSL
Outro caso de uso do OpenSSL é para trocar arquivos encriptados. Em primeiro lugar, a pessoa que irá receber o arquivo precisa me enviar sua chave publica. Para gerar uma chave, ela deve seguir os passos a seguir.
Gerar uma chave PEM privada a partir de uma id_rsa já existente:
openssl rsa -in ~/.ssh/id_rsa -outform pem > transfer.pem
Gerar uma chave PEM pública a partir de uma id_rsa já existente:
openssl rsa -in ~/.ssh/id_rsa -pubout -outform pem > transfer.pub.pem
Pronto, foi gerado uma chave chamada "transfer", nela, há a privada e a pública, a pessoa deve me enviar a chave publica somente.
Agora, irei gerar uma chave randômica de 32 byte (256 bit):
openssl rand -base64 32 > chave.bin
Encriptando a chave, usando minha random e a pública que recebi:
openssl rsautl -encrypt -inkey transfer.pub.pem -pubin -in chave.bin -out chave.bin.enc
Por fim, vou encriptar meu arquivo:
openssl enc -aes-256-cbc -salt -in backup.zip -out backup.enc -pass file:./chave.bin
Para a pessoa que irá receber, devo enviar somente os arquivos ".enc" (o arquivo encriptado e a chave randômica gerada e encriptada). Primeiro, irá descriptografar a chave que foi enviada, para isto, o receptor do arquivo vai usar sua própria chave privada (transfer.pem) que ele gerou e enviou a pública para que eu encriptasse o arquivo:
openssl rsautl -decrypt -inkey id_rsa.pem -in chave.bin.enc -out key.bin
Com o passo acima, o arquivo "key.bin" da pessoa e o meu "chave.bin" terão o mesmo conteúdo, pois foi usado a chave pública para encriptar (eu) e a chave privada para descriptar (o receptor do arquivo).
Finalmente, descriptografando o arquivo:
openssl enc -d -aes-256-cbc -in backup.enc -out backup.zip -pass file:./chave.bin
OpenPGP, PGP e GPG
Todos são padrões de criptografia, funcionam através de chaves assimétricas, cada usuário gera em seu computador um par de chaves: uma pública e uma secreta. A pública é distribuída e permite que qualquer um criptografe dados de modo que só quem possui a chave secreta correspondente, possa descriptografar.
- PGP ou Pretty Good Privacy é proprietário, atualmente pertence a Symantec.
- OpenPGP é do mesmo criador do PGP, mas aqui é uma versão Open Source para uso público.
- GPG ou GnuGPG significa "GNU Privacy Guard", é amplamente usado nos sistemas Linux.
Da mesma maneira que usamos o OpenSSL para transferir o arquivo acima descrito, podemos usar o OpenPGP, PGP ou GPG para "assinar" ou encriptar também. Uma das maneiras mais simples de uso, é através do GPG assinar seus commits e tags num repositório do Git.
Ou seja, além de usar um protocolo de criptografia de chave pública para 'fechar' a comunicação entre meu repositório local e o servidor Git (SSH), ou até mesmo usando o HTTPS, eu gerei uma chave gpg e assino todos meus commits (a chave pública está no servidor e durante o commit, forneço minha senha). Garanto, portanto, que eu estou me comunicando com o servidor correto (SSH) e o servidor garante que o commit foi realizado por mim.
Outro formato de uso das assinaturas, é no envio de e-mail. Você pode trocar chaves entre as pessoas que irão enviar e receber e-mails e eles serão encriptados, qualquer interferência no e-mail não conseguirá obter a mensagem.
Há 2 extensões que testei que facilitam o processo de criar as chaves e incorporam no seu cliente de email:
Via Webmail (extensões no Chrome e Firefox) - FlowCrypt: somente para o GMail (achei o melhor!) atualmente utilizo ele, nao há restrições para conta gratuita:
Public Profile | FlowCrypt
Mailvelope: Gmail e outros (Outlook, Yahoo)
Via client Thunderbird: Enigmail
No Android: alguns Apps como o "OpenKeychain: Easy PGP" permitem integrar com alguns clients de mensagem e email, como o K-9 Mail por exemplo.
O único provedor de e-mail que conheço e fornece suporte ao PGP, é o ProtonMail (que cria contas "@prontonmail.com" e "@pm.me").
Bem, é isto. ;-)
Espero ter sanado algumas dúvidas ou criado novas. Qualquer coisa, só postar a dúvida e tentarei ajudar.