
Estou tentando criar uma CA e uma CA intermediária para uso em fins de assinatura/criptografia do Office 365 no Outlook. Consegui seguir vários tutoriais e com o OpenSSL produzir uma CA e uma CA intermediária que geram certificados. Estou tendo dois problemas:
- Quando eu gero um certificado de usuário final x509, ele é sinalizado como inválido porque a CA intermediária não tem autoridade para emitir certificados.
- Se, em vez disso, eu gerar o certificado de usuário final com a CA raiz, poderei assinar e criptografar e-mails sem problemas, mas depois de um tempo ele para de funcionar.
Acho que o problema 2 é causado pelo fato de os certificados do usuário final não serem assinados pela CA intermediária. No Exchange Online, o SMIMEExpiredCertificateThumbprint retorna a impressão digital do certificado intermediário, não a CA raiz. Ainda posso publicar um certificado de usuário final gerado pela CA raiz para a GAL e enviar alguns e-mails rápidos, mas depois que o Outlook sincroniza com a GAL, ele vê que o certificado não foi gerado a partir do certificado intermediário e o declara não autorizado.
Acho que resolver o problema 1 resolverá o problema 2, mas não sei como definir permissões para uma CA intermediária emitir certificados. Qualquer ajuda?
Veja como estou gerando uma CA raiz e intermediária:
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
openssl genrsa -out ia.key 4096
openssl req -new -key ia.key -out ia.csr
openssl x509 -req -days 730 -in ia.csr -CA ca.crt -CAkey ca.key -serial -out ia.crt
E aqui está como os clientes estão sendo gerados:
openssl genrsa -aes128 -out email.key 2048
openssl req -new -key email.key -out email.csr
openssl x509 -req -days 365 -in email.csr -CA ia.crt -CAkey ia.key -CAcreateserial -out email.crt
openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx
openssl x509 -in email.crt -serial -noout >> email.meta
openssl x509 -in email.crt -fingerprint -noout >> email.meta
Responder1
Então, basicamente, não descobri necessariamente como resolver o problema com o OpenSSL, mas descobri que o GnuTLS solicita o uso do certificado de uma forma fácil de trabalhar.
Estou gerando a CA raiz da seguinte forma:
certtool --generate-privkey --bits 4096 --outfile ca.key
certtool --generate-self-signed --load-privkey ca.key --template ca.vars --outfile ca.crt
Onde meus ca.vars se parecem:
organization = [Company Name]
unit = [Org Unit]
locality = [City]
state = [State]
country = [Country Code]
challenge_password = [password]
password = [password]
expiration_days = 1825
serial = 1
ca
cert_signing_key
crl_signing_key
cn = '[Company Name] Root CA 000001'
NOTA: A senha está listada no arquivo ca.vars que é inseguro; mas para minha implementação, um script gera o arquivo vars e o exclui usando a ferramenta de exclusão srm. Se você não estiver usando scripts para gerar seus arquivos vars, basta omitir as linhas password e challenge_password e você será solicitado.
Então as CA intermediárias são as seguintes:
certtool --generate-privkey --bits 4096 --outfile ia.key
certtool --generate-request --template ia.vars --load-privkey ia.key --outfile ia.csr
certtool --generate-certificate --template ia.vars --load-request ia.csr --load-ca-certificate ca.crt --load-ca-privkey ca.key --outfile ia.crt
A diferença entre ca.vars e ia.vars é que defino os dias de expiração como 365 e adiciono a seguinte linha:
path_len = 1
A partir daí, posso usar o script acima com o openssl e as autoridades de certificação ia_[sign/encrypt] para gerar certificados x509 que posso usar no Outlook com o Office 365 para assinar/criptografar e-mails. Vou colá-lo novamente apenas para referência:
openssl genrsa -aes128 -out email.key 2048
openssl req -new -key email.key -out email.csr
openssl x509 -req -days 365 -in email.csr -CA ia.crt -CAkey ia.key -CAcreateserial -out email.crt
openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx
openssl x509 -in email.crt -serial -noout >> email.meta
openssl x509 -in email.crt -fingerprint -noout >> email.meta
Espero que isso ajude alguém além de mim! :)