Creé una Autoridad de certificación raíz autofirmada para algunos servicios internos en nuestra empresa, que configuré yo mismo (principalmente servido a través de HTTPS). Luego creé certificados para esos servicios, firmados con esta CA.
Ahora quiero agregar una extensión x509 (punto de distribución CRL) a la CA raíz sin invalidar los certificados de servidor existentes emitidos por esta CA. es posible?
Mi instinto es "sí" porque, según tengo entendido, el acceso a la clave privada correspondiente es necesario y suficiente para una "plena autoridad" sobre la identidad del certificado. Es decir, a menos que haya algún tipo de nonce incorporado junto con la clave pública en el certificado cuando se genera (probablemente).
Todavía soy bastante nuevo en la administración de certificados SSL, pero (creo que) entiendo los conceptos básicos de la cadena de confianza estándar. También me siento cómodo con el uso básico de otras criptomonedas PKI: administro claves SSH y uso GPG para firmar y cifrar. Estudié Ciencias de la Computación, aunque solo soy un aficionado autodidacta en criptografía.
Nunca hice una CSR para el IIRC original (creo que fue la salida directa de openssl req -new -x509
). Todavía tengo la clave privada de la CA original, por supuesto, y al usarla pude "revertir" el certificado original en una Solicitud de firma de certificado:
openssl x509 -x509toreq -in MyCA.pem -out MyCA.csr -signkey private/MyCA.key
Esperaba que esto efectivamente "extrajera" el nonce mencionado anteriormente, y me permitiera volver a crear el certificado, pero esta vez con un crlDistributionPoints
campo, y en consecuencia todos los certificados que se firmaron con la CA original aún se validarían contra esta nueva CA, con la excepción que los clientes recuperarían mi archivo CRL (actualmente vacío) de la URL HTTP designada en el campo.
Entonces hice un archivo de configuración de extensión ext.conf
:
[ cert_ext ]
subjectKeyIdentifier=hash
crlDistributionPoints=URI:http://security.mycompany.co.za/root.crl
Y generé la nueva versión de la CA raíz de la CSR:
openssl x509 -extfile ./ext.conf -extensions cert_ext -req -signkey private/MyCA.key -in MyCA.csr -out MyNewCA.pem
Ahora cuando veo el certificado con openssl x509 -text -in MyNewCA.pem | less
Puedo ver la parte de extensión de CRL:
X509v3 extensions:
X509v3 Subject Key Identifier:
82:D0:01:03:49:FF:30:16:FA:DC:0A:1E:C1:8C:3D:66:A1:78:FF:F8
X509v3 CRL Distribution Points:
Full Name:
URI:http://security.mycompany.co.za/root.crl`
¡Pero Ay! Mis certificados firmados anteriormente ya no se validan con respecto a este:
openssl verify -verbose -CAfile MyCA.pem git.pem
git.pem: OK
openssl verify -verbose -CAfile MyNewCA.pem git.pem
git.pem: <redacted DN>
error 20 at 0 depth lookup:unable to get local issuer certificate
Principalmente estoy buscando más información sobre cómo funcionan los certificados y por qué. Pero también agradecería una solución al problema que condujo a este, así que aquí hay información de fondo también.
Cómo me metí en este lío: HTTPS para servicios internos funciona muy bien una vez que mi CA está instalada a través de Explorer RMB → Instalar GUI de certificado en Windows, o /usr/local/share/ca-certificates
seguido por update-ca-certificates
Debian y Ubuntu. Pero recientemente me encontré con una excepción: Git en Windows, específicamente si está instalado para usar Windows Secure Channel como back-end SSL. Que aparentemente por defecto insiste en que debe haber un campo CRL en los certificados SSL.
Así que supongo que es realmente un problema de Windows Secure Channel porque el mensaje de error con el que me encuentro parece completamente específico de Microsoft: fatal: unable to access 'https://[email protected]/gitblit/r/secret_project.git/': schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - The revocation function was unable to check revocation for the certificate.
Si instalo Git con OpenSSL y concateno manualmente mi CA en el archivo señalado por git.http.sslcainfo, entonces funciona, pero me temo que mis usuarios se verán inclinados a no verificar la identidad SSL si creen que este proceso es más difícil que haciendo clic en la GUI "fácil" del instalador de certificados de Windows.
fuente
-x509toreq
recuperara toda la información única de la CA raíz existente, pero o no lo hace o hay algo mal con mi proceso desde allí.req -new -x509
yx509 -req -signkey
ambos predeterminan la serie del certificado autofirmado a un número aleatorio (aunque esto puede anularse) efectivamente un nonce. Si su certificado de hijo (o cualquiera de ellos) contiene AuthorityKeyIdentifier utilizando la opción 'emisor + serie' (en lugar de o además de la opción 'keyid'), que será el caso si lo usóca
con el archivo de configuración predeterminado ascendente, necesita crear la nueva raíz con la misma serie que la anterior; uso-set_serial
. ...Respuestas:
Dos certificados se consideran iguales siempre que coincidan el Nombre del sujeto y la Clave pública de los certificados.
Por lo tanto, todo lo que necesita hacer es reutilizar las claves y asegurarse de que el Nombre del sujeto en el nuevo certificado sea el mismo que el anterior. Después de eso, puede cambiar cualquiera de los otros campos y / o extensiones y el certificado resultante se considerará igual.
Por ejemplo, cree su archivo de configuración de OpenSSL:
y guardarlo como por ejemplo
rootca.cnf
. Asegúrese de que los elementos[req_distinguished_name]
son idénticos a los de su certificado original de CA raíz (esta es la parte idéntica del nombre del sujeto).A continuación, ejecute:
donde
rootca.key
está la clave privada utilizada en el certificado original (esta es la parte idéntica de clave pública / privada).Esto crea
MyNewCA.pem
, que puedes consultar con:Use este nuevo certificado en lugar del original.
Puede cambiar otros campos y extensiones, como el período de validez del certificado, pero tenga en cuenta que realmente no debería tener ninguna restricción (aparte de
basicConstraints = critical,CA:true
) en el certificado de CA raíz.Después de una consideración adicional, su problema puede deberse simplemente al hecho de que su certificado de CA raíz de reemplazo no tiene la
basicConstraint
y posiblemente laskeyUsage
extensiones. Puede valer la pena intentar agregar esas dos extensiones a suext.conf
primera y probar el nuevo certificado resultante de CA raíz utilizando el-x509toreq
método que publicó.fuente