1. 程式人生 > >通過OpenSSL獲取X509證書的HASH(指紋)值

通過OpenSSL獲取X509證書的HASH(指紋)值

        通過之前的文章,我們可以使用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)