通过OpenSSL获取X509证书的HASH(指纹)值

请关注之前的系列文章:
通过OpenSSL解码X509证书文件
通过OpenSSL解析X509证书基本项

        通过之前的文章,我们可以使用OpenSSL库解码X509证书文件,并且解析证书的基本项,这次我们尝试通过OpenSSL获取证书的HASH值。证书的HASH值,也称指纹值,是检查证书的完整性、正确性的属性。如果使用父证书来验证证书的签名时,就会使用到HASH值。

        通过Windows查看证书的方式看到的证书HASH(指纹)值如下:

通过OpenSSL获取X509证书的HASH(指纹)值_第1张图片

        有了前面系列文章的基础,我们假设已经通过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值如下图:

通过OpenSSL获取X509证书的HASH(指纹)值_第2张图片

(该工具代码工程可以在本人的下载资源中下载,下载连接:X509证书解析工具V1.1)


你可能感兴趣的:(OpenSSL)