请关注之前的系列文章:
通过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)