通过OpenSSL获取证书扩展属性之三:“颁发机构密钥标识”和"使用者密钥标识"
2015-09-22 14:07
513 查看
上篇文章讲述了如何使用OpenSSL获取证书的“密钥用法”和"增强型密钥用法"扩展属性:使用OpenSSL获取证书扩展属性之二:“密钥用法”和"增强型密钥用法"
今天继续讲述如何获取“颁发机构密钥标识”和"使用者密钥标识"这两个扩展属性。这两个扩展属性在证书中如下图所示:
通过OpenSSL获取这两个扩展属性,具体步骤如下:
1、调用X509_get_ext_d2i()获取对应的扩展属性对象;
2、解析对象结构体,得到具体的用法类型。其中:
“颁发机构密钥标识”使用结构体AUTHORITY_KEYID表示,其具体定义如下:
成员变量KeyId即为颁发者密钥标示数据。
"使用者密钥标识"使用通用的ASN1_OCTET_STRING表示。
3、解析结构体中的值,得到具体含义
基于以上过程,下面给出获取“颁发机构密钥标识”和“使用者密钥标识”两个扩展属性的完整代码。“颁发机构密钥标识”扩展属性的获取代码如下:
今天继续讲述如何获取“颁发机构密钥标识”和"使用者密钥标识"这两个扩展属性。这两个扩展属性在证书中如下图所示:
通过OpenSSL获取这两个扩展属性,具体步骤如下:
1、调用X509_get_ext_d2i()获取对应的扩展属性对象;
2、解析对象结构体,得到具体的用法类型。其中:
“颁发机构密钥标识”使用结构体AUTHORITY_KEYID表示,其具体定义如下:
struct AUTHORITY_KEYID_st { ASN1_OCTET_STRING *keyid; GENERAL_NAMES *issuer; ASN1_INTEGER *serial; };
成员变量KeyId即为颁发者密钥标示数据。
"使用者密钥标识"使用通用的ASN1_OCTET_STRING表示。
3、解析结构体中的值,得到具体含义
基于以上过程,下面给出获取“颁发机构密钥标识”和“使用者密钥标识”两个扩展属性的完整代码。“颁发机构密钥标识”扩展属性的获取代码如下:
ULONG COpenSSLCertificate::_GetExtAuthorityIdentifier(X509 *pX509Cert, LPSTR lpscProperty, ULONG* pulLen) { int i = 0; int crit = 0; char value[512] = {0}; AUTHORITY_KEYID *akeyid = NULL; if (!m_pX509) { return CERT_ERR_INVILIDCALL; } if (!pulLen) { return CERT_ERR_INVALIDPARAM; } akeyid = (AUTHORITY_KEYID*)X509_get_ext_d2i(m_pX509, NID_authority_key_identifier, &crit, NULL); if (!akeyid) { return CERT_ERR_ATTR_NOTEXIST; } strcat_s(value, 512, "KeyID="); for (i = 0; i < akeyid->keyid->length; i++) { char keyid[8] = {0}; sprintf_s(keyid, 8, "%x ", akeyid->keyid->data[i]); strcat_s(value, 512, keyid); } if (!lpscProperty) { *pulLen = strlen(value) + 1; } if (*pulLen < (strlen(value) + 1)) { return CERT_ERR_BUFFER_TOO_SMALL; } strcpy_s(lpscProperty, *pulLen, value); return CERT_ERR_OK; }“使用者密钥标识”的获取代码如下:
ULONG COpenSSLCertificate::_GetExtSubjectIdentifier(X509 *pX509Cert,LPSTR lpscProperty,ULONG* pulLen) { int i = 0; int crit = 0; char value[512] = {0}; ASN1_OCTET_STRING *skid = NULL; if (!m_pX509) { return CERT_ERR_INVILIDCALL; } if (!pulLen) { return CERT_ERR_INVALIDPARAM; } skid = (ASN1_OCTET_STRING*)X509_get_ext_d2i(m_pX509, NID_subject_key_identifier, &crit, NULL); if (!skid) { return CERT_ERR_ATTR_NOTEXIST; } for (i = 0; i < skid->length; i++) { char keyid[8] = {0}; sprintf_s(keyid, 8, "%x ", skid->data[i]); strcat_s(value, 512, keyid); } if (!lpscProperty) { *pulLen = strlen(value) + 1; } if (*pulLen < (strlen(value) + 1)) { return CERT_ERR_BUFFER_TOO_SMALL; } strcpy_s(lpscProperty, *pulLen, value); return CERT_ERR_OK; }
相关文章推荐
- linux命令行挂载NTFS文件系统的移动硬盘
- Linux 的启动流程
- PHP抓取网站图片脚本
- openstack启动云主机的流程
- Spark和hadoop的关系
- Linux下中文乱码及中文字体缺失问题的解决
- openstack中为何要使用消息队列
- PF_Ring 编译安装 for Linux SUSE11 SP1
- Hadoop学习笔记(一)
- linux系统的7种运行级别
- vs2010 OpenGL+glfw+glew+glm
- ARM裸机之体系架构介绍一
- 高级Bash脚本编程指南
- java tomcat html5调试中需要关注的配置问题
- Linux-HUP信号的干扰问题
- [9-13]Shell系列6――取算数运算数值
- hadoop集群模式下导入数据到hbase上报错
- No EditorOptionDefinition Export Found Error的问题
- Nginx负载均衡配置实例详解
- 系统运维工程师装逼完全指南