无法使用C上的openssl从.cer文件获取公钥

无法使用C上的openssl从.cer文件获取公钥,c,openssl,C,Openssl,在codeEVP\u PKEY*d2i\u PUBKEY\u fp(FILE*fp,EVP\u PKEY**a)方法中使用openssl无法在.cer文件中获取公钥 int load_cert(){ FILE*fp=fopen(“/home/android/cafile/cerfile.cer”,“r”); 如果(!fp){ fprintf(stderr,“无法打开:%s\n”,路径); 返回退出失败; } X509*x509data=NULL; //X509*证书=d2i_X509_bio(

在code
EVP\u PKEY*d2i\u PUBKEY\u fp(FILE*fp,EVP\u PKEY**a)
方法中使用openssl无法在.cer文件中获取公钥


int load_cert(){
FILE*fp=fopen(“/home/android/cafile/cerfile.cer”,“r”);
如果(!fp){
fprintf(stderr,“无法打开:%s\n”,路径);
返回退出失败;
}
X509*x509data=NULL;
//X509*证书=d2i_X509_bio(fp,空);
d2i_X509_fp(fp和X509数据);
如果(!x509data){
fprintf(stderr,“无法解析:%s\n”中的证书,路径);
fclose(fp);
返回退出失败;
}
字符颁发者名称[1024];
char subject_name[1024];
X509_NAME_单线(X509_获取_发卡机构名称(x509data)),发卡机构名称,
sizeof(发行人名称);
X509_NAME_单行(X509_get_subject_NAME(x509data)),subject_NAME,
sizeof(受试者姓名);
printf(“发卡机构名称:%s\n”,发卡机构名称);
printf(“主题名称:%s\n”,主题名称);
执行副总裁*PKEY;
EVP_PKEY*a=NULL;
//d2i_PUBKEY_fp(fp和a);
pkey=d2i_PUBKEY_fp(fp,&a);
d2i_PUBKEY_fp(fp,NULL);
if(pkey==NULL){
printf(“d2i_PUBKEY_fp pkey错误\n”);
}
如果(a==NULL){
printf(“d2i_PUBKEY_fp a错误\n”);
}
//任何额外的处理都会在这里进行。。
fclose(fp);
返回0;
}


issuer\u name
subject\u name
可以正确获取,但是
pkey
a
为空。

您似乎希望公钥在文件中的X509证书之后以序列化形式出现。公钥包含在证书中-因此您在执行
d2i\u X509\u fp
调用时已经读取了它,并且它包含在
x509data
对象中。要将其提取为执行副总裁,请使用
X509\u get\u pubkey
,如下所述:


我使用``EVP\u PKEY*key=X509\u get\u pubkey(x509data)```获取一个EVP_PKEY,然后我使用`` unsigned char*p=NULL;int i=i2d_PUBKEY(key,&p);int size=sizeof(p);`获取字符数组,但结果总是8字节,但我的公钥大小是65字节,这是怎么发生的?“int size=sizeof(p)”将给出指针“p”的大小,而不是“p”指向的数据的大小。在您的平台上,指针似乎总是8字节长。您需要做的是类似于“char*p,*tmpp;int size=i2d\u PUBKEY(key,NULL);p=tmpp=malloc(size);size=i2d\u PUBKEY(key,&tmpp);”。那么编码数据的大小就是大小,它位于“p”所指的位置。请注意,i2d_PUBKEY修改传递给它的指针,因此使用“tmpp”作为临时指针。