Posted on 2008-05-06 22:52 lostpencil 阅读(644)
评论(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是"甜蜜的"意思,不是说脏话,:)