內部網路 CA:“無效的公用名”或所有內容的無效證書(Internet Explorer 和 Windows 的證書 mmc 管理單元除外)
我們在混合的 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 問題,現在系統將證書返回為內部站點和(大多數)內部服務的“有效”證書。