Por que o OpenVPN fornece o erro: “propósito de certificado não suportado” para um certificado intermediário?

6

EDIT: Eu realmente sinto muito por ter que dizer que o problema se consertou magicamente e eu não tenho idéia do porquê. Em resposta a uma das respostas, removi todos os EKU da cadeia CA e não funcionou. Depois de voltar de férias, eu criei a cadeia de cert 1 por vez, ie. RootCA->VPN then RootCA->IntermediateCA->VPN e, finalmente, RootCA->IntermediateCA->ServerCA->VPN e ainda funcionou! Eu não tenho idéia do porque estava funcionando, mas fiquei emocionada. Só para ter absoluta certeza de que foi a remoção do EKU que resolveu, eu voltei e adicionei EKU aleatório para CAs na cadeia e, eis que, ainda funciona .... Isso é absolutamente irritante e peço desculpas a todas as pessoas que tentaram ajudar. Eu juro, absolutamente nada mudou e ninguém tocou em nada na minha ausência. END EDIT

Ao tentar conectar um cliente OpenVPN (Android ou Windows 7/10) ao meu servidor de teste, recebo o seguinte erro:

VERIFY ERROR: depth=1, error=unsupported certificate purpose: C=CA, ST=QC, L=Montreal, O=Company Inc, OU=PKI, CN=Server Certificate Authority

Estou executando o OpenVPN 2.3.7 no OpenBSD. Estou usando a seguinte hierarquia de CA da PKI criada usando o XCA :

RootCA -> IntermediateCA -> ServerCA

Eu criei um certificado para o meu servidor VPN que é assinado pelo meu ServerCA. Por favor, note a profundidade = 1 . Isso não parece ser um problema com o certificado final do servidor VPN. O OpenVPN está reclamando do emissor do certificado do servidor VPN. Mesmo o CN na mensagem de erro é o do ServerCA NOT do servidor vpn.

Até onde eu consegui determinar, não há exigência de que uma AC na cadeia tenha outro propósito além de assinar certificados.

Aqui está a configuração do certificado do servidor VPN. Observe que a antiga extensão do servidor Netscape está lá, conforme exigido pelo OpenVPN:

nsCertType=server, email
extendedKeyUsage=serverAuth, nsSGC, ipsecEndSystem, iKEIntermediate
keyUsage=digitalSignature, keyEncipherment, dataEncipherment, keyAgreement
authorityKeyIdentifier=keyid, issuer
subjectKeyIdentifier=hash
basicConstraints=CA:FALSE

Aqui está a configuração do certificado da CA de emissão:

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

Eu tentei adicionar nsCertType=server ao ServerCA, mas não houve alteração.

Também vi inúmeros posts nos fóruns onde as pessoas se esqueceram de adicionar a extensão nsCertType e receberam um erro semelhante ao meu, mas com depth=0 . No meu caso, o certificado do servidor parece estar bem.

Alguém pode me dizer por que o OpenVPN se importa com o que uma CA na cadeia pode fazer (além de assinar certs, obviamente)? Como posso ver qual "propósito do certificado" o cliente estava esperando? Como posso fazer com que o OpenVPN aceite a cadeia de certificados?

Conforme solicitado, aqui está o certificado do servidor 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
        **:**:**:**:**:**:**:**

E aqui está o certificado do emissor:

$ 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
         **:**:**:**:**:**:**:**
    
por succulent_headcrab 20.06.2016 / 21:47

3 respostas

2

É o EKU (extensão ExtendedKeyUsage)

rfc 5280 4.2.1.12 extKeyUsage diz

In general, this extension will appear only in end entity certificates.

Requisitos de linha de base do CABforum (v1.3.4) 7.2.2 g afirma isso, mas junto com 7.1.5 permite um caso:

For a Subordinate CA Certificate to be considered Technically Constrained, the certificate MUST include an Extended Key Usage (EKU) extension specifying all extended key usages that the Subordinate CA Certificate is authorized to issue certificates for. The anyExtendedKeyUsage KeyPurposeId MUST NOT appear within this extension.

EKU, portanto, não é uma restrição ao uso pela CA de sua própria chave, mas no uso de chaves EE com certificados sob a CA. Isso é semelhante à maneira como as políticas (principalmente) e NameConstraints se propagam para baixo, e ao contrário de KeyUsage que faz se aplica à própria CA.

E é isso que o OpenSSL implementa e, portanto, o OpenVPN usando o OpenSSL. Em cada certificado de autoridade de certificação em uma cadeia de servidores, se EKU estiver presente, deve incluir serverAuth ou SGC . Da mesma forma, cada certificado de CA em uma cadeia de clientes com EKU deve incluir clientAuth.

Sua AC intermediária acima do servidor tem EKU com OCSPSign, mas não serverAuth, por isso é rejeitada.

Referência: crypto/x509/x509_vfy.c e crypto/x509v3/v3_purp.c em openssl-1.0.2h

    
por 23.06.2016 / 17:23
3

Hmm, o easyrsa do OpenVPN cria certificados como este:

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

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

Servidor:

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

Cliente:

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

Mas você também tem esses valores de uso de chave, então sua configuração deve estar funcionando ... Mas não há CA intermediária ...

Você tentou definir - ca como o certificado raiz da CA e definir - extra-certs como a CA intermediária e - cert para o servidor cert para formar uma cadeia completa? E não esqueça - chave também.

Na verdade, estou trabalhando:

Servidor:

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

Cliente:

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

Servidor conf:

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

Conf do cliente:

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

    
por 21.06.2016 / 01:35
1

Eu tive um problema parecido com stunnel e openssl no linux

Descobri que o lado do servidor esperava que todos os certificados de cliente e CA incluíssem: Uso de chave estendida:                 Autenticação de Cliente Web TLS

E, descobri que o lado do cliente esperava que todos os servidores e certificados da CA fossem incluídos: Uso de chave estendida X509v3:                 Autenticação do Servidor Web TLS

Como eu estava usando as mesmas CAs para assinar os certificados do cliente e do servidor que testei, definindo os certificados CA, CA1 e CA2 para incluir clientAuth e serverAuth e corrigir o problema.

CA, CA1 e CA2:             Uso de chave estendida X509v3:                 Autenticação do Cliente Web TLS, Autenticação do Servidor Web TLS

certificado do cliente:             Uso de chave estendida X509v3:                 Autenticação de Cliente Web TLS

certificado do servidor:             Uso de chave estendida X509v3:                 Autenticação do Servidor Web TLS

    
por 27.04.2018 / 23:37