2011-04-15 12 views
18

के साथ SMIME संदेश (pkcs7-signature) से सार्वजनिक प्रमाणपत्र निकालें ओपनएसएसएल के साथ मैं एक स्मेम संदेश (pkcs7-signature) से सार्वजनिक प्रमाणपत्र कैसे निकाल सकता हूं?ओपनएसएसएल

उत्तर

24
कमांड लाइन उपकरण के साथ

, S/MIME संदेश ही यह सोचते हैं फ़ाइल message में है:

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

यह हस्ताक्षरकर्ता प्रमाणपत्र लिखते cert.pem में (के रूप में हस्ताक्षर ब्लॉब में एम्बेडेड), और संदेश पाठ textdata फ़ाइल में डेटा।

वैकल्पिक रूप से, आप एक स्वतंत्र फ़ाइल के रूप में हस्ताक्षर ब्लॉब को सहेज सकते हैं (यह केवल एक प्रकार का अनुलग्नक है, इसलिए कोई मेलर एप्लिकेशन या लाइब्रेरी ऐसा करने में सक्षम होना चाहिए। फिर, यह मानते हुए कि कहा गया ब्लॉब नाम की एक फ़ाइल में है smime.p7s, का उपयोग करें:।

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

जो बाहर सभी प्रमाणपत्र जिसमें PKCS # एम्बेडेड रहे हैं प्रिंट होगा 7 हस्ताक्षर नोट कई हो सकता है कि: हस्ताक्षरकर्ता की ही प्रमाण पत्र, और किसी भी अतिरिक्त प्रमाणपत्र हस्ताक्षरकर्ता शामिल करने के लिए फिट पाया (उदाहरण के लिए इंटरमीडिएट सीए प्रमाण पत्र जो उसके प्रमाण पत्र को सत्यापित करने में मदद कर सकते हैं)

+0

मैं कैसे सत्यापित करने और डेटा निकालने कर सकते हैं से विशाल PKCS7 singed एन्वलप? क्या openssl में कोई विकल्प है ताकि यह पूरी फ़ाइल लोड करने की बजाय चंक-वार प्रोसेस कर सके? – Ashish

10

हे आर बस:

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

मैं फ़ाइलों को बनाने के बिना प्रमाणपत्र जानकारी प्राप्त करने का एक तरीका ढूंढ रहा था (बस पाइप और फ़िल्टर), और यह है। चूंकि मुझे प्रमाण पत्र में दिलचस्पी नहीं है, इसलिए मैं अंतिम आदेश 'openssl pkcs7 -print_certs -noout' बना देता हूं – Liam

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; 
} 
संबंधित मुद्दे