
Tengo una aplicación estática en Amazon S3 que se sirve a través de un proxy NGINX. El propósito que uso un proxy es permitir a los usuarios apuntar sus dominios a mi instancia de Amazon EC2 (a través del registro CNAME que apunta a custom-domain.myproduct.com
) para que puedan acceder a mi aplicación a través de su propia URL personalizada como esta: myproduct.happyclient.com
.
Para lograr esto, tengo la siguiente configuración de nginx (partes eliminadas por brevedad):
http {
server {
# This is my default route. References:
# http://stackoverflow.com/a/15799883/91403
# http://nginx.org/en/docs/http/request_processing.html
listen 80 default_server;
server_name custom-domain.myproduct.com;
location / {
proxy_pass http://static.myproduct.com; # points to Amazon S3
proxy_set_header Host myproduct.com;
}
}
Aunque mi aplicación estática es 100% pública (sin secreto de cliente, solo html y javascript), algunos de mis clientes quieren acceder a ella a través de SSL. ¿Cómo puedo elegir dinámicamente qué certificado usar para la conexión SSL según el encabezado del Host? Tenga en cuenta que no puedo simplemente codificar la ruta del certificado.
PD.: Los clientes podrán subir sus certificados a mi instancia
ps2.: Esta configuración ya funciona perfectamente solo con HTTP.
lo que he probado
He intentado algo como esto, sin éxito:
server {
listen 443 default_server;
server_name custom-domain.myproduct.com;
ssl on;
ssl_certificate /etc/nginx/ssl/$http_host/server.crt; # note the http_host variable
ssl_certificate_key /etc/nginx/ssl/$http_host/server.key; # also here
}
Respuesta1
¿Cómo puedo elegir dinámicamente qué certificado usar para la conexión SSL según el encabezado del Host?
El encabezado Host es parte del protocolo HTTP, pero HTTPS es HTTP integrado en una conexión SSL. Lo que significa que primero debe establecer la conexión SSL (que necesita el certificado) antes de tener acceso al encabezado del Host.
Si el cliente admite SNI (todos los navegadores modernos lo hacen, pero IE/XP no), ya enviará el nombre del destino dentro del protocolo de enlace SSL. El suministro de diferentes certificados según el nombre de destino generalmente se realiza con diferentes secciones del servidor en nginx. Puede intentar utilizar $ssl_server_name
dentro de la sección predeterminada, pero no estoy seguro de que funcione e incluso si funciona, podría afectar optimizaciones como el almacenamiento en caché de sesiones de forma negativa.