Ssl-Certificate

內部網路 CA:“無效的公用名”或所有內容的無效證書(Internet Explorer 和 Windows 的證書 mmc 管理單元除外)

  • December 22, 2017

我們在混合的 Windows / Linux 環境中執行由 Ubuntu 16.04 伺服器和 OpenSSL 後端支持的內部證書頒發機構,用於內部資源。

此 CA 與一些內部網站一起使用,試圖為內部網站、軟體部署等提供有效的、受信任的站點證書。我們有一個問題。

CA 根證書由 GPO 推送到我們所有的 Windows 系統,或者手動安裝。但是,該 CA 簽署的每個證書最終都會出現一些問題 - Chrome 和 Firefox 都表明該證書的公用名無效,而其他實用程序(例如此處的 XMPP 伺服器)即使 CA 證書在,也無法驗證該證書信託商店。

只有 Internet Explorer 尊重證書。不幸的是,我們是一個 Chrome 和 Firefox 的房子,所以使用 IE 來做所有事情都會是一個問題。

有沒有人想出一個解決方案,使 OpenSSL CA 證書及其已簽發證書的簽名證書在 Chrome 和 Firefox 上沒有“無效公用名”錯誤,從而允許內部證書被視為“有效”?

我實際上找到了核心問題,並且花了很多時間搜尋。終於在 StackOverflow 上找到了答案,結合我對證書本身的實際數據的調查openssl req -text -noout -verify -in CSR.csr,讀取 CSR 中的數據,openssl x509 -in certificate.crt -text -noout對生成的證書進行剖析並比較這兩者,指出了核心問題。

顯然,OpenSSL 忽略了我們的配置文件中與 V3 擴展相關的部分,並且不會執行 v3 擴展,除非您在實際的 CA 簽名步驟中告訴它正確…

這是傳遞給openssl req命令的配置文件數據:

[ req ]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = v3_req

[ dn ]
C=US
ST=Pennsylvania
L=Somewhere
O=No Man's Land
OU=Internal
CN = chat.foo.bar.baz

[ v3_req ]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage=serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1   = chat.foo.bar.baz
DNS.2   = chat
DNS.3   = 10.1.2.151

以下的標準呼叫不尊重 v3 擴展:

openssl req -new -sha256 -out cert.csr -key cert.key -config csrgen.cnf

…但是,這個確實有效:

openssl req -new -sha256 -out cert.csr -key cert.key -config csrgen.cnf -extensions v3_req

…並且在使用 CA簽署證書時,我們必須使用類似的東西,從我們儲存所有站點證書的位置執行此操作(包括 CSR 和密鑰,用於首先生成證書 - CA 證書和密鑰在我們系統的單獨/certauthority/...部分中):

openssl x509 -req -days 3650 -in ./cert.csr -CA /certauthority/certs/cacert.pem -CAkey /certauthority/private/cakey.pem -CAserial /certauthority/CA/serial -CAcreateserial -out certificate.crt -extfile csrgen.cnf -extensions v3_req

此命令正確地將 v3 副檔名放入證書中,否則會以某種方式忽略文件中的實際副檔名。這反過來又解決了 CN 和 SAN 問題,現在系統將證書返回為內部站點和(大多數)內部服務的“有效”證書。

引用自:https://serverfault.com/questions/889351