Ssl-Certificate

為什麼 OpenVPN 會給出錯誤:中間證書的“不支持的證書用途”?

  • April 24, 2021

編輯:我真的很抱歉不得不說這個問題已經神奇地解決了,我不知道為什麼。針對其中一個答案,我從 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.ccrypto/x509v3/v3_purp.c在 openssl-1.0.2h

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