我使用「CertOpenStore」API打開證書存儲區,並使用「CertEnumCertificatesInStore」API獲取證書。 API返回的CERT_CONTEXT數據以CERT_NAME_BLOB類型給出頒發者名稱。 如何從證書中獲取CERT_RDN或CERT_NAME_INFO? 我的要求是獲取發行者姓名屬性(O,OU等)。我不想解析CertNameToStr API返回的字符串。從證書對象獲取CERT_RDN信息
0
A
回答
1
以上評論是正確的,你需要解碼CERT_NAME_BLOB
中的ASN.1編碼數據。但是,CryptoAPI有一個功能可以爲您執行此操作 - CryptDecodeObject
。
如果你有一個PCCERT_CONTEXT
手柄pCertContext
,您可以在如下解碼爲CERT_NAME_INFO
結構:
BOOL success = CryptDecodeObject(
X509_ASN_ENCODING,
X509_NAME,
pCertContext->pCertInfo->Issuer.pbData,
pCertContext->pCertInfo->Issuer.cbData,
0,
NULL,
&dwNameInfoSize);
// (check that CryptDecodeObject succeeded)
PCERT_NAME_INFO pCertNameInfo = (PCERT_NAME_INFO) malloc(dwNameInfoSize);
// (check that malloc succeeded)
CryptDecodeObject(
X509_ASN_ENCODING,
X509_NAME,
pCertContext->pCertInfo->Issuer.pbData,
pCertContext->pCertInfo->Issuer.cbData,
0,
pCertNameInfo,
&dwNameInfoSize);
現在,你可以通過RDN像這樣的不同組件循環:
for (DWORD i = 0; i < pCertNameInfo->cRDN; i++)
{
for (DWORD j = 0; j < pCertNameInfo->rgRDN[i].cRDNAttr; j++)
{
CERT_RDN_ATTR &rdnAttribute = pCertNameInfo->rgRDN[i].rgRDNAttr[j];
//
// Do stuff with the RDN attribute
//
}
}
隨着每次迭代,rdnAttribute
將被設置爲發行者名稱的不同組件,如你所願。
最後,釋放內存,當你做:
free(pCertNameInfo);
+0
謝謝。有效。 – user2338040
相關問題
- 1. 獲取ssl證書信息 - .net
- 2. SecCertificateRef:如何獲取證書信息?
- 3. 獲取AWS Iot CA證書信息
- 4. 獲取SSL證書信息 - UIWebview
- 5. 從證書中提取信息
- 6. 從一個PHP對象獲取信息
- 7. php從對象獲取信息
- 8. 從NSData對象獲取信息
- 9. 獲取對象信息
- 10. 從apk中獲取證書詳細信息
- 11. 使用PHP從p12證書文件獲取信息
- 12. 以編程方式從Url獲取證書信息
- 13. 從Windows Server 2008獲取頒發證書的信息CA
- 14. 從outlook imap服務器獲取offlineimap的正確證書信息
- 15. 從PowerShell中的用戶選定證書獲取基本信息
- 16. x509證書信息
- 17. 試圖從內部對象和對象中獲取信息PHP
- 18. iPhone開發:提取SSL證書信息
- 19. 讀取網頁的證書信息
- 20. 使用C獲取Facebook對象信息#
- 21. PHP獲取關於對象的信息
- 22. 如何從C#中的對象獲取或提取信息?
- 23. 從Haskell對象中提取信息
- 24. Flex:SSL證書信息收集
- 25. Python3:ssl證書信息
- 26. 從Java Keystore獲取證書
- 27. 獲取臉書頁面公共信息
- 28. 以編程方式獲取證書詳細信息
- 29. JAVA SSL:如何獲取客戶端證書信息
- 30. 連接錯誤後獲取證書信息
的最佳方式恕我直言,是使用ASN.1語法分析器。加載原始證書數據(DER編碼),並按照[RFC5280](https://www.ietf.org/rfc/rfc5280.txt)中定義的X509證書的結構查找主題或頒發者。 – pepo