Recibo el siguiente error al intentar verificar la cadena de certificados de una raíz ficticia / intermediario / final PKI.
raíz generada de la siguiente manera:
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 el intermediario con la raíz:
cfssl sign -ca root/root.pem -ca-key root/root-key.pem inter/inter.csr | cfssljson -bare inter/inter
Puedo verificar el certificado intermediario:
openssl verify -CAfile root/root.pem inter/inter.pem
inter/inter.pem: OK
Luego cree el certificado de usuario final:
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
Puedo empaquetar la cadena de certificados:
mkbundle root/root.pem inter/inter.pem
Y verifique el certificado de intermediario en su contra (obv)
openssl verify -CAfile cert-bundle.crt inter/inter.pem
inter/inter.pem: OK
pero cuando intento verificar que el certificado final es un certificado válido en esa cadena:
openssl verify -CAfile cert-bundle.crt end/end.pem
Recibo el siguiente error:
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:
Estoy usando los valores y configuraciones predeterminados de csr:
csr:
{
"CN": "example.net",
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"ST": "CA",
"L": "San Francisco"
}
]
}
así como las configuraciones de CA predeterminadas:
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
Parece que el certificado final no está codificado correctamente para openssl verify
. Esto podría tener algo que no cambie los nombres de los sujetos en la CSR. Pero tenía curiosidad por si se trataba de un problema común o si utilizaba mal las herramientas.
EDITAR: Estoy bastante seguro de que hay algunas cosas que estoy haciendo mal:
- solo necesitas 1 config para la cadena de certificados
- en lugar de usar
cfssl genkey
usecfssl gencert
y especifique la autoridad de certificación para la que está emitiendo el CSR - agregue 'certificado' como "uso" en el perfil
- usar nombres comunes únicos
No resolví los problemas exactos con este método, pero este artículo del blog produjo un certificado válido para mí: