
Quiero ejecutar esta URL:https://192.168.1.254y obtenga un sitio web con el contenido correcto y el certificado en la barra de direcciones. Estoy accediendo al sitio web pero aparece un error de certificado no válido en la barra de direcciones porque el certificado se tomó de un bloque de servidor diferente: el bloque de servidor predeterminado000-default.conf.
¿Alguien puede explicarme este comportamiento por favor?
El navegador de mi cliente es Google Chrome versión 87.0.4280.88 (compilación oficial) (64 bits)
Mi servidor Nginx es:
root@OpenWrt:/etc/nginx/conf.d# nginx -V
nginx version: nginx/1.19.4 (x86_64-pc-linux-gnu)
built with OpenSSL 1.1.1h 22 Sep 2020
TLS SNI support enabled
Creo que el problema está relacionado con cómo el SNI aparentemente no permitea Direcciones IPv4 e IPv6 literales como "Nombre de host". ¿Pero es ese el caso realmente?
Tengo un bloque de servidor predeterminado000-default.confcomo esto:
server {
server_name _;
listen 80 default_server;
listen 443 ssl default_server;
## To also support IPv6, uncomment this block
# listen [::]:80 default_server;
# listen [::]:443 ssl default_server;
ssl_certificate '/etc/nginx/conf.d/_lan.crt';
ssl_certificate_key '/etc/nginx/conf.d/_lan.key';
return 404; # or whatever
}
Y otro servidor llamado luci-http.conf así:
server {
listen 80;
listen [::]:80;
server_name openwrt.lan 192.168.1.254;
# access_log /proc/self/fd/1 openwrt; # use logd (init forwards stdout).
include conf.d/*.locations;
}
cuando pusehttp://192.168.1.254en la barra de direcciones me muestra la página web correcta.
También tengo este servidor https: luci-https.conf
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name openwrt.lan 192.168.1.254;
#include '/var/lib/nginx/lan_ssl.listen.default';
ssl_certificate '/etc/nginx/conf.d/_lan.crt';
ssl_certificate_key '/etc/nginx/conf.d/_lan.key';
ssl_session_cache 'shared:SSL:32k';
ssl_session_timeout '64m';
# access_log /proc/self/fd/1 openwrt; # use logd (init forwards stdout).
include conf.d/*.locations;
}
cuando pusehttps://192.168.1.254en la barra de direcciones me muestra la página web correcta y el certificado en_lan.crt. Como puede ver, tengo el mismo par de certificado/clave en este y en el bloque de servidor predeterminado.
Sin embargo, cuando elimino esa dirección IP como nombre_servidor deluci-https.confy agréguelo como nombre_servidor en:misitio.lan.confNo veo el mismo comportamiento.
server {
listen 443 ssl;
listen [::]:443 ssl;
#listen 192.168.1.254 ssl;
#include '/var/lib/nginx/lan_ssl.listen';
server_name mysite.lan www.mysite.lan fun.mysite.lan 192.168.1.254;
root /www/mysite;
index index.html index.htm index.nginx-debian.html;
ssl_certificate '/etc/nginx/conf.d/mysite.lan.crt';
ssl_certificate_key '/etc/nginx/conf.d/mysite.lan.key';
ssl_session_cache 'shared:SSL:32k';
ssl_session_timeout '64m';
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/mysite.lan.access.log;
error_log /var/log/nginx/mysite.lan.error.log;
}
Ahora cuando pongohttps://192.168.1.254en la barra de direcciones me muestra la página web correcta pero nuevamente el certificado en_lan.crtno el certificado:misitio.lan.crtdemisitio.lan.confcomo se esperaba.
Cuando pongo..
ssl_certificate '/etc/nginx/conf.d/mysite.lan.crt';
ssl_certificate_key '/etc/nginx/conf.d/mysite.lan.key';
en el bloque del servidor predeterminado000-default.confentonces obtengo ese certificado cuando pongohttps://192.168.1.254en la barra de direcciones del navegador si 192.168.1.254 está especificado como nombre_servidor enluci-https.confomisitio.lan.conf.
Entonces parece que SNI coincidirá con un "nombre de host" que es una dirección IP pero toma el certificado del bloque del servidor predeterminado. ¿Porqué es eso?
Respuesta1
... SNI aparentemente no permite direcciones IPv4 e IPv6 literales como "Nombre de host". ¿Pero es ese el caso realmente?
La idea detrás de SNI es distinguir entre múltiples dominios en la misma dirección IP. Hasta ahora, usar SNI con una dirección IP realmente no tiene sentido. Por lo tanto, también está restringido a nombres de host reales. Para citar deRFC 6066:
"HostName" contiene el nombre completonombre de host DNSdel servidor, tal como lo entiende el cliente. ... Las direcciones IPv4 e IPv6 literales no están permitidas en "HostName"
server_name mysite.lan www.mysite.lan fun.mysite.lan 192.168.1.254;
...
Entonces parece que SNI coincidirá con un "nombre de host" que es una dirección IP pero toma el certificado del bloque del servidor predeterminado.
Dado que SNI solo se usa para nombres de host reales, no habrá SNI dentro del protocolo de enlace TLS y, por lo tanto, se usa la configuración HTTPS predeterminada. Dentro de HTTPS existe el protocolo HTTP que incluye el Host
encabezado. Dado que el Host
encabezado especifica la dirección IP (porque la URL lo hace), coincidirá con este host virtual específico. Por lo tanto: certificado incorrecto, contenido correcto.