Então, basicamente, eu não necessariamente descobri como resolver o problema com o OpenSSL, mas descobri que o GnuTLS solicita o uso de certificados de uma maneira que seja 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 meu ca.vars se parece:
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 é listada no arquivo ca.vars, que é inseguro; mas para minha implementação, um script gera o arquivo vars e, em seguida, o exclui usando a ferramenta de exclusão srm. Se você não estiver usando scripts para gerar seus arquivos vars, apenas omita as linhas password e challenge_password e você será solicitado.
Em seguida, as CAs 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 eu defino os dias de expiração para 365 e adiciono a seguinte linha:
path_len = 1
A partir daí, posso usar o script acima com openssl e as autoridades de certificado ia_ [assinar / criptografar] para gerar certificados x509 que posso usar no Outlook com o Office 365 para assinar / criptografar emails. 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! :)