通過OpenSSL獲取X509證書的HASH(指紋)值
阿新 • • 發佈:2019-02-01
通過之前的文章,我們可以使用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)