OpenSSL证书操作
1.目的
(1) 掌握OpenSSL X509证书验证和获取证书信息的原理以及常用的API;
(2) 基于OpenSSL库开发X509证书验证和证书信息查看程序。
2.步骤
(1) 在函数tX509_Verify() 中,完成对证书的验证。
(2) 在函数tGetX509Info() 中,获取证书的信息,包括证书版本号、证书序列号、证书颁发者信息、证书使用者信息、证书有效期和证书公钥。
(3) 程序输出参考下图:
3.结果
(1) 对证书“guojing.cer”和“huangfeihong.cer”进行了验证,包括证书有效期、证书颁发者签名、证书链和CRL验证;对证书进行解析,显示了证书的版本、序列号、颁发者、使用者、公钥、有效期等信息。
(2) 实验代码:
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<openssl/evp.h>
#include<openssl/x509.h>
void tX509_Verify()
{
unsigned char usrCertificate1[4096];
unsigned long usrCertificate1Len;
unsigned char usrCertificate2[4096];
unsigned long usrCertificate2Len;
unsigned char derCrl[4096];
unsigned long derCrlLen;
unsigned char derRootCert[4096];
unsigned long derRootCertLen;
int rv;
X509_STORE_CTX *ctx=NULL;
X509 *usrCert1=NULL;
X509 *usrCert2=NULL;
X509 *caCert=NULL;
X509 *rootCert=NULL;</span>
<span style="font-size:18px;">X509_CRL *Crl=NULL;
STACK_OF(X509)*caCertStack=NULL;
X509_STORE *rootCertStore =NULL;
int j=0;
const unsigned char *pTmp=NULL;
FILE *fp;
fp=fopen("root.cer","rb");
if(fp==NULL)
{
printf("open file\"root.cer\"err.\n");
return;
}
derRootCertLen=fread(derRootCert,1,4096,fp);
fclose(fp);
fp=fopen("crl.crl","rb");
if(fp==NULL)
{
printf("open file\"crl.crl\"err.\n");
return;
}
derCrlLen=fread(derCrl,1,4096,fp);
fclose(fp);
fp=fopen("guojing.cer","rb");
if(fp==NULL)
{
printf("open file\"guojing.cer\"err.\n");
return;
}
usrCertificate1Len=fread(usrCertificate1,1,4096,fp);
fclose(fp);
fp=fop