lostpencil 阅读(3863) 评论(2)

目的: 工作需要,从一个.P12或者pfx文件里面取得证书的内容,因为有个接口需要一个这样的证书字符串.

于是我这么写了:
 //取得服务器证书
 X509 *cert2;
 EVP_PKEY *pkey2=NULL;
 STACK_OF(X509) *server = NULL;
 BIO * in2 = BIO_new_file("server.pfx","rb");
 PKCS12 *p122 = d2i_PKCS12_bio(in2,NULL);
 PKCS12_parse(p122, "123456", &pkey2, &cert2, &server);
 *servercertLen = i2d_X509(cert2,&servercert);
 本来打算把servercert 和servercertLen作为证书字符串的衡量标准,传给那个接口,结果呢,TMD死活就是不对,servercert就是没有我要的东西.

反反复复的debug,找不到哪里出了问题,前面都是对的,就是到了最后一步servercert里面的东西就不对了,openssl的文档也被读烂了,啥也没说,有点想砸了电脑自杀了.

最后我就想啊想啊,因为知道openssl里面好多函数都是用宏实现的,是不是在i2d_X509里面改变了servercert的指向呢,虽然觉得比较荒唐,但是杨老师在他的COM系列文章里面讲过:有些看似不和规范和习惯的用法,在方方面面都有着运用的.

报着试试的态度在程序后面加了这么句:
servercert = servercert -*servercertLen;

结果TMD真的就好了,但是已经过了20个小时了.

罗嗦半天,要说的其实就是一句话: i2d_X509会改变第2个参数的指针,增加了一个证书内容的长度.

注:TMD是"甜蜜的"意思,不是说脏话,:)


评论列表
xiaodongdong
re: 痛苦的捉虫之--i2d_X509(openssl函数)
就知道会有人也会被这个耍了,你应该搜下我的blog上有写的而且很久了
lostpencil
re: 痛苦的捉虫之--i2d_X509(openssl函数)
鄙视东东,打电话你说不会C++,浪费一天才...........还同事呢.........

发表评论
切换编辑模式