为什么 OpenVPN 会给出错误:中间证书的“不支持的证书用途”?

suc*_*rab 7 openvpn pki ssl-certificate

编辑:我真的很抱歉不得不说这个问题已经神奇地自我修复了,我不知道为什么。作为对其中一个答案的回应,我从 CA 链中删除了所有 EKU,但它不起作用。度假回来后,我一次创建了证书链1,即。RootCA->VPN然后RootCA->IntermediateCA->VPN,最后,RootCA->IntermediateCA->ServerCA->VPN它仍然有效!我不知道它为什么起作用,但我很兴奋。只是为了绝对确定是删除 EKU 解决了这个问题,我回去向链中的 CA 添加了随机 EKU,瞧,它仍然有效......这绝对令人愤怒,我向你道歉所有试图提供帮助的人。我发誓,在我不在的情况下,绝对没有其他任何改变,也没有人碰过任何东西。结束编辑

尝试将 OpenVPN 客户端(Android 或 Windows 7/10)连接到我的测试服务器时,我收到以下错误:

验证错误:深度=1,错误=不支持的证书用途:C=CA、ST=QC、L=Montreal、O=Company Inc、OU=PKI、CN=Server Certificate Authority

我在 OpenBSD 上运行 OpenVPN 2.3.7。我正在使用使用XCA创建的以下 PKI CA 层次结构:

RootCA -> IntermediateCA -> ServerCA
Run Code Online (Sandbox Code Playgroud)

我为我的 VPN 服务器创建了一个由我的 ServerCA 签名的证书。请注意 depth=1。这似乎不是最终 VPN Server 证书的问题。OpenVPN是抱怨发行的VPN服务器证书。甚至错误消息中的 CN 是 ServerCA 的 CN,而不是 vpn 服务器的 CN。

据我所知,除了签署证书之外,链中的 CA 没有任何其他目的。

这是 VPN 服务器的证书配置。请注意,旧的 Netscape 服务器扩展在那里,这是 OpenVPN 所要求的:

nsCertType=server, email
extendedKeyUsage=serverAuth, nsSGC, ipsecEndSystem, iKEIntermediate
keyUsage=digitalSignature, keyEncipherment, dataEncipherment, keyAgreement
authorityKeyIdentifier=keyid, issuer
subjectKeyIdentifier=hash
basicConstraints=CA:FALSE
Run Code Online (Sandbox Code Playgroud)

这是颁发 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
Run Code Online (Sandbox Code Playgroud)

我尝试添加nsCertType=server到 ServerCA,但没有任何变化。

我还看到过无数论坛帖子,其中人们忘记添加 nsCertType 扩展并收到与我类似的错误,但depth=0改为使用。就我而言,服务器的证书似乎没问题。

谁能告诉我为什么 OpenVPN 关心允许链上的 CA 做什么(显然,除了签署证书)?我如何才能看到客户期望的“证书目的”?如何让 OpenVPN 接受证书链?

根据要求,这里是 VPN 服务器的证书:

$ 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
        **:**:**:**:**:**:**:**
Run Code Online (Sandbox Code Playgroud)

这是发行人的证书:

$ 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
         **:**:**:**:**:**:**:**
Run Code Online (Sandbox Code Playgroud)

Dil*_*yin 5

嗯,OpenVPN 的 easyrsa 创建证书是这样的:

CA1:

X509v3 Subject Key Identifier:
87:13:73:D4:7C:9A:E1:EA:9A:F8:90:48:93:18:5A:B0:AF:B9:B6:25
X509v3 Authority Key Identifier:
keyid:87:13:73:D4:7C:9A:E1:EA:9A:F8:90:48:93:18:5A:B0:AF:B9:B6:25
DirName:/CN=Easy-RSA CA
serial:8B:E0:6F:16:C0:46:46:FC

X509v3 Basic Constraints:
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Run Code Online (Sandbox Code Playgroud)

CA2:

X509v3 Basic Constraints:
CA:TRUE
X509v3 Subject Key Identifier:
D6:60:98:E7:6E:7C:73:9A:38:62:09:EC:C7:5D:62:15:89:AA:B2:8E
X509v3 Authority Key Identifier:
keyid:87:13:73:D4:7C:9A:E1:EA:9A:F8:90:48:93:18:5A:B0:AF:B9:B6:25
DirName:/CN=Easy-RSA CA
serial:8B:E0:6F:16:C0:46:46:FC

X509v3 Key Usage:
Certificate Sign, CRL Sign
Run Code Online (Sandbox Code Playgroud)

服务器:

X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
53:BA:B4:3B:87:AC:89:41:14:28:8F:C9:A2:F3:38:D4:43:90:EF:A6
X509v3 Authority Key Identifier:
keyid:D6:60:98:E7:6E:7C:73:9A:38:62:09:EC:C7:5D:62:15:89:AA:B2:8E
DirName:/CN=Easy-RSA CA
serial:CB:8A:25:7F:5A:8A:A9:BD:63:D2:BE:B7:6C:5E:3E:75

X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
Run Code Online (Sandbox Code Playgroud)

客户:

X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
F5:34:3A:39:C6:90:E0:2F:E3:92:A7:D2:0D:18:C7:48:E6:48:9F:DA
X509v3 Authority Key Identifier:
keyid:D6:60:98:E7:6E:7C:73:9A:38:62:09:EC:C7:5D:62:15:89:AA:B2:8E
DirName:/CN=Easy-RSA CA
serial:CB:8A:25:7F:5A:8A:A9:BD:63:D2:BE:B7:6C:5E:3E:75

X509v3 Key Usage:
Digital Signature
X509v3 Extended Key Usage:
TLS Web Client Authentication
Run Code Online (Sandbox Code Playgroud)

但是你也有这些 Key Usage 值,所以你的配置应该可以工作......但是没有中间 CA......

您是否尝试将--ca设置为根 CA 证书并将--extra-certs设置为中间 CA 并将--cert设置为服务器证书以形成完整的链?也不要忘记--key

其实我有它的工作:

服务器:

Tue Jun 21 04:39:49 2016 VERIFY OK: depth=2, CN=Easy-RSA CA
Tue Jun 21 04:39:49 2016 VERIFY OK: depth=1, O=Easy-RSA CA2, CN=Easy-RSA CA2
Tue Jun 21 04:39:49 2016 VERIFY OK: depth=0, O=client, CN=client
Run Code Online (Sandbox Code Playgroud)

客户:

Tue Jun 21 04:39:49 2016 VERIFY OK: depth=2, CN=Easy-RSA CA
Tue Jun 21 04:39:49 2016 VERIFY OK: depth=1, O=Easy-RSA CA2, CN=Easy-RSA CA2
Tue Jun 21 04:39:49 2016 VERIFY OK: depth=0, O=server, CN=server
Run Code Online (Sandbox Code Playgroud)

服务器配置:

port 1194
proto tcp-server
dev tun
ca ca1.crt
extra-certs ca2.crt
cert server.crt
key server-key.pem
dh dh.pem
tls-server
tls-auth ta.key 0
Run Code Online (Sandbox Code Playgroud)

客户端配置:

client
remote localhost 1194
port 1194
proto tcp-client
dev tun
ca ca1.crt
extra-certs ca2.crt
cert client.crt
key client-key.pem
dh dh.pem
tls-client
tls-auth ta.key 1
Run Code Online (Sandbox Code Playgroud)

XCA


dav*_*085 5

这是 EKU(ExtendedKeyUsage 扩展)

rfc 5280 4.2.1.12 extKeyUsage 说

一般来说,此扩展只会出现在最终实体证书中。

CABforum 基线要求 (v1.3.4) 7.2.2 g 确认了这一点,但与 7.1.5 一起允许一种情况:

对于被视为技术受限的从属 CA 证书,证书必须包含扩展密钥用法 (EKU) 扩展,指定从属 CA 证书有权为其颁发证书的所有扩展密钥用法。anyExtendedKeyUsage KeyPurposeId 不得出现在此扩展中。

因此,EKU 并不是对 CA 使用自己的密钥的限制,而是对 EE 使用 CA下的证书的密钥的限制。这类似于策略(大部分)和 NameConstraint 向下传播的方式,并且与适用于 CA 本身的 KeyUsage不同

这就是 OpenSSL 所实现的,因此使用 OpenSSL 的 OpenVPN 也是如此。在服务器链中的每个 CA 证书上,如果存在 EKU,则它必须包含 serverAuth 或 SGC。同样,具有 EKU 的客户端链中的每个 CA 证书都必须包含 clientAuth。

服务器上方的中间 CA 具有带 OCSPSign 的 EKU,但没有 serverAuth,因此被拒绝。

参考:crypto/x509/x509_vfy.c以及crypto/x509v3/v3_purp.copenssl-1.0.2h中