windowsAPI验证上下级证书关系

本文探讨了在Windows环境下使用CertCreateCertificateContext函数解析Base64编码证书时遇到的问题,并提供了将Base64证书解码为DER编码后进行验证的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象:

调用CertCreateCertificateContext解析Base64格式证书时报“0x8009310b ASN1 遇到了不确的标记值

分析:

windows不支持Base64编码只支持Der编码

解决方案:

Base64证书先解码,然后使用

 

//使用根证书对用户证书进行验证,确认是自己颁发的
extern "C" int __stdcall VerifyUserCert(
char* CspName,
byte* UserCertInfo/*DER编码*/,
int nUserCertInfoSize,
byte* RootCertInfo/*DER编码*/,
int nRootCertInfo
)
{
int nRet = 0;
int nErrCode = 0;
PCCERT_CONTEXT pCertContextRoot = NULL;
 
//连接CSP
HCRYPTPROV hCryptProv = NULL;
if(!CryptAcquireContextA(
&hCryptProv,
NULL,
CspName,
PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT
))
{
nErrCode = GetLastError();
return 71;
}
//创建证书上下文
pCertContextRoot = CertCreateCertificateContext(X509_ASN_ENCODING, RootCertInfo, nRootCertInfo);
if (pCertContextRoot == NULL)
{ 
nErrCode = GetLastError();//0x8009310b 应该是证书的编码错了,不支持Base64编码只支持Der编码
return 92;//92 创建证书上下文失败
}
 
//使用根公钥对用户证书验签
if (!CryptVerifyCertificateSignature(
hCryptProv,
X509_ASN_ENCODING,
UserCertInfo,
nUserCertInfoSize,
&(pCertContextRoot->pCertInfo->SubjectPublicKeyInfo)))  //CA证书公钥
{
nErrCode = GetLastError();
return 93;//93 验证证书签名失败
}
 
return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值