VSCode环境下静态链接配置libssl/libcrypto并进行简单证书解析



  • 首先在Windows环境下编译openssl对应的库,生成静态链接库libcrypto.a和libssl.a



  • 然后编写vscode的配置文件tasks.json,注意文件夹目录替换为自己的编译器目录

    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "type": "shell",
                "label": "C/C++: g++.exe build active file",
                "command": "C:\\Program Files\\mingw64\\bin\\g++.exe",
                "args": [
                    "-g",
                    "-m64",
                    "${file}",
                    "${fileDirname}\\libssl.a",
                    "${fileDirname}\\libcrypto.a",
                    "-o",
                    "${fileDirname}\\${fileBasenameNoExtension}.exe",
                    "-ID:\\msys64\\usr\\local\\include",
                    "-lws2_32"
    
                ],
                "options": {
                    "cwd": "${workspaceFolder}"
                },
                "problemMatcher": [
                    "$gcc"
                ],
                "group": "build"
            }
        ]
    }
    


  • 然后将openssl对应的.h文件复制到自己系统的g++的include目录下,并使用vscode安装c++插件(如果之前没装的话),并生成launch.json文件,将libssl.o和libcrypto.o拷贝到代码执行目录下,即可使用vscode编译运行包含openssl对应库的程序。



  • 下面是一个简单的pkcs7的证书解析程序。

    #include <iostream>
    #include <cstring>
    #include <openssl/bio.h>
    #include <openssl/err.h>
    #include <openssl/evp.h>
    #include <openssl/pem.h>
    #include <openssl/pkcs7.h>
    #include <openssl/x509.h>
    #include <openssl/sm2.h>
    #include <openssl/rand.h>
    #include <openssl/objects.h>
    #include <openssl/x509v3.h>
    
     using namespace std;
    
    const char cacert[] = "-----BEGIN CERTIFICATE----- \nMIIB/zCCAaagAwIBAgIJAKKa0PAt9M1FMAoGCCqBHM9VAYN1MFsxCzAJBgNVBAYT \nAkNOMQ4wDAYDVQQIDAVIdUJlaTEOMAwGA1UEBwwFV3VIYW4xDTALBgNVBAoMBEhV \n\
    U1QxDDAKBgNVBAsMA0NTRTEPMA0GA1UEAwwGY2Fyb290MB4XDTIwMDkyMDIwNTkx \n\
    OVoXDTMwMDkxODIwNTkxOVowWzELMAkGA1UEBhMCQ04xDjAMBgNVBAgMBUh1QmVp \n\
    MQ4wDAYDVQQHDAVXdUhhbjENMAsGA1UECgwESFVTVDEMMAoGA1UECwwDQ1NFMQ8w \n\
    DQYDVQQDDAZjYXJvb3QwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAASJ8mm28JJR \n\
    bZKLr6DCo1+KWimpKEsiTfZM19Zi5ao7Au6YLosyN71256MWmjwkwXxJeLa0lCfm \n\
    kF/YWCX6qGQ0o1MwUTAdBgNVHQ4EFgQUAL5hW3RUzqvsiTzIc1gUHeK5uzQwHwYD \n\
    VR0jBBgwFoAUAL5hW3RUzqvsiTzIc1gUHeK5uzQwDwYDVR0TAQH/BAUwAwEB/zAK \n\
    BggqgRzPVQGDdQNHADBEAiAaZMmvE5zzXHx/TBgdUhjtpRH3Jpd6OZ+SOAfMtKxD \n\
    LAIgdKq/v2Jkmn37Y9U8FHYDfFqk5I0qlQOAmuvbVUi3yvM= \n\
    -----END CERTIFICATE----- \n\
    ";
    
    const char certB[] = "\
    -----BEGIN CERTIFICATE----- \n\
    MIICHDCCAcKgAwIBAgIBAzAKBggqgRzPVQGDdTBbMQswCQYDVQQGEwJDTjEOMAwG \n\
    A1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMQ0wCwYDVQQKDARIVVNUMQwwCgYD \n\
    VQQLDANDU0UxDzANBgNVBAMMBmNhcm9vdDAeFw0yMDA5MjAyMTIxMDNaFw0zMDA5 \n\
    MTgyMTIxMDNaMEoxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTENMAsGA1UE \n\
    CgwESFVTVDEMMAoGA1UECwwDQ1NFMQ4wDAYDVQQDDAVVc2VyQjBZMBMGByqGSM49 \n\
    AgEGCCqBHM9VAYItA0IABB+6yy4hQEnt0lkrBm8RVLXz2P/6V6i74DOkTsomIS5D \n\
    8RLpcK03vJL+UfPzQO5Ekr3LBiEPRD1oa+h5wlC6ZJejgYcwgYQwCQYDVR0TBAIw \n\
    ADALBgNVHQ8EBAMCBSAwKgYJYIZIAYb4QgENBB0WG0dtU1NMIEdlbmVyYXRlZCBD \n\
    ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUAhr5rk22vn/vEACBoMYN1FMPmGAwHwYDVR0j \n\
    BBgwFoAUAL5hW3RUzqvsiTzIc1gUHeK5uzQwCgYIKoEcz1UBg3UDSAAwRQIhANkY \n\
    3oWdgG8jriJXuRhX5le4QjE19EnKB4rWCQcKvORfAiAR4hnLYT+dXgFCxVgPkjGO \n\
    PDXj9mXJk6crvhRRxZfWNg== \n\
    -----END CERTIFICATE----- \n\
    ";
    
    const char certA[] = "\
    -----BEGIN CERTIFICATE----- \n\
    MIICGzCCAcKgAwIBAgIBAjAKBggqgRzPVQGDdTBbMQswCQYDVQQGEwJDTjEOMAwG \n\
    A1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMQ0wCwYDVQQKDARIVVNUMQwwCgYD \n\
    VQQLDANDU0UxDzANBgNVBAMMBmNhcm9vdDAeFw0yMDA5MjAyMTEyMTZaFw0zMDA5 \n\
    MTgyMTEyMTZaMEoxCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTENMAsGA1UE \n\
    CgwESFVTVDEMMAoGA1UECwwDQ1NFMQ4wDAYDVQQDDAVVc2VyQTBZMBMGByqGSM49 \n\
    AgEGCCqBHM9VAYItA0IABHvafDoCgn+mlwfMr89kPlC96XsSJACun0xNLEFOnb46 \n\
    kZSeKUfRtLUcgpDoiwOVV7LiileewgJQqKFi5vy7wICjgYcwgYQwCQYDVR0TBAIw \n\
    ADALBgNVHQ8EBAMCBSAwKgYJYIZIAYb4QgENBB0WG0dtU1NMIEdlbmVyYXRlZCBD \n\
    ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUIePApg8IOc4nvX/kMH0Cja0Mf4gwHwYDVR0j \n\
    BBgwFoAUAL5hW3RUzqvsiTzIc1gUHeK5uzQwCgYIKoEcz1UBg3UDRwAwRAIgI3Q0 \n\
    qndxJPTgvC8sPNarf7pJwdsIrU0Ajmlv4PdatU4CIHU8Pyt6rT9BaHrf8ppJduPe \n\
    GWCy2i4+1au/zyp42b0r \n\
    -----END CERTIFICATE----- \n\
    ";
    
    const char certC[] = "\
    -----BEGIN CERTIFICATE----- \n\
    MIICPjCCAeWgAwIBAgIBBDAKBggqgRzPVQGDdTBbMQswCQYDVQQGEwJDTjEOMAwG \n\
    A1UECAwFSHVCZWkxDjAMBgNVBAcMBVd1SGFuMQ0wCwYDVQQKDARIVVNUMQwwCgYD \n\
    VQQLDANDU0UxDzANBgNVBAMMBmNhcm9vdDAeFw0yMDA5MjcxNDIwMjFaFw0zMDA5 \n\
    MjUxNDIwMjFaMG0xCzAJBgNVBAYTAkNOMQ4wDAYDVQQIDAVIdUJlaTENMAsGA1UE \n\
    CgwESFVTVDEMMAoGA1UECwwDQ1NFMQ4wDAYDVQQDDAVVc2VyQzEhMB8GCSqGSIb3 \n\
    DQEJARYSeG10YW5nQGh1c3QuZWR1LmNuMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0D \n\
    QgAEHSrf7RNs2+Rf1TrPeJREGSy+6YTC9t4rtp1vY7Akuct504We3iAiALcIarFt \n\
    QxQOr5Zf4l7Ybt3NocM8fLxkNqOBhzCBhDAJBgNVHRMEAjAAMAsGA1UdDwQEAwIF \n\
    4DAqBglghkgBhvhCAQ0EHRYbR21TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0G \n\
    A1UdDgQWBBQvMLtMYb/dD9cNF0+s/cZNxHUBGjAfBgNVHSMEGDAWgBQAvmFbdFTO \n\
    q+yJPMhzWBQd4rm7NDAKBggqgRzPVQGDdQNHADBEAiBrTVuYbSUlOX4TYV4q094S \n\
    XgfnobZWYPeRjGmBNAEIMwIgfHrQR9RfLd62bg0iZBpfgwvtGuaCE3DX24xapZ6U \n\
    fIc= \n\
    -----END CERTIFICATE----- \n\
    ";
    
    const char pkeyA[] = "\
    -----BEGIN EC PARAMETERS----- \n\
    BggqgRzPVQGCLQ== \n\
    -----END EC PARAMETERS----- \n\
    -----BEGIN EC PRIVATE KEY----- \n\
    MHcCAQEEIErrb3NV+HqWKfoINmBAFyNAe/knxHHXt5tXi2YCqgmtoAoGCCqBHM9V \n\
    AYItoUQDQgAEe9p8OgKCf6aXB8yvz2Q+UL3pexIkAK6fTE0sQU6dvjqRlJ4pR9G0 \n\
    tRyCkOiLA5VXsuKKV57CAlCooWLm/LvAgA== \n\
    -----END EC PRIVATE KEY----- \n\
    ";
    const char pkeyC[] = "\
    -----BEGIN EC PARAMETERS----- \n\
    BggqgRzPVQGCLQ== \n\
    -----END EC PARAMETERS----- \n\
    -----BEGIN EC PRIVATE KEY----- \n\
    MHcCAQEEIIyXY38MKYLhXXRu/YC6+KxAYJ2rwUIlWAFwOmQKGhDboAoGCCqBHM9V \n\
    AYItoUQDQgAEHSrf7RNs2+Rf1TrPeJREGSy+6YTC9t4rtp1vY7Akuct504We3iAi \n\
    ALcIarFtQxQOr5Zf4l7Ybt3NocM8fLxkNg== \n\
    -----END EC PRIVATE KEY----- \n\
    ";
    const char pkeyB[] = "\
    -----BEGIN EC PARAMETERS----- \n\
    BggqgRzPVQGCLQ== \n\
    -----END EC PARAMETERS----- \n\
    -----BEGIN EC PRIVATE KEY----- \n\
    MHcCAQEEINQhCKslrI3tKt6cK4Kxkor/LBvM8PSv699Xea7kTXTToAoGCCqBHM9V \n\
    AYItoUQDQgAEH7rLLiFASe3SWSsGbxFUtfPY//pXqLvgM6ROyiYhLkPxEulwrTe8 \n\
    kv5R8/NA7kSSvcsGIQ9EPWhr6HnCULpklw== \n\
    -----END EC PRIVATE KEY----- \n\
    ";
    const char message[] = "A0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffff";
    
    X509 *getX509(const char *cert)
    {
    	BIO *bio;
    	bio = BIO_new(BIO_s_mem());
    	BIO_puts(bio, cert);
        return  PEM_read_bio_X509(bio, NULL, NULL, NULL);
    }
    EVP_PKEY *getpkey(const char *private_key)
    {
    	BIO *bio_pkey = BIO_new_mem_buf((char *)private_key, strlen(private_key));
    	if (bio_pkey == NULL)
     		return NULL;
     	return  PEM_read_bio_PrivateKey(bio_pkey, NULL, NULL, NULL);
    }
    
    
    void gen_pkcs7()
    {
    	BIO *p7bio;
    	const EVP_CIPHER *cipher;
    	EVP_PKEY *pkey;
    	PKCS7*p7;
    	X509 *cert;
    	size_t len;
    	char *out;
    	int flags;
    
    	p7 = PKCS7_new();
    	PKCS7_set_type(p7,NID_pkcs7_signedAndEnveloped);
    	cipher=EVP_aes_128_cbc();
    	PKCS7_set_cipher(p7,cipher);
    	PKCS7_SIGNER_INFO* si=PKCS7_add_signature(p7,getX509(certC),getpkey(pkeyC),EVP_sha1());
    	PKCS7_add_signed_attribute(si, NID_pkcs9_contentType, V_ASN1_OBJECT,OBJ_nid2obj(NID_pkcs7_data));
    
    	PKCS7_add_recipient(p7,getX509(certB));
    	PKCS7_add_certificate(p7,getX509(certC));
    	PKCS7_add_certificate(p7,getX509(cacert));
    	p7bio=PKCS7_dataInit(p7,NULL);
    	BIO_write(p7bio,message,strlen(message));
    	BIO_flush(p7bio);
    	PKCS7_dataFinal(p7,p7bio);
    	BIO_free(p7bio);
    	BIO* bio_out=BIO_new_fd(fileno(stdout), BIO_NOCLOSE);
    	PEM_write_bio_PKCS7(bio_out, p7);
    	BIO_flush(bio_out);
    	BIO_free(bio_out);
    	PKCS7_free(p7);
    	puts("1");
    }
    
    
    int main(int argc, char **argv)
    {
        printf("%s",cacert);
    	int flag=0;
    	ERR_load_crypto_strings();
    	OpenSSL_add_all_algorithms();
    	gen_pkcs7();
    	return 0;
    }
    
    

登录后回复
 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待