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
**:**:**:**:**:**:**:**