现象:
调用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;
}