2011-04-15 200 views

回答

24

用命令行工具,假設S/MIME消息本身是在文件message

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

此寫入簽名人證書(如嵌入在簽名BLOB)成cert.pem,並且消息文本數據在textdata文件中。

或者,您可以將簽名blob另存爲一個獨立的文件(它只是一種附件,所以任何郵件程序或庫應該都可以這樣做)然後,假設該blob位於一個名爲smime.p7s,使用方法:

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

這將打印出被嵌入的PKCS#所有證書7簽名注意,可以有幾個:簽名者的自身證書,以及任何額外的證書籤名者找到適合包括(例如,可以幫助驗證其證書的中間CA證書)。

+0

我如何驗證和提取數據從巨大的PKCS7燒焦信封?在openssl中有沒有任何選項,以便它可以處理塊而不是加載整個文件? – Ashish 2011-06-28 19:46:13

10

O [R剛:

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

我正在尋找一種獲取證書信息而不創建文件(只是管道和過濾器)的方式,就是這樣。由於我對證書本身不感興趣,因此我使用最後一個命令`openssl pkcs7 -print_certs -noout` – Liam 2013-11-15 18:49:12

1

如果你正在編寫C/C++,這個代碼片段將有助於

//...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; 
}