2012-05-28 57 views
5

我需要使用C-land OpenSSL驗證X509證書的域。驗證OpenSSL中的證書域

我的理解是,庫不爲我做到這一點,我必須大致實現以下算法:

  1. 如果主題替代延伸DNSNAME域存在,設置name到值。
  2. 否則,請將name設置爲主題的CN字段。
  3. name與請求的主機名進行比較,允許每個星號匹配[A-Za-z0-9 _] +,但不匹配'dot'(。)。

在我看來,應該有大量的代碼踢這樣做,但我還沒有找到任何。

任何人都可以找到這樣的例子嗎?或者,或者,理智檢查我的算法?

編輯:這是我想出了:https://gist.github.com/2821083。看起來很奇怪的是OpenSSL會將這個問題留給調用代碼。

+1

而不是根據您在證書中找到的值「設置」值,您應該以相反的方式執行此操作:檢查您期望的是否具有匹配的SAN DNS條目。這是因爲SAN擴展中可能有多個DNS條目。 (有關RFC 6125中通配符匹配的更精確的規則,順便說一下。) – Bruno

回答

5

你幾乎可以看到 - 雖然要小心備選名稱和原始IP地址以及FQDN。你可能想竊取

BOOL SSL_X509_getIDs(apr_pool_t *p, X509 *x509, apr_array_header_t **ids) 
http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_util_ssl.c

及相關的朋友和ssl_engine_init.c被叫方(這是順便把服務器端)的所有選項。

由於您正在處理openssl回調 - 如果您尚未在CTX中提供該日期和時間鏈,請考慮日期&。

Dw。

2

OpenSSL將這件事留給調用代碼看起來很奇怪。

是的,它在實踐中非常成問題的遺漏,因爲許多應用程序沒有意識到他們必須手動執行檢查。

OpenSSL 1.1.0將包含主機名驗證(現在在HEAD(截至2013年9月))。根據更改日誌,有一個-verify_name選項,並且apps.c響應-verify_hostname開關。但s_client不響應任何交換機,所以它不清楚將如何實施或調用客戶端的主機名檢查。


如果subjectAlternativeName延伸dnsName字段存在,集名稱爲該值。

可能有多個主題備用名稱(SAN),因此要爲多個主題備用名稱做好準備。

否則,將名稱設置爲主題的CN字段。

我相信你也需要檢查一下。

比較名稱針對所請求的主機名,從而允許每個星號 匹配[A-ZA-Z0-9 _] +,但不是 '點'(。)。

它更痛苦。您還必須確保您不符合gTLD或ccTLD。例如,您不希望在針對gTLD *.com頒發的證書上進行匹配。該證書可能是由一個壞人發佈的;)

ccTLD就像* .eu,* .us或者是nic.lk。大約有5000個左右,Mozilla提供了一個列表http://publicsuffix.org/。原始列表爲https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1


在我看來,應該有大量的代碼踢身邊做 這一點,但我還沒有發現任何。

除了範古利克的建議,你也可以嘗試捲曲。我相當確定Curl包含主機名匹配的代碼。


您甚至可以驗證證書是否格式正確。在Web上下文中負責的組是CA /瀏覽器論壇。他們對於創建證書基線和擴展的要求:

在基準文檔,你會發現,例如,IP列爲通用名稱(CN)的名稱也必須在主題備用名稱(SAN)中列出。

在擴展文檔中,您會發現保留的IP(RFC 1918)不能出現在擴展驗證(EV)證書中;而EV證書不能包含通配符。