Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
766 views
in Technique[技术] by (71.8m points)

c++ - How to Read the certificates file from the PKCS7.p7b certificate file using openssl?

I am getting PKCS7 file (p7b). I want to read the content of the file and extract certificate in X509 structure.

How can I access individual Certificate from the PKCS container using openssl library?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I've used the following program:

#include <stdio.h>
#include <openssl/pkcs7.h>
#include <openssl/x509.h>
#include <openssl/bio.h>
#include <openssl/pem.h>

int main(int argc, char **argv)
{
    PKCS7 *p7 = NULL;
    BIO *in = BIO_new(BIO_s_file());
    BIO *out = BIO_new(BIO_s_file());
    int der = 0; /* Input from DER or PEM ? */
    int text = 0; /* Dump text or output PEM ? */
    STACK_OF(X509) *certs = NULL;
    int i;

    CRYPTO_malloc_init();                                               
    ERR_load_crypto_strings();
    OpenSSL_add_all_algorithms();

    BIO_set_fp(out, stdout, BIO_NOCLOSE);
    BIO_read_filename(in, argv[1]);
    p7 = der ?
        d2i_PKCS7_bio(in, NULL) :
        PEM_read_bio_PKCS7(in, NULL, NULL, NULL);

    i = OBJ_obj2nid(p7->type);
    if(i == NID_pkcs7_signed) {
        certs = p7->d.sign->cert;
    } else if(i == NID_pkcs7_signedAndEnveloped) {
        certs = p7->d.signed_and_enveloped->cert;
    }

    for (i = 0; certs && i < sk_X509_num(certs); i++) {
        X509 *x = sk_X509_value(certs,i);
        if(text) {
            X509_print(out, x);
        } else {
            PEM_write_bio_X509(out,x);
        }
    }
}

It's based on openssl-1.0.0d/apps/pkcs7.c and it's easily compiled (on Linux or Mac OS X) with (provided you save it as readp7.c):

gcc -o readp7 readp7.c -lcrypto

You can create files with openssl and read them like this:

openssl crl2pkcs7 -nocrl -certfile a.crt -certfile b.crt -out test.p7b
./readp7 test.p7b

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...