¿Crear CA intermedia que pueda emitir certificados?

¿Crear CA intermedia que pueda emitir certificados?

Estoy intentando crear una CA y una CA intermedia para usar con fines de firma/cifrado de Office 365 en Outlook. Pude seguir varios tutoriales y con OpenSSL produje una CA y una CA intermedia que generan certificados. Me encuentro con dos problemas:

  1. Cuando genero un certificado de usuario final x509, se marca como no válido porque la CA intermedia no tiene autoridad para emitir certificados.
  2. Si, en cambio, genero el certificado de usuario final con la CA raíz, puedo firmar y cifrar bien los correos electrónicos, pero después de un tiempo deja de funcionar.

Creo que el problema 2 se debe a que la CA intermedia no firma los certificados de usuario final. En Exchange Online, SMIMEExpiredCertificateThumbprint devuelve la huella digital del certificado intermedio, no la CA raíz. Todavía puedo publicar un certificado de usuario final generado por una CA raíz en la GAL y enviar algunos correos electrónicos rápidos, pero una vez que Outlook se sincroniza con la GAL ve que el certificado no se genera a partir del certificado intermedio y lo declara no autorizado.

Creo que resolver el problema 1 resolverá el problema 2, pero no sé cómo configurar permisos para que una CA intermedia emita certificados. ¿Alguna ayuda?

Así es como estoy generando actualmente una CA raíz e intermedia:

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

Y así es como se generan los clientes:

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

Respuesta1

Básicamente, no necesariamente descubrí cómo resolver el problema con OpenSSL, pero descubrí que GnuTLS solicita el uso de certificados de una manera con la que es fácil trabajar.

Estoy generando la CA raíz de la siguiente manera:

certtool --generate-privkey --bits 4096 --outfile ca.key
certtool --generate-self-signed --load-privkey ca.key --template ca.vars --outfile ca.crt

Donde se ve mi ca.vars:

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: La contraseña aparece en el archivo ca.vars, que no es seguro; pero para mi implementación, un script genera el archivo vars y luego lo elimina usando la herramienta de eliminación srm. Si no está utilizando secuencias de comandos para generar sus archivos vars, simplemente omita las líneas de contraseña y desafío_contraseña y se le solicitará.

Luego las CA intermedias son las siguientes:

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

La diferencia entre ca.vars e ia.vars es que configuro los días de vencimiento en 365 y agrego la siguiente línea:

path_len = 1

Desde allí puedo usar el script anterior con openssl y las autoridades de certificación ia_[sign/encrypt] para generar certificados x509 que puedo usar en Outlook con Office 365 para firmar/cifrar correos electrónicos. Lo pegaré nuevamente solo como referencia:

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 esto ayude a alguien además de mí! :)

información relacionada