為什麼 OpenVPN 會給出錯誤:中間證書的“不支持的證書用途”?
編輯:我真的很抱歉不得不說這個問題已經神奇地解決了,我不知道為什麼。針對其中一個答案,我從 CA 鏈中刪除了所有 EKU,但它不起作用。假期回來後,我一次創建了證書鏈 1,即。
RootCA->VPN
然後RootCA->IntermediateCA->VPN
,最後,RootCA->IntermediateCA->ServerCA->VPN
它仍然有效!我不知道它為什麼會起作用,但我很激動。只是為了絕對確定是刪除了 EKU 才解決了這個問題,我回去並將隨機 EKU 添加到鏈中的 CA,你瞧,它仍然有效……這絕對令人憤怒,我向你道歉所有試圖提供幫助的人。我發誓,絕對沒有其他任何改變,在我不在的情況下,沒有人碰任何東西。結束編輯嘗試將 OpenVPN 客戶端(Android 或 Windows 7/10)連接到我的測試伺服器時,我收到以下錯誤:
驗證錯誤:深度=1,錯誤=不支持的證書用途:C=CA,ST=QC,L=蒙特利爾,O=Company Inc,OU=PKI,CN=伺服器證書頒發機構
我在 OpenBSD 上執行 OpenVPN 2.3.7。我正在使用以下使用XCA創建的 PKI CA 層次結構:
RootCA -> IntermediateCA -> ServerCA
我為我的 VPN 伺服器創建了一個由我的 ServerCA 簽名的證書。請注意 depth=1。這似乎不是最終 VPN Server 證書的問題。OpenVPN 抱怨VPN 伺服器證書的頒發者*。*甚至錯誤消息中的 CN 也不是 vpn 伺服器的 ServerCA。
據我所知,除了簽署證書之外,鏈中的 CA 不需要任何其他目的。
這是 VPN 伺服器的證書配置。請注意,根據 OpenVPN 的要求,舊的 Netscape 伺服器擴展在那裡:
nsCertType=server, email extendedKeyUsage=serverAuth, nsSGC, ipsecEndSystem, iKEIntermediate keyUsage=digitalSignature, keyEncipherment, dataEncipherment, keyAgreement authorityKeyIdentifier=keyid, issuer subjectKeyIdentifier=hash basicConstraints=CA:FALSE
這是頒發 CA 的證書配置:
crlDistributionPoints=crlDistributionPoint0_sect extendedKeyUsage=critical,OCSPSigning keyUsage=critical,keyCertSign, cRLSign authorityKeyIdentifier=keyid, issuer subjectKeyIdentifier=hash basicConstraints=critical,CA:TRUE,pathlen:0 [crlDistributionPoint0_sect] fullname=URI:http://pki.company.ca/server.crl
我嘗試添加
nsCertType=server
到 ServerCA,但沒有任何變化。我還看到無數的論壇文章,人們忘記添加 nsCertType 擴展並收到與我類似的錯誤,但
depth=0
取而代之的是。就我而言,伺服器的證書似乎沒問題。誰能告訴我為什麼 OpenVPN 關心鏈上的 CA 可以做什麼(顯然,除了簽署證書)?如何查看客戶期望的“證書目的”?如何讓 OpenVPN 接受證書鏈?
根據要求,這是 VPN Server 的證書:
$ openssl x509 -noout -text -in vpn-server.crt Certificate: Data: Version: 3 (0x2) Serial Number: 4 (0x4) Signature Algorithm: sha512WithRSAEncryption Issuer: C=CA, ST=QC, L=Montreal, O=Company Inc, OU=PKI, CN=Server Certificate Authority Validity Not Before: Jun 21 17:58:00 2016 GMT Not After : Jun 21 17:58:00 2021 GMT Subject: C=CA, ST=QC, L=Montreal, O=Company Inc, OU=VPN, CN=vpn.company.ca Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: **:**:**:**:**:**:**:** Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Subject Key Identifier: A9:EF:EB:8B:68:E2:5F:0A:5D:FC:8A:39:7D:59:BE:21:75:2A:CB:8E X509v3 Authority Key Identifier: keyid:60:F3:33:2C:F7:13:09:F8:5C:3C:B2:D1:0B:9D:7D:9E:86:6A:24:41 DirName:/C=CA/ST=QC/L=Montreal/O=Company Inc/OU=PKI/CN=Intermediate Certificate Authority serial:03 X509v3 Key Usage: Digital Signature, Key Encipherment, Data Encipherment, Key Agreement X509v3 Extended Key Usage: TLS Web Server Authentication, Netscape Server Gated Crypto, IPSec End System, 1.3.6.1.5.5.8.2.2 Netscape Cert Type: SSL Server, S/MIME Signature Algorithm: sha512WithRSAEncryption **:**:**:**:**:**:**:**
這是頒發者的證書:
$ openssl x509 -noout -text -in server-ca.crt Certificate: Data: Version: 3 (0x2) Serial Number: 3 (0x3) Signature Algorithm: sha512WithRSAEncryption Issuer: C=CA, ST=QC, L=Montreal, O=Company Inc, OU=PKI, CN= Intermediate Certificate Authority Validity Not Before: Jun 21 17:57:00 2016 GMT Not After : Jun 21 17:57:00 2026 GMT Subject: C=CA, ST=QC, L=Montreal, O=Company Inc, OU=PKI, CN= Server Certificate Authority Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: **:**:**:**:**:**:**:** Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE, pathlen:0 X509v3 Subject Key Identifier: 60:F3:33:2C:F7:13:09:F8:5C:3C:B2:D1:0B:9D:7D:9E:86:6A:24:41 X509v3 Authority Key Identifier: keyid:09:26:2E:AB:F4:C1:53:E1:10:11:DE:25:2D:20:D5:76:27:A9:FF:23 DirName:/C=CA/ST=QC/L=Montreal/O=Company Inc/OU=PKI/CN=Root Certificate Authority serial:02 X509v3 Key Usage: critical Digital Signature, Certificate Sign, CRL Sign X509v3 Extended Key Usage: critical OCSP Signing X509v3 CRL Distribution Points: Full Name: URI:http://pki.company.ca/server.crl Signature Algorithm: sha512WithRSAEncryption **:**:**:**:**:**:**:**
這是 EKU(ExtendedKeyUsage 擴展)
RFC 5280 4.2.1.12 extKeyUsage 說
一般來說,這個擴展只會出現在終端實體證書中。
CABforum Baseline Requirements (v1.3.4) 7.2.2 g 確認了這一點,但與 7.1.5 一起允許一種情況:
對於被視為技術約束的從屬 CA 證書,證書必須包含擴展密鑰使用 (EKU) 擴展,指定授權從屬 CA 證書為其頒發證書的所有擴展密鑰使用。anyExtendedKeyUsage KeyPurposeId 不得出現在此擴展中。
因此,EKU 不是限制 CA 使用其自己的密鑰,而是限制 EE 使用具有 CA證書的密鑰。這類似於策略(主要)和 NameConstraints 向下傳播的方式,並且與適用於 CA 本身的KeyUsage不同。
這就是 OpenSSL 實現的,因此使用 OpenSSL 的 OpenVPN 就是這樣做的。在伺服器鏈中的每個 CA 證書上,如果存在 EKU,它必須包含 serverAuth 或 SGC。同樣,具有 EKU 的客戶端鏈中的每個 CA 證書都必須包含 clientAuth。
您的伺服器上方的中間 CA 具有帶有 OCSPSign 但沒有 serverAuth 的 EKU,因此它被拒絕。
參考:
crypto/x509/x509_vfy.c
並crypto/x509v3/v3_purp.c
在 openssl-1.0.2h