经过OpenSSL获取X509证书的HASH(指纹)值
通过OpenSSL获取X509证书的HASH(指纹)值
请关注之前的系列文章:
通过OpenSSL解码X509证书文件
通过OpenSSL解析X509证书基本项
通过之前的文章,我们可以使用OpenSSL库解码X509证书文件,并且解析证书的基本项,这次我们尝试通过OpenSSL获取证书的HASH值。证书的HASH值,也称指纹值,是检查证书的完整性、正确性的属性。如果使用父证书来验证证书的签名时,就会使用到HASH值。
通过Windows查看证书的方式看到的证书HASH(指纹)值如下:
有了前面系列文章的基础,我们假设已经通过OpenSSL解码证书文件,并且得到了X509证书对象指针:X509*m_pX509;
其实,证书的HASH值就存放在结构体X509的成员变量sha1_hash中,X509定义如下:
struct x509_st { X509_CINF *cert_info; X509_ALGOR *sig_alg; ASN1_BIT_STRING *signature; int valid; int references; char *name; CRYPTO_EX_DATA ex_data; /* These contain copies of various extension values */ long ex_pathlen; long ex_pcpathlen; unsigned long ex_flags; unsigned long ex_kusage; unsigned long ex_xkusage; unsigned long ex_nscert; ASN1_OCTET_STRING *skid; AUTHORITY_KEYID *akid; X509_POLICY_CACHE *policy_cache; STACK_OF(DIST_POINT) *crldp; STACK_OF(GENERAL_NAME) *altname; NAME_CONSTRAINTS *nc; #ifndef OPENSSL_NO_RFC3779 STACK_OF(IPAddressFamily) *rfc3779_addr; struct ASIdentifiers_st *rfc3779_asid; #endif #ifndef OPENSSL_NO_SHA unsigned char sha1_hash[SHA_DIGEST_LENGTH]; #endif X509_CERT_AUX *aux; } /* X509 */;
只要返回成员sha1_hash的内容,就能得到证书的HASH值。完整的函数代码如下:
ULONG COpenSSLCertificate::get_HashValue(LPBYTE lpbtHash, ULONG *pulHashLen) { ULONG ulRes = 0; if (!m_pX509) { return CERT_ERR_INVILIDCALL; } if (!pulHashLen) { return CERT_ERR_INVALIDPARAM; } if (!lpbtHash) { *pulHashLen = 20; return CERT_ERR_OK; } memcpy_s(lpbtHash, *pulHashLen , m_pX509->sha1_hash, 20); *pulHashLen = 20; return CERT_ERR_OK; }
使用本人的证书解析工具查看证书的HASH值如下图:
(该工具代码工程可以在本人的下载资源中下载,下载连接:X509证书解析工具V1.1)
版权声明:本文为博主原创文章,未经博主允许不得转载。