Ricevo il seguente errore quando provo a verificare la catena di certificati di una radice fittizia / intermediario / terminale PKI.
root generato come segue:
mkdir {root,inter,end}
cfssl print-defaults config > root/root-config.json
cfssl print-defaults csr > root/root-csr.json
cfssl genkey -initca root/root-csr.json | cfssljson -bare root/root
e intermediario:
cfssl print-defaults config > inter/inter-config.json
cfssl print-defaults csr > inter/inter-csr.json
cfssl genkey -initca inter/inter-csr.json | cfssljson -bare inter/inter
firma l'intermediario con la radice:
cfssl sign -ca root/root.pem -ca-key root/root-key.pem inter/inter.csr | cfssljson -bare inter/inter
Posso verificare il certificato intermedio:
openssl verify -CAfile root/root.pem inter/inter.pem
inter/inter.pem: OK
Quindi crea il certificato dell'utente finale:
cfssl print-defaults csr > end/end-csr.json
cfssl genkey end/end-csr.json | cfssljson -bare end/end
cfssl sign -ca inter/inter.pem -ca-key inter/inter-key.pem end/end.csr | cfssljson -bare end/end
Posso raggruppare la catena di certificati:
mkbundle root/root.pem inter/inter.pem
E verifica il cert intermedio contro di esso (obv)
openssl verify -CAfile cert-bundle.crt inter/inter.pem
inter/inter.pem: OK
ma quando provo a verificare che il certificato finale sia un certificato valido in quella catena:
openssl verify -CAfile cert-bundle.crt end/end.pem
Ho ricevuto il seguente errore:
C = US, ST = CA, L = San Francisco, CN = example.net
error 7 at 0 depth lookup: certificate signature failure
error end/end.pem: verification failed
139745623078144:error:0D0C5006:asn1 encoding routines:ASN1_item_verify:EVP lib:../crypto/asn1/a_verify.c:174:
Sto usando il csr e le configurazioni di default:
CSR:
{
"CN": "example.net",
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"ST": "CA",
"L": "San Francisco"
}
]
}
così come le configurazioni di CA predefinite:
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
Sembra che il certificato finale non sia codificato correttamente per openssl verify
. Questo potrebbe avere qualcosa per me non cambiare i nomi dei soggetti nel CSR. Ma era curioso se questo fosse un problema comune o io stavo usando gli strumenti sbagliati.
EDIT: Sono abbastanza sicuro che ci siano alcune cose che sto facendo male:
- hai solo bisogno di 1 config per la catena di certificati
- invece di utilizzare
cfssl genkey
usacfssl gencert
e specifica l'autorità di certificazione che stai emettendo il CSR per - aggiungi "segno cert" come "utilizzo" nel profilo
- usa nomi comuni univoci
Non ho risolto i problemi esatti con questo metodo, ma questo articolo del blog ha prodotto per me un certificato valido: