博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ OpenSSL 之三:生成CSR文件
阅读量:7296 次
发布时间:2019-06-30

本文共 4275 字,大约阅读时间需要 14 分钟。

1.等同于使用: openssl req -new -key "key_path" -out "save_path" -subj "/emailAddress=email/CN=name/C=country"

2.代码如下:keyFilePath为RSA private key 文件。

bool MakeCsrSSL(const  char * keyFilePath, const  char *email, const  char *name, const  char *country, const  char *saveCsrFilePath) {    int             ret = 0;    RSA             *r = NULL;    BIGNUM          *bne = NULL;    int             nVersion = 1;    int             bits = 2048;    unsigned long   e = RSA_F4;    X509_REQ        *x509_req = NULL;    X509_NAME       *x509_name = NULL;    EVP_PKEY        *pKey = NULL;    RSA             *tem = NULL;    BIO             *out = NULL, *keyFileBIO = NULL;    FILE            *pubKeyFile = NULL;    if (strlen(saveCsrFilePath) == 0) {        fprintf(stderr, "MakeLocalCsrSSLApi save path is empty\n");        return false;    }    //not exists public key file, create one immediately.    if (strlen(keyFilePath) == 0) {        // 1. generate rsa key        bne = BN_new();        ret = BN_set_word(bne, e);        if (ret != 1) {            fprintf(stderr, "MakeLocalCsrSSLApi BN_set_word err\n");            goto free_all;        }        r = RSA_new();        ret = RSA_generate_key_ex(r, bits, bne, NULL);        if (ret != 1) {            fprintf(stderr, "MakeLocalCsrSSLApi RSA_generate_key_ex err\n");            goto free_all;        }    } else { //open it        pubKeyFile = fopen(keyFilePath, "r");        if (pubKeyFile == NULL) {            fprintf(stderr, "MakeLocalCsrSSLApi opening file %s err\n", keyFilePath);            goto free_all;        }        keyFileBIO = BIO_new_file(keyFilePath, "r");        if (keyFileBIO == NULL) {            fprintf(stderr, "MakeLocalCsrSSLApi BIO_new_file err %s\n", keyFilePath);            goto free_all;        }        r = PEM_read_bio_RSAPrivateKey(keyFileBIO, NULL, NULL, NULL);        if (r == NULL) {            fprintf(stderr, "MakeLocalCsrSSLApi PEM_read_bio_RSAPrivateKey err\n");            goto free_all;        }        /*        //从csr文件中获取私钥        BIO* bio = bio_open_default(csrFilePath, "r", 1);        r = PEM_read_bio_RSAPrivateKey(bio, NULL, NULL, NULL);        if (r == NULL) {            fprintf(stderr, "Error PEM_read_RSAPublicKey file %s\n", savePrivateKeyFilePath);            return false;        }*/    }    // 2. set version of x509 req    x509_req = X509_REQ_new();    ret = X509_REQ_set_version(x509_req, nVersion);    if (ret != 1) {        fprintf(stderr, "MakeLocalCsrSSLApi X509_REQ_set_version err\n");        goto free_all;    }    // 3. set subject of x509 req    x509_name = X509_REQ_get_subject_name(x509_req); //x509_req->req_info.subject;    ret = X509_NAME_add_entry_by_txt(x509_name, "emailAddress", MBSTRING_ASC, (const unsigned char*)email, -1, -1, 0);    if (ret != 1) {        fprintf(stderr, "MakeLocalCsrSSLApi X509_NAME_add_entry_by_txt emailAddress err\n");        goto free_all;    }    ret = X509_NAME_add_entry_by_txt(x509_name, "CN", MBSTRING_ASC, (const unsigned char*)name, -1, -1, 0);    if (ret != 1) {        fprintf(stderr, "MakeLocalCsrSSLApi X509_NAME_add_entry_by_txt CN err\n");        goto free_all;    }    ret = X509_NAME_add_entry_by_txt(x509_name, "C", MBSTRING_ASC, (const unsigned char*)country, -1, -1, 0);    if (ret != 1) {        fprintf(stderr, "MakeLocalCsrSSLApi X509_NAME_add_entry_by_txt C err\n");        goto free_all;    }    // 4. set public key of x509 req    pKey = EVP_PKEY_new();    EVP_PKEY_assign_RSA(pKey, r);    r = NULL;   // will be free rsa when EVP_PKEY_free(pKey)    ret = X509_REQ_set_pubkey(x509_req, pKey);    if (ret != 1) {        fprintf(stderr, "MakeLocalCsrSSLApi X509_REQ_set_pubkey err\n");        goto free_all;    }    // 5. set sign key of x509 req    ret = X509_REQ_sign(x509_req, pKey, EVP_sha1());    // return x509_req->signature->length    if (ret <= 0) {        fprintf(stderr, "MakeLocalCsrSSLApi X509_REQ_sign err\n");        goto free_all;    }    out = BIO_new_file(saveCsrFilePath, "w");    ret = PEM_write_bio_X509_REQ(out, x509_req);    // 6. freefree_all:    BIO_free_all(keyFileBIO);    X509_REQ_free(x509_req);    BIO_free_all(out);    EVP_PKEY_free(pKey);    BN_free(bne);    if (pubKeyFile) fclose(pubKeyFile);    return (ret == 1);}

以上。

 

转载于:https://www.cnblogs.com/chevin/p/11041713.html

你可能感兴趣的文章
MySQL 数据类型 详解
查看>>
TreeMap 的排序
查看>>
解决JOOQ的Database product name must not be null问题
查看>>
终于有人把SDH、MSTP、OTN和PTN的关系解释清楚了……
查看>>
H5面试----介绍一下 CSS 的盒子模型
查看>>
版本管理规范
查看>>
ssh登陆不需要密码(配置信任有关系)
查看>>
Kubernetes[4]—RC(复制控制器-副本集)
查看>>
Citrix XenServer 优化
查看>>
js仿京东轮播图效果
查看>>
x-manager 管理 kvm虚拟机
查看>>
MySQL同步时,出现的ERROR 1201 (HY000)错误解决方法
查看>>
TurboMail邮件系统异地分布式部署方案
查看>>
我的友情链接
查看>>
Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得
查看>>
Android异步从网络下载图片并且缓存图片到本地的demo
查看>>
Linux Shell编程入门
查看>>
JAVA调用返回XML格式数据的WebService,并通过XPath解析XML的应用
查看>>
虚拟机windows中编译环境的分辨率能否固定
查看>>
Python-函数
查看>>