C++ OpenSSL 之三:生成CSR文件
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 = ;
RSA *r = NULL;
BIGNUM *bne = NULL;
int nVersion = ;
int bits = ;
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) == ) {
fprintf(stderr, "MakeLocalCsrSSLApi save path is empty\n");
return false;
}
//not exists public key file, create one immediately.
if (strlen(keyFilePath) == ) {
// 1. generate rsa key
bne = BN_new();
ret = BN_set_word(bne, e);
if (ret != ) {
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 != ) {
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 != ) {
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, -, -, );
if (ret != ) {
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, -, -, );
if (ret != ) {
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, -, -, );
if (ret != ) {
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 != ) {
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 <= ) {
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. free
free_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 == );
}
以上。
《C++ OpenSSL 之一:编译和使用》
《C++ OpenSSL 之二:生成RSA文件》
《C++ OpenSSL 之三:生成CSR文件》
《C++ OpenSSL 之四:CER转换为PEM》
《C++ OpenSSL 之五:生成P12文件》
C++ OpenSSL 之三:生成CSR文件的更多相关文章
- 使用OpenSSL生成CSR文件,并申请全球通用SSL证书
http://www.openssl.org 上只有OpenSSL的原代码下载,为了方便Windows用户使用OpenSSL,我们特地为您准备了OpenSSL 0.9.8.a for win32的可执 ...
- 如何制作CSR文件?
如何制作CSR文件? 在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单 ...
- C++ OpenSSL 之二:生成RSA文件
1.等同于生成private key: openssl genrsa -out "save_path" 2048 2.代码如下 bool MakeRsaKeySSL(const c ...
- C++ OpenSSL 之五:生成P12文件
1.等同于使用: openssl pkcs12 -export -inkey "key_path" -in "pem_path" -out "save ...
- openssl 生成CSR
openssl 生成CSR 2013-12-27 15:05 3699人阅读 评论(1) 收藏 举报 分类: Security(38) C/C++(105) 版权声明:本文为博主原创文章,未经博 ...
- 如何使用OpenSSL工具生成根证书与应用证书
如何使用OpenSSL工具生成根证书与应用证书 一.步骤简记 // 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认) openssl req -new -x509 -d ...
- 使用INF创建CSR文件
公司要为一个英国的客户提供由HTTP升级到HTTPS的服务,于是接触到了申请SSL证书这方面的内容. 一.总的来说,申请证书需要两步,一是创建CSR文件,二是在证书提供商购买证书并将CSR文件发给证书 ...
- 用OpenSSL命令行生成证书文件
用OpenSSL命令行生成证书文件 1.首先要生成服务器端的私钥(key文件): openssl genrsa -des3 -out server.key 1024 运行时会提示输入密码,此密码用于加 ...
- 利用keytool、openssl生成证书文件
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...
随机推荐
- python27期day16:序列化、json、pickle、hashlib、collections、软件开发规范、作业。
序列化模块:什么是序列化呢? 序列化的本质就是将一种数据结构(如字典.列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化.将这个字典直接写入文件是不可以的,必须转化成字符串的形式, ...
- VLDB 2019:
纵览数据库顶会VLDB 2019论文,我们发现了六大发展动向 作者 | 韩硕 [导读]一年一度的数据库领域顶级会议 VLDB 2019 于当地时间8月26日-8月30日在美国加利福尼亚州洛杉矶召开,探 ...
- zz深度学习论文合集大全
Pull requestsIssues Marketplace Explore Learn Git and GitHub without any code! Using ...
- read articles list
done 如何通俗易懂地解释卷积: https://www.zhihu.com/question/22298352/answer/637156871 如何通俗易懂地理解卷积神经网路: http://w ...
- java8之行为参数化
今天看到一块switch代码,觉得又臭又长,可以优化一下,只需要将函数名作为入参进行改造,有点类似于策略模式. 以下是使用Java8进行行为参数化的简单案例: User.java import lom ...
- SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个
一,问题 采取eureka集群.客户端通过Ribbon调用服务,Ribbon端报下列异常 java.net.UnknownHostException: SERVICE-HI java.lang.Ill ...
- SpringBoot第七篇:整合Mybatis-Plus
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10881666.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 一看这个名 ...
- 论文阅读: Building a 3-D Line-Based Map Using Stereo SLAM
Abstract 一个把直线用作feature的SLAM系统. 跟点相比, 直线对于环境的结构提供了更丰富的信息, 也让其鞥有可能推断地图的空间语义. 使用了Plucker line coordian ...
- vertica 设置最大会话数
默认会话数最大值55,如果超过了,就会报如下错误: com.vertica.support.exceptions.NonTransientConnectionException: [Vertica][ ...
- tomcat闪退的解决思路
用Tomcat总会遇到启动Tomcat闪退的问题. 什么叫闪退啊,就是闪一下,就退出了控制台. 都闪退了,为啥闪退也不知道呀,又没有错误信息,所以就要先阻止闪退,先看到错误信息,知道启动不起来的原因. ...