Vengo de un fondo de DEV, pero trato de mejorar mis habilidades de sec/ops para volverme más versátil.
Configuré mi propia autoridad de certificación local siguiendo esta guía (aunque de manera bastante imprecisa).
Creé con éxito un par raíz (clave y certificado), un par intermedio y un par de servidores para test.mydomain.com.
Luego configuré nginx como un proxy de servicio para una API web de Node.js (servida por Express FWIW). Tanto nginx como el servicio nodejs están en contenedores y solo estoy usando docker-compose para ejecutar esto localmente. También agregué una entrada de hosts para poder acceder a mi servicio usando test.mydomain.com. Eventualmente, quiero implementar el patrón service-proxy/sidecar en Kubernetes (donde nginx y el (micro) servicio se ejecutan en el mismo pod), pero por ahora solo intento que funcione en Docker.
Todo funcionaba a través de HTTP, por lo que el siguiente paso es hacerlo funcionar para HTTPS (donde TLS termina en el proxy del servicio nginx y la solicitud luego se envía al servicio Node.js a través de HTTP). Está funcionando, pero no puedo hacer que mi navegador (Chrome se ejecuta en Windows) acepte mi certificado.
Probé algunas combinaciones de importación de certificados en las tiendas de certificados de Windows, que incluyen:
pero no consigo que Chrome acepte mi certificado.
FYI nginx está configurado de la siguiente manera
ssl_certificate /etc/ssl/test.mydomain.com.cert.pem; ssl_certificate_key /etc/ssl/private/test.mydomain.com.key.pem; ¿Debo encadenar los certificados de servidor, intermedio y raíz para la configuración de ssl_certificate en nginx? ¿Y qué certificado (o certificado encadenado) debo importar a qué almacén de certificados?
También noté que hay una configuración de nginx ssl_trusted_certificate , que no estoy seguro de si debería usar...
Saludos, Ryan.
Ok, finalmente conseguí que todo funcionara. Había algunas cosas...
Primero logré que todo funcionara en Firefox, pero Chrome seguía fallando. Esta era la pista que necesitaba: resulta que Chrome requiere certificados para incluir uno o más Nombres alternativos del sujeto en lugar de solo un Nombre común (que evidentemente es aceptable para Firefox).
Tuve que configurar Nombres alternativos del sujeto cuando creé y firmé la solicitud de certificado.
El resto fue bastante fácil.
En nginx, ssl_certificate apunta a un certificado encadenado (certificado de servidor + certificado intermedio).
y luego tuve que importar el certificado raíz a las CA raíz de confianza para la computadora local.
Reinicie Chrome y listo: