csr sha2生成 linux,Openssl生成csr的解决方案_汉服资讯的博客-程序员宅基地

技术标签: csr sha2生成 linux  

[cpp]

#include 

#include 

#include 

#pragma comment(lib, “libeay32.lib”)

/*

* subject is expected to be in the format /type0=value0/type1=value1/type2=…

* where characters may be escaped by \

*/

X509_NAME *parse_name(char *subject, long chtype, int multirdn)

{

size_t buflen = strlen(subject)+1; /* to copy the types and values into. due to escaping, the copy can only become shorter */

char *buf = OPENSSL_malloc(buflen);

size_t max_ne = buflen / 2 + 1; /* maximum number of name elements */

char **ne_types = OPENSSL_malloc(max_ne * sizeof (char *));

char **ne_values = OPENSSL_malloc(max_ne * sizeof (char *));

int *mval = OPENSSL_malloc (max_ne * sizeof (int));

char *sp = subject, *bp = buf;

int i, ne_num = 0;

X509_NAME *n = NULL;

int nid;

if (!buf || !ne_types || !ne_values || !mval)

{

//BIO_printf(bio_err, “malloc error\n”);

goto error;

}

if (*subject != ‘/’)

{

//BIO_printf(bio_err, “Subject does not start with ‘/’.\n”);

goto error;

}

sp++; /* skip leading / */

/* no multivalued RDN by default */

mval[ne_num] = 0;

while (*sp)

{

/* collect type */

ne_types[ne_num] = bp;

while (*sp)

{

if (*sp == ‘\\’) /* is there anything to escape in the type…? */

{

if (*++sp)

*bp++ = *sp++;

else

{

//BIO_printf(bio_err, “escape character at end of string\n”);

goto error;

}

}

else if (*sp == ‘=’)

{

sp++;

*bp++ = ‘\0’;

break;

}

else

*bp++ = *sp++;

}

if (!*sp)

{

//BIO_printf(bio_err, “end of string encountered while processing type of subject name element #%d\n”, ne_num);

goto error;

}

ne_values[ne_num] = bp;

while (*sp)

{

if (*sp == ‘\\’)

{

if (*++sp)

*bp++ = *sp++;

else

{

//BIO_printf(bio_err, “escape character at end of string\n”);

goto error;

}

}

else if (*sp == ‘/’)

{

sp++;

/* no multivalued RDN by default */

mval[ne_num+1] = 0;

break;

}

else if (*sp == ‘+’ && multirdn)

{

/* a not escaped + signals a mutlivalued RDN */

sp++;

mval[ne_num+1] = -1;

break;

}

else

*bp++ = *sp++;

}

*bp++ = ‘\0’;

ne_num++;

}

if (!(n = X509_NAME_new()))

goto error;

for (i = 0; i 

{

if ((nid=OBJ_txt2nid(ne_types[i])) == NID_undef)

{

//BIO_printf(bio_err, “Subject Attribute %s has no known NID, skipped\n”, ne_types[i]);

continue;

}

if (!*ne_values[i])

{

//BIO_printf(bio_err, “No value provided for Subject Attribute %s, skipped\n”, ne_types[i]);

continue;

}

if (!X509_NAME_add_entry_by_NID(n, nid, chtype, (unsigned char*)ne_values[i], -1,-1,mval[i]))

goto error;

}

OPENSSL_free(ne_values);

OPENSSL_free(ne_types);

OPENSSL_free(buf);

OPENSSL_free(mval);

return n;

error:

X509_NAME_free(n);

if (ne_values)

OPENSSL_free(ne_values);

if (ne_types)

OPENSSL_free(ne_types);

if (mval)

OPENSSL_free(mval);

if (buf)

OPENSSL_free(buf);

return NULL;

}

X509_NAME *CreateDN(char *pbEmail, char *pbCN, char *pbOU, char *pbO, char *pbL, char *pbST, char *pbC)

{

X509_NAME *pX509Name = NULL;

if(pbCN == NULL)

{

return NULL;

}

if (!(pX509Name = X509_NAME_new()))

{

return NULL;

}

X509_NAME_add_entry_by_txt(pX509Name, “emailAddress”, V_ASN1_UTF8STRING, pbEmail, -1, -1, 0);

X509_NAME_add_entry_by_txt(pX509Name, “CN”, V_ASN1_UTF8STRING, pbCN, -1, -1, 0);

X509_NAME_add_entry_by_txt(pX509Name, “OU”, V_ASN1_UTF8STRING, pbOU, -1, -1, 0);

X509_NAME_add_entry_by_txt(pX509Name, “O”, V_ASN1_UTF8STRING, pbO, -1, -1, 0);

X509_NAME_add_entry_by_txt(pX509Name, “L”, V_ASN1_UTF8STRING, pbL, -1, -1, 0);

X509_NAME_add_entry_by_txt(pX509Name, “ST”, V_ASN1_UTF8STRING, pbST, -1, -1, 0);

X509_NAME_add_entry_by_txt(pX509Name, “C”, V_ASN1_UTF8STRING, pbC, -1, -1, 0);

return pX509Name;

}

int GenCSR(char *pbDN, int nDNLen, char *pCSR, size_t nCSRSize)

{

char szAltName[] = “DNS:www.trustauth.cn”;

char szComment[] = “Create by Jinhill”;

char szKeyUsage[] = “digitalSignature, nonRepudiation”;

char szExKeyUsage[] = “serverAuth, clientAuth”;

X509_REQ        *pX509Req = NULL;

int             iRV = 0;

long            lVer = 3;

X509_NAME       *pX509DN = NULL;

EVP_PKEY        *pEVPKey = NULL;

RSA             *pRSA = NULL;

X509_NAME_ENTRY *pX509Entry = NULL;

char            szBuf[255] = {0};

char            mdout[20];

int             nLen, nModLen;

int             bits = 2048;

unsigned long   E = RSA_3;

unsigned char   *pDer = NULL;

unsigned char   *p = NULL;

FILE            *fp = NULL;

const EVP_MD    *md = NULL;

X509            *pX509 = NULL;

BIO             *pBIO = NULL;

BIO             *pPemBIO = NULL;

BUF_MEM         *pBMem = NULL;

//STACK_OF(X509_EXTENSION) *pX509Ext;

if(pbDN == NULL)

{

return -1;

}

pX509DN = parse_name(pbDN, V_ASN1_UTF8STRING, 0);

pX509Req = X509_REQ_new();

iRV = X509_REQ_set_version(pX509Req, lVer);

// subject pX509Name

iRV = X509_REQ_set_subject_name(pX509Req, pX509DN);

/* pub key */

pEVPKey = EVP_PKEY_new();

pRSA = RSA_generate_key(bits, E, NULL, NULL);

EVP_PKEY_assign_RSA(pEVPKey, pRSA);

iRV = X509_REQ_set_pubkey(pX509Req, pEVPKey);

/* attribute */

strcpy(szBuf, szAltName);

nLen = strlen(szBuf);

iRV = X509_REQ_add1_attr_by_txt(pX509Req, “subjectAltName”, V_ASN1_UTF8STRING, szBuf, nLen);

strcpy(szBuf, szKeyUsage);

nLen = strlen(szBuf);

iRV = X509_REQ_add1_attr_by_txt(pX509Req, “keyUsage”, V_ASN1_UTF8STRING, szBuf, nLen);

strcpy(szBuf, szExKeyUsage);

nLen = strlen(szBuf);

iRV = X509_REQ_add1_attr_by_txt(pX509Req, “extendedKeyUsage”, V_ASN1_UTF8STRING, szBuf, nLen);

strcpy(szBuf, szComment);

nLen = strlen(szBuf);

iRV = X509_REQ_add1_attr_by_txt(pX509Req, “nsComment”, V_ASN1_UTF8STRING, szBuf, nLen);

md = EVP_sha1();

iRV = X509_REQ_digest(pX509Req, md, mdout, &nModLen);

iRV = X509_REQ_sign(pX509Req, pEVPKey, md);

if(!iRV)

{

printf(“sign err!\n”);

X509_REQ_free(pX509Req);

return -1;

}

// 写入文件PEM格式

//  pBIO = BIO_new_file(“certreq.txt”, “w”);

//  PEM_write_bio_X509_REQ(pBIO, pX509Req, NULL, NULL);

//  BIO_free(pBIO);

//返回PEM字符

pPemBIO = BIO_new(BIO_s_mem());

PEM_write_bio_X509_REQ(pPemBIO, pX509Req, NULL, NULL);

BIO_get_mem_ptr(pPemBIO,&pBMem);

if(pBMem->length <= nCSRSize)

{

memcpy(pCSR, pBMem->data, pBMem->length);

}

BIO_free(pPemBIO);

/* DER编码 */

//nLen = i2d_X509_REQ(pX509Req, NULL);

//pDer = (unsigned char *)malloc(nLen);

//p = pDer;

//nLen = i2d_X509_REQ(pX509Req, &p);

//free(pDer);

//  验证CSR

OpenSSL_add_all_algorithms();

iRV = X509_REQ_verify(pX509Req, pEVPKey);

if(iRV<0)

{

printf(“verify err.\n”);

}

X509_REQ_free(pX509Req);

return nCSRSize;

}

int main()

{

char chDN[255] = “/CN=www.trustauth.cn/O=Beijing Jinhill Inc./C=CN”;

char chCSR[2048] = {0};

int rv = GenCSR(chDN, strlen(chDN), chCSR, sizeof(chCSR));

printf(“CSR:\n%s”, chCSR);

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42508557/article/details/116951366

智能推荐

0429建立Extended Statistics函数索引问题_weixin_33994444的博客-程序员宅基地

[20160429]建立Extended Statistics 和函数索引问题.txt --11G支持相关数据的统计分析,比如如果两个字段存在相关性通过分析,能够得到更加良好的统计信息,以及生成好的执行计划. --但是如果结合函数索引呢?通过一个简单的例子来说明: --前次做的测试: http://blog.it...

43个功能测试点总结_iteye_15968的博客-程序员宅基地

43个功能测试点总结 软件测试  功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。针对Web系统的常用测试方法如下:  1. 页面链接检查:每一个链接是否都有对应的页面,并且页面之间切换正确。可以使用一些工具,如LinkBotPro、File-AIDCS、HTML Link Validater、Xenu等工具。LinkBotPro不支持...

UBOOT UART设置(基于mini2440)_羽落飞扬剑舞意的博客-程序员宅基地

基于mini2440的UBOOT UART设置1. 标准9针串口引脚定义根据图3.40的引脚顺序号,如果是作为RS-232C接口,则各引脚定义如表3.2所示。表3.2RS-232C引脚意义表各引脚的电气特性为:在TxD和RxD上,逻辑“1”为-3V~-15V; 逻辑“0”为+3V~+15V。在RTS、CTS、DSR、DTR和DCD等控制线上,信号有效为+3V~+

浅谈MFC类CrackMe中消息处理函数查找方法_weixin_30755709的博客-程序员宅基地

最近一个学姐发给我了一份CrackMe希望我解一下,其中涉及到了MFC的消息函数查找的问题,就顺便以此为例谈一下自己使用的消息函数查找的方法。本人萌新,如果有任何错漏与解释不清的地方,欢迎各路大佬指正。这个CrackMe是一个典型的MFC类型的程序,其框体如下:一、目标以及方法首先我们确认我们的目标是找到两个”注册”按钮的对应消息处理函数,那么有什么手段可以达到我们的目标?在MFC...

android 官方jar,Android 依赖中的jar 包获取方式_全能鬼才木希的博客-程序员宅基地

起因:目前Android 的jar 包我们都是 通过Android studio 的gradle 中添加依赖进行下载。但是eclipse 的用户表示,你在说什么? 读者可能会有疑问,现在还有eclipse 开发Android 的么?有今天我遇到一个有这个需求的朋友。前两个问题还好说,看到第三个,我陷入了沉思,百度不**有得事么。这个人石乐志吧。他说要官方的。我就开始找官方的下载库,没准以后能用上呢...

dir函数:遍历文件名_ainizhongguoaa的博客-程序员宅基地

dir(“地址\”)返回该地址下的第一个文件的文件名Sub t()Dim sr As Stringsr = Dir("G:\社团、活动\JMR\*.xlsx")这里使用了通配符,并指定了文件扩展名;如果不指定,至少应当在地址后加 \ ,以实现遍历DoMsgBox srsr = DirLoop Until sr = ""End Sub使用do

随便推点

【hihocoder】1515 - 分数调查 (带权并查集)_Dicer_的博客-程序员宅基地

题目链接文章推荐:点击查看用val[x]存放x与根节点的差。感觉带权并查集的find函数跟merge函数有很多递归回溯的思想。 还有大佬说向量偏移之类的,我觉得应该就是利用关系之间的传递性。AC代码:#include &amp;lt;bits/stdc++.h&amp;gt;using namespace std;const int N = 2e5;int n, m, q, x, ...

Servlet_y41992910的博客-程序员宅基地

javax.servlet.Servletpublic interface Servlet {//根据配置初始化,例如在web.xml文件中的写的servlet内容配置信息public void init(ServletConfig config) throws ServletException;//获取配置信息public ServletConfig getServletConfi...

Mac OS利用Composer安装的ThinkPHP遇到404 Not Found The requested URL was not found on this server问题_喜马拉雅的夜空的博客-程序员宅基地

有关Composer安装ThinkPHP的详细过程不再重复,主要针对运行http://localhost/tp5/public/出现404 Not Found The requested URL was not found on this server.的问题,问题如下图所示:解决办法:出现上面这个问题主要是因为ThinkPHP的安装文件与Web服务器的根目录不符,Mac的Apache服务器...

c++size_HELLOWORLDBOOK的博客-程序员宅基地_c++ size

以前求字符串大小时候一直搞A:size(s)这是错的正确应该是B:s.size();这俩逻辑理解是不同的A:size是一个函数,可以猜想它的函数体应该是int size(string s){int size=0;…return size;}这么理解也没啥问题也许这个函数还重载了不仅可以求字符串的大小,还可以求其他数据类型的size,但这么做肯定是不方便的,因为字符串的大小和其他类型的大小的求法有本质差别,字符串的求法应该是遍历,计数,故不好重载其他类型sizeof可以求很多类型的数据

Codeforces Round #311 (Div. 2) C. Arthur and Table (枚举+贪心+思维)_weixin_34221112的博客-程序员宅基地

C. Arthur and Tabletime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputArthur has bought a beautiful big table ...

vue2 实现 div contenteditable="true" 类似于 v-model 的效果_weixin_34088598的博客-程序员宅基地

问题在 vue2 中对表单控件有着良好的双向数据绑定机制,但是对于要特定实现某些功能的输入时,我们就不得不使用到 contenteditable="true" 的 div ,而在这个 div 上是使用 v-model 是没有效果的。那么问题就来了,输入是非常需要双向绑定的,这里的双向数据绑定该如何实现?解决思路一:自定义指令当然,说...