encryption cryptography openssl smime

encryption - Extraer el certificado público del mensaje SMIME(pkcs7-signature) con OpenSSL



cryptography (3)

O solo:

cat message.eml | openssl smime -pk7out | openssl pkcs7 -print_certs > senders-cert.pem

¿Cómo puedo extraer el certificado público de un mensaje smime (pkcs7-signature) con OpenSSL?


Si está escribiendo C / C ++, este fragmento de código ayudaría

//...assuming you have valid pkcs7, st1, m_store etc...... verifyResult = PKCS7_verify( pkcs7, st1, m_store, content, out, flags); if(verifyResult != 1) { goto exit_free; } //Obtain the signers of this message. Certificates from st1 as well as any found included //in the message will be returned. signers = PKCS7_get0_signers(pkcs7, st1, flags); if (!save_certs(env, signerFilePath, signers)) { //Error log } //This method will write the signer certificates into a file provided int save_certs(JNIEnv *env, jstring signerFilePath, STACK_OF(X509) *signers) { int result = 0; int i; BIO *tmp; int num_certificates = 0; if (signerFilePath == NULL) { return 0; } const char *signerfile = (const char *)env->GetStringUTFChars(signerFilePath, 0); tmp = BIO_new_file(signerfile, "w"); if (!tmp) { //error. return } num_certificates = sk_X509_num(signers); for(i = 0; i < num_certificates; i++) { PEM_write_bio_X509(tmp, sk_X509_value(signers, i)); } result = 1; exit_free: BIO_free(tmp); if (signerfile) { env->ReleaseStringUTFChars(signerFilePath, signerfile); signerfile = 0; } return result; }


Con la herramienta de línea de comandos, asumiendo que el mensaje S / MIME en sí está en el message archivo:

openssl smime -verify -in message -noverify -signer cert.pem -out textdata

Esto escribe el certificado del firmante (como incrustado en el blob de firma) en cert.pem , y los datos del texto del mensaje en el archivo de datos de texto.

Alternativamente, puede guardar el blob de firma como un archivo independiente (es solo un tipo de archivo adjunto, por lo que cualquier aplicación de correo o biblioteca debería poder hacerlo. Luego, suponiendo que dicho blob está en un archivo llamado smime.p7s , utilizar:

openssl pkcs7 -in smime.p7s -inform DER -print_certs

que imprimirá todos los certificados que están incrustados en la firma PKCS # 7. Tenga en cuenta que puede haber varios: el propio certificado del firmante, y cualquier certificado adicional que el firmante considere adecuado incluir (por ejemplo, certificados CA intermedios que pueden ayudar a validar su certificado).