के साथ SMIME संदेश (pkcs7-signature) से सार्वजनिक प्रमाणपत्र निकालें ओपनएसएसएल के साथ मैं एक स्मेम संदेश (pkcs7-signature) से सार्वजनिक प्रमाणपत्र कैसे निकाल सकता हूं?ओपनएसएसएल
उत्तर
, 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 हस्ताक्षर नोट कई हो सकता है कि: हस्ताक्षरकर्ता की ही प्रमाण पत्र, और किसी भी अतिरिक्त प्रमाणपत्र हस्ताक्षरकर्ता शामिल करने के लिए फिट पाया (उदाहरण के लिए इंटरमीडिएट सीए प्रमाण पत्र जो उसके प्रमाण पत्र को सत्यापित करने में मदद कर सकते हैं)
हे आर बस:
cat message.eml | openssl smime -pk7out | openssl pkcs7 -print_certs > senders-cert.pem
मैं फ़ाइलों को बनाने के बिना प्रमाणपत्र जानकारी प्राप्त करने का एक तरीका ढूंढ रहा था (बस पाइप और फ़िल्टर), और यह है। चूंकि मुझे प्रमाण पत्र में दिलचस्पी नहीं है, इसलिए मैं अंतिम आदेश 'openssl pkcs7 -print_certs -noout' बना देता हूं – Liam
आप 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;
}
मैं कैसे सत्यापित करने और डेटा निकालने कर सकते हैं से विशाल PKCS7 singed एन्वलप? क्या openssl में कोई विकल्प है ताकि यह पूरी फ़ाइल लोड करने की बजाय चंक-वार प्रोसेस कर सके? – Ashish