¿Es posible restringir el uso de un certificado raíz a un dominio?


28

Mi cliente utiliza un certificado autofirmado para que una aplicación funcione. Para poder trabajar, tengo que instalar el certificado raíz que usaron para firmar el certificado.

¿Es posible configurar un certificado raíz para que solo valide para un dominio?


Podría ser solo yo, pero no estoy claro qué es lo que realmente estás preguntando. ¿Qué estado final estás tratando de lograr? Si importa su certificado raíz en la confianza de los controladores de dominio, entonces solo los sistemas bajo ese dominio podrían validar contra él ...
Gravy

Parece que está confundiendo los certificados autofirmados con el uso de una CA raíz que no es de confianza pública. Una aplicación configurada para usar un certificado autofirmado es muy mala, ya que la aplicación debería configurarse para ignorar los errores de validación del certificado. El uso de una CA raíz que no es de confianza pública es realmente bastante común.
Greg Askew

¿tiene un servidor interno de CA?
Crypt32

1
Una CA puede restringirse a ciertos dominios con restricciones de nombre , pero aplicar restricciones retroactivamente a la CA de otra persona es un asunto diferente.
Matt Nordhoff

3
no hay diferencia. También puede aplicar restricciones de nombre a una CA de terceros. Solo debe firmar un certificado de CA raíz de terceros utilizando su CA privada y publicar el certificado cruzado generado. En este caso, la cadena extranjera terminará en su cadena privada mediante un certificado cruzado restringido.
Cripta32

Respuestas:


24

Como una regla de oro:

No , implícito en confiar en el certificado de CA del cliente es la confianza en cada certificado firmado por esa CA.

No conozco ninguna aplicación / biblioteca que tenga una opción fácil que le permita, como usuario final, seleccionar que confiará en sus clientes o en cualquier otro certificado de CA solo para ciertos (sub) dominios, es decir, solo para *. example.com y * .example.org y nada más.

Mozilla tiene una preocupación similar sobre las CA patrocinadas por el gobierno como un punto de atención abierto y, por ejemplo, Chrome tiene controles adicionales incorporados para acceder a los sitios de Google, que fue la forma en que se hizo público el certificado pícaro * .google.com y el compromiso de Diginotar CA .

Pero incluso si no confía en la CA, aún puede importar / confiar en un certificado de servidor específico firmado por esa CA, lo que evitará advertencias SSL para los nombres de host en ese certificado. Eso debería hacer que su aplicación funcione sin errores ni quejas.

Excepciones:

Una opción muy infrautilizada del estándar PKI X.509v3 es la extensión de Restricciones de nombre , que permite que un certificado de CA contenga listas blancas y negras de patrones de nombres de dominio para los que está autorizado a emitir certificados.

Es posible que tenga suerte y su cliente se haya contenido cuando configuró su infraestructura PKI e incluyó esa restricción de Nombre en su certificado de CA. Luego puede importar su certificado de CA directamente y saber que solo puede validar un rango limitado de nombres de dominio.


2
@CryptoGuy: una CA interna también puede emitir certificados para dominios externos. Una vez que confía en su CA interna no hay ninguna restricción de tal manera que sólo los certificados para su propio dominio (Active Directory o DNS) example.como *.ad.example.com son válidos. Su CA interna también puede emitir certificados para *.example.bankpermitir un buen ataque de hombre en el medio y espiar sus credenciales bancarias en línea.
HBruijn

1
Bueno, "todo" no es perfectamente exacto. Hay cosas como listas de revocación de certificados. Pero eso no cambia el resultado final.
Ben Voigt

1
lo siento, estás incorrecto de nuevo. Puede restringir la CA de terceros para confiar en los certificados (de esa CA) emitidos a la lista de nombres que desee. Con respecto a su propia CA interna, supongo que la confianza es indudable. Si no confía en su propia CA, entonces algo está mal con su TI. Quiero decir que al tener una CA privada, OP puede establecer una confianza parcial a una CA de terceros (limitando los nombres en los que confían).
Crypt32

3
Para su publicación editada: incluso si la CA de terceros no tiene la extensión de Restricciones de nombre, es posible aplicarlas utilizando su propio servidor de CA interno mediante certificación cruzada. En este caso, la cadena de certificados será la siguiente: certificado SSL de hoja -> certificado cruzado -> su certificado CA -> su certificado raíz interno. El truco es que firmas CA de terceros usando tu CA interna. Y el certificado cruzado tendrá todas las restricciones requeridas.
Crypt32

1
CryptoGuy dice que esto es posible, pero encontrar detalles de implementación es un desafío. ¿Qué tal una respuesta que describe cómo se puede lograr esto? Y tal vez una discusión sobre qué plataformas admiten nameConstraints.
jorfus

17

@CryptoGuy tenía una respuesta bastante buena aquí, pero quería ampliarla.

Parafrasear:

Puede restringir la CA de terceros para confiar en los certificados (de esa CA) emitidos a la lista de nombres que desee. Incluso si la CA de terceros no tiene la extensión de Restricciones de nombre, es posible aplicarlas utilizando su propio servidor de CA interno mediante certificación cruzada. El truco es que firmas CA de terceros usando tu CA interna.

hoja SSL cert -> certificado cruzado -> su certificado de CA -> su certificado raíz interno.

Y así es como haces que funcione (usando la línea de comando de OpenSSL CA)

Crea una CA simple

openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -out root-ca.crt -keyout root-ca.key -subj "/CN=My Root CA"

Puede omitir la creación de una CA intermedia

Cree una solicitud de CA intermedia, con restricciones de nombre.

openssl req -new -days 3650 -newkey rsa:2048 -out domain-ca.req -sha256 -keyout domain-ca.key -config ossl_domain_com.cfg

Con esto en el ossl_domain_com.cfgarchivo:

[ req ]
prompt=no
distinguished_name=req_distinguished_name
req_extensions=domain_ca

[ req_distinguished_name ]
CN=somedomain.com trust CA

[ domain_ca ]
basicConstraints=critical,CA:true,pathlen:1
nameConstraints=critical,permitted;DNS:.somedomain.com

Luego, firme ese dominio intermedio CA con su CA.

openssl x509 -req -in domain-ca.req -CA root-ca.crt -CAkey root-ca.key -sha256 -set_serial 1 -out domain-ca.crt -extensions domain_ca -extfile ossl_domain_com.cfg

Si omitió la creación del intermedio, use su CA raíz para firmar

Ahora vuelva a firmar la CA del dominio original bajo su autoridad, utilizando su certificado. Puede agregar las extensiones de CA aquí.

openssl x509 -in third_party_ca.crt -CA domain-ca.crt -CAkey domain-ca.key -set_serial 47 -sha256 -extensions domain_ca -extfile ossl_domain_com.cfg -out domain-cross-ca.crt

Es posible que necesite usar el -x509-to-reqargumento para crear una solicitud, que firmaría exactamente de la misma manera que el intermedio anterior.

Ahora, agregue su CA raíz, CA intermedia y el dominio-cross-ca a la base de datos de confianza de su navegador.


2
MacOS no es compatible con nameConstraints. Simplemente FIY para cualquier persona que trabaje en una CA interna con nombre restringido. security.stackexchange.com/questions/95600/… archive.is/6Clgb
jorfus

P: ¿Cuál es el estado de esta solución? ¿En qué sistemas funciona hoy en día (2018)? // He querido esto cada vez que me veo obligado a instalar otro certificado autofirmado de otra compañía; y cada vez que pienso en la oficina de correos de Hong Kong o Symantec. // Creo que podría no importarme que nadie implemente el estrechamiento así descrito, siempre que no implementen accidentalmente un ensanchamiento.
Krazy Glew

@KrazyGlew Tengo un archivo por lotes que uso para esto, y todavía lo uso con regularidad. De vez en cuando tengo que volver a emitir los certificados intermedios a medida que caducan o rotan, por lo que es un poco más manual, pero no ha sido un problema. Ocasionalmente me encuentro con sitios administrados por la autoridad en los que mi navegador no puede confiar debido al uso de una Autoridad intermedia diferente, o un nombre de dominio adicional que han agregado, en el cual el mío no confía.
davenpcj

2
Lo acabo de usar con éxito, gracias. Funciona muy bien sin el certificado intermedio, ¿hay alguna ventaja en usar uno? Además, la basicConstraintslínea en el archivo de configuración parece hacer que la extensión de restricciones se incluya dos veces en el certificado, lo que hace que Firefox rechace el certificado con un mensaje de error críptico. Creo que se puede quitar con seguridad.
wrtlprnft

Me aparece un error en el último paso: error with certificate to be certified - should be self signed. ¿Qué significa y cómo resolver esto? pastebin.ubuntu.com/p/QHhpQh2N6J
mymedia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.