使用CryptoAPI获取证书扩展属性之三:“颁发机构密钥标识”和"使用者密钥标识"
来源:互联网 发布:在淘宝上怎么退货退款 编辑:程序博客网 时间:2024/05/17 02:51
上篇文章讲述了如何使用CryptoAPI获取证书的“密钥用法”和"增强型密钥用法"扩展属性:使用CryptoAPI获取证书扩展属性之二:“密钥用法”和"增强型密钥用法"
1、调用函数CertFindExtension()找到扩展对象
2、使用函数CryptDecodeObject()解码对象,得到属性结构体。其中:
今天继续讲述如何获取“颁发机构密钥标识”和"使用者密钥标识"这两个扩展属性。这两个扩展属性在证书中如下图所示:
1、调用函数CertFindExtension()找到扩展对象
2、使用函数CryptDecodeObject()解码对象,得到属性结构体。其中:
“颁发机构密钥标识”的结构用PCERT_AUTHORITY_KEY_ID2_INFO表示,其定义为:
<span style="font-size:14px;">typedef struct _CERT_AUTHORITY_KEY_ID2_INFO { CRYPT_DATA_BLOB KeyId; CERT_ALT_NAME_INFO AuthorityCertIssuer; // Optional, set cAltEntry // to 0 to omit. CRYPT_INTEGER_BLOB AuthorityCertSerialNumber;} CERT_AUTHORITY_KEY_ID2_INFO, *PCERT_AUTHORITY_KEY_ID2_INFO;</span>成员变量KeyId即为颁发者密钥标示数据。
"使用者密钥标识"的结构体用通用的PCRYPT_DATA_BLOB表示。
3、解析结构体中的值,得到具体含义
基于以上过程,下面给出获取“颁发机构密钥标识”和“使用者密钥标识”两个扩展属性的完整代码。“颁发机构密钥标识”扩展属性的获取代码如下:
ULONG CCSPCertificate::_GetExtAuthorityIdentifier(PCCERT_CONTEXT pCertContext,LPSTR lpscProperty,ULONG* pulLen){ULONG ulRes = 0;ULONG ulDataLen = 512;ULONG ulPropertyLen = 512;BYTE btData[512] = {0};CHAR csProperty[512] = {0};PCERT_EXTENSION pCertExt = NULL;if (!pCertContext){return CERT_ERR_INVILIDCALL;}if (!pulLen){return CERT_ERR_INVALIDPARAM;}pCertExt = CertFindExtension(szOID_AUTHORITY_KEY_IDENTIFIER2, pCertContext->pCertInfo->cExtension, pCertContext->pCertInfo->rgExtension); if (!pCertExt){return CERT_ERR_ATTR_NOTEXIST;}PCERT_AUTHORITY_KEY_ID2_INFO pAuthorityKeyID2 = (PCERT_AUTHORITY_KEY_ID2_INFO)btData;if (CryptDecodeObject(GLOBAL_ENCODING_TYPE, szOID_AUTHORITY_KEY_IDENTIFIER2, pCertExt->Value.pbData, pCertExt->Value.cbData, CRYPT_DECODE_NOCOPY_FLAG, pAuthorityKeyID2, &ulDataLen)){strcat_s(csProperty, 512, "KeyID=");for (ULONG ulIndex = 0; ulIndex < pAuthorityKeyID2->KeyId.cbData; ulIndex++){CHAR csKeyID[8] = {0};sprintf_s(csKeyID, 8, "%x ", pAuthorityKeyID2->KeyId.pbData[ulIndex]);strcat_s(csProperty, 512, csKeyID);}}else{return GetLastError();}if (!lpscProperty){*pulLen = strlen(csProperty) + 1;}if (*pulLen < (strlen(csProperty) + 1)){return CERT_ERR_BUFFER_TOO_SMALL;}strcpy_s(lpscProperty, *pulLen, csProperty);return CERT_ERR_OK;}“使用者密钥标识”的获取代码如下:
ULONG CCSPCertificate::_GetExtSubjectIdentifier(PCCERT_CONTEXT pCertContext, LPSTR lpscProperty, ULONG* pulLen){ULONG ulRes = 0;ULONG ulDataLen = 512;ULONG ulPropertyLen = 512;BYTE btData[512] = {0};CHAR csProperty[512] = {0};PCERT_EXTENSION pCertExt = NULL;if (!pCertContext){return CERT_ERR_INVILIDCALL;}if (!pulLen){return CERT_ERR_INVALIDPARAM;}pCertExt = CertFindExtension(szOID_SUBJECT_KEY_IDENTIFIER, pCertContext->pCertInfo->cExtension, pCertContext->pCertInfo->rgExtension); if (!pCertExt){return CERT_ERR_ATTR_NOTEXIST;}PCRYPT_DATA_BLOB pDataBlob = (PCRYPT_DATA_BLOB)btData;if (CryptDecodeObject(GLOBAL_ENCODING_TYPE, szOID_SUBJECT_KEY_IDENTIFIER, pCertExt->Value.pbData, pCertExt->Value.cbData, CRYPT_DECODE_NOCOPY_FLAG, pDataBlob, &ulDataLen)){for (ULONG ulIndex = 0; ulIndex < pDataBlob->cbData; ulIndex++){CHAR csKeyID[8] = {0};sprintf_s(csKeyID, 8, "%x ", pDataBlob->pbData[ulIndex]);strcat_s(csProperty, 512, csKeyID);}}else{return GetLastError();}if (!lpscProperty){*pulLen = strlen(csProperty) + 1;}if (*pulLen < (strlen(csProperty) + 1)){return CERT_ERR_BUFFER_TOO_SMALL;}strcpy_s(lpscProperty, *pulLen, csProperty);return CERT_ERR_OK;}
0 0
- 使用CryptoAPI获取证书扩展属性之三:“颁发机构密钥标识”和"使用者密钥标识"
- 通过OpenSSL获取证书扩展属性之三:“颁发机构密钥标识”和"使用者密钥标识"
- 使用CryptoAPI获取证书扩展属性之二:“密钥用法”和"增强型密钥用法"
- 使用CryptoAPI获取证书扩展属性之四:“CRL分发点”和“颁发机构信息访问”
- 备份和还原证书颁发机构的密钥和数据库
- 备份和还原证书颁发机构的密钥和数据库
- 通过OpenSSL获取证书扩展属性之二:“密钥用法”和"增强型密钥用法"
- 通过OpenSSL获取证书扩展属性之四:“CRL 分发点”和"颁发机构信息访问"
- 使用CryptoAPI获取证书扩展属性之一:“基本约束”
- 如何使用 CryptoAPI 导出和导入纯文本会话密钥
- 使用keytool获取密钥证书指纹 (SHA1)
- keytool - 密钥和证书管理工具(三)
- CryptoAPI获取3DES会话密钥值
- 密钥和证书
- 私钥、数字证书和可信证书颁发机构
- 密钥&证书
- SSL应用系列之三:CA证书颁发机构(中心)安装图文详解
- keytool - 密钥和证书管理工具
- Android数据库操作通用化
- 杭电2067小兔的棋盘
- NYOJ 770 仿射密码 (字符串&数学)
- 欢迎使用CSDN-markdown编辑器
- hdoj1086You can Solve a Geometry Problem too【线段相交判断】
- 使用CryptoAPI获取证书扩展属性之三:“颁发机构密钥标识”和"使用者密钥标识"
- Android6.0新特性
- python-time
- 启动oracle
- 2016年京东一面问题总结
- iOS疯狂详解之GCD卖火车票
- exit和return的区别 http://blog.csdn.net/firefly_2002/article/details/7960595
- vs2010 OpenGL+glfw+glew+glm
- 杭电1023Train Problem II