2013-04-05 83 views
2

我有一個指向TLS證書的指針,我需要獲取commonName屬性;使用openssl從tls證書有效獲取常用名字

我首先創建了帶有函數d2i_X509的X509對象;

x = d2i_X509(NULL, &p, certificate_lenght); 
if (x == NULL) 
    return https_failure; 

比我調用函數X509_NAME_get_text_by_NID用於獲取COMMONNAME

X509_NAME_get_text_by_NID(X509_get_subject_name(x),NID_commonName, hc->https_domain_name, 256); 

它爲我,但我很擔心性能。我認爲,當我只需要commonName時,所有證書對象都會被解析。有沒有更好的方法讓commonName更有效率。

+1

實際上,如果你想驗證一個HTTPS網站,你需要首先查找主題替代名稱擴展名(DNS類型),如果沒有任何擴展名,則只需要退回到CN。 – Bruno 2013-04-05 11:07:58

+0

您不應該在沒有進行實際測量的情況下推測可能的低效率。 – EJP 2013-04-05 11:51:06

+1

我沒有說什麼是低效的。性能對我的情況很重要。我想了解是否有更有效的方法。 – 2013-04-05 12:11:05

回答

3

使用OpenSSL高級API沒有更高效的方法。如果您真的對儘可能獲得最佳性能感興趣,則需要使用底層的ASN.1解析API。 但請記住,如果不完全解析證書,則無法完全驗證證書,因此我只關心僅提取CN的安全隱患。

+0

非常感謝您的回答。它非常有幫助。對於低級別的asn.1 API,我檢查了「http://lionet.info/asn1c/compiler.html」,但似乎我需要生成一個框架(c文件)並生成此文件,我必須在ASN中編寫證書。 1格式並通過ASN1編譯器進行編譯。我誤解了嗎?還是有沒有簡單的方法可以使用低級的ASN1 API。 – 2013-04-08 06:03:13

+0

驗證證書對於我的情況並不重要,我只需要獲取servername。 – 2013-04-08 06:15:05