Habilite HTTPS en su servidor Nginx o Tengine mediante la instalación de un certificado SSL. Esta guía le explica cómo descargar el certificado, abrir el puerto 443, configurar el bloque de servidor de Nginx y comprobar el resultado.
Lo que logrará:
Descargar el paquete del certificado desde la consola de SSL Certificates y cargarlo en su servidor
Abrir el puerto 443 en su security group y en el firewall del sistema
Agregar un bloque de servidor HTTPS a la configuración de Nginx
Recargar Nginx y confirmar que el certificado funciona correctamente
Estos pasos también aplican para Tengine, ya que es compatible con las configuraciones de Nginx.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un certificado SSL emitido por una autoridad certificadora (CA) de confianza. Si el certificado expiró o está por expirar, renuévelo primero
Una cuenta
rooto una cuenta con privilegios desudoen el servidorUn registro DNS del dominio configurado para resolver a la dirección IP pública del servidor
Un certificado que cubra todos los dominios que desea proteger
Reglas de cobertura de dominios:
|
Coverage type |
What it protects |
What it does not protect |
|
Coincidencia exacta ( |
Solo |
|
|
Coincidencia exacta ( |
Solo |
El dominio raíz u otros subdominios |
|
Comodín ( |
Subdominios de primer nivel: |
Dominio raíz |
Para proteger un subdominio multinivel comoa.b.example.com, el campo Bound Domains debe contener el dominio exacto o un comodín correspondiente, como*.b.example.com.
Para agregar o cambiar nombres de dominio, purchase a commercial certificate o append and replace domain names.
Paso 1: Preparar el certificado SSL
Vaya a la página de SSL Certificates. En la columna Actions del certificado objetivo, haga clic en Download Certificate. En la pestaña Download, seleccione Nginx como Server Type y descargue el paquete.
-
Descomprima el paquete descargado:
Si el paquete contiene un archivo de certificado (
.pem) y un archivo de clave privada (.key), guarde ambos. Los necesitará en el siguiente paso.Si el paquete solo contiene un archivo
.pemy no incluye un archivo.key, utilice el archivo de clave privada que guardó localmente cuando generó la solicitud de firma de certificado (CSR).
Si utilizó OpenSSL o keytool para generar la CSR, la clave privada se guardó únicamente en su computadora local y no se incluye en el paquete descargado. Si pierde la clave privada, el certificado queda inutilizable. Purchase a new commercial certificate y genere una nueva CSR junto con su clave privada.
-
Cargue los archivos
.pemy.keyen su servidor. Almacénelos en un directorio seguro, como/etc/ssl/cert.Utilice la función de carga de archivos de una herramienta de inicio de sesión remoto como PuTTY, Xshell o WinSCP. Si su servidor es una instancia de Alibaba Cloud Elastic Compute Service (ECS), consulte Upload or download files .
Paso 2: Abrir el puerto 443
El tráfico HTTPS utiliza el puerto TCP 443. Compruebe que esté abierto tanto en su security group en la nube como en el firewall del sistema.
Comprobar si el puerto 443 está abierto
Ejecute el siguiente comando para probar la conectividad en el puerto 443. Reemplace <your_server_public_ip> con la dirección IP pública de su servidor.
RHEL/CentOS
command -v nc > /dev/null 2>&1 || sudo yum install -y nc
# Replace <your_server_public_ip> with the public IP address of your server.
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443
Si la salida es Ncat: Connected to <your_server_public_ip>:443, el puerto 443 está abierto. De lo contrario, complete los pasos a continuación.
Debian/Ubuntu
command -v nc > /dev/null 2>&1 || sudo apt-get install -y netcat
# Replace <your_server_public_ip> with the public IP address of your server.
sudo ss -tlnp | grep -q ':443 ' || sudo nc -l -p 443 & sleep 1; nc -w 3 -vz <your_server_public_ip> 443
Si la salida es Connection to <your_server_public_ip> port [tcp/https] succeeded! o [<your_server_public_ip>] 443 (https) open, el puerto 443 está abierto. De lo contrario, complete los pasos a continuación.
Abrir el puerto 443 en su security group
Si su servidor se ejecuta en una plataforma en la nube, su security group debe permitir el tráfico TCP entrante en el puerto 443. Los siguientes pasos usan Alibaba Cloud ECS como ejemplo. Para otras plataformas en la nube, consulte su documentación.
Vaya a la página de instancias de Elastic Compute Service (ECS) y haga clic en el nombre de la instancia objetivo. En la sección Security Group Details, agregue una regla con la siguiente configuración y luego haga clic en Add a security group rule:
|
Field |
Value |
|
Action |
Allow |
|
Protocol |
Custom TCP |
|
Destination (Current Instance) |
HTTPS (443) |
|
Source |
0.0.0.0/0 (anywhere) |
Abrir el puerto 443 en el firewall del sistema
Ejecute el siguiente comando para identificar el firewall activo:
if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet firewalld; then
echo "firewalld"
elif command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -qw active; then
echo "ufw"
elif command -v nft >/dev/null 2>&1 && sudo nft list ruleset 2>/dev/null | grep -q 'table'; then
echo "nftables"
elif command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet iptables; then
echo "iptables"
elif command -v iptables >/dev/null 2>&1 && sudo iptables -L 2>/dev/null | grep -qE 'REJECT|DROP|ACCEPT'; then
echo "iptables"
else
echo "none"
fi
Si la salida es none, no se requiere ninguna acción en el firewall. De lo contrario, ejecute el comando correspondiente a su tipo de firewall:
firewalld
sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload
ufw
sudo ufw allow 443/tcp
nftables
sudo nft add table inet filter 2>/dev/null
sudo nft add chain inet filter input '{ type filter hook input priority 0; }' 2>/dev/null
sudo nft add rule inet filter input tcp dport 443 counter accept 2>/dev/null
iptables
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Para conservar las reglas de iptables después de reiniciar el servidor:
-
RHEL/CentOS:
sudo yum install -y iptables-services sudo service iptables save -
Debian/Ubuntu:
sudo apt-get install -y iptables-persistent sudo iptables-save | sudo tee /etc/iptables/rules.v4 >/dev/null
Paso 3: Instalar el certificado SSL en Nginx
Instalar el módulo SSL
Ejecute el siguiente comando. Si la salida es --with-http_ssl_module, el módulo SSL ya está instalado y puede omitir esta parte e ir directamente a Configurar el certificado SSL.
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'
Si el sistema devuelvenginx: command not found, utilice la ruta completa de instalación, por ejemplo:/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'.
Si falta el módulo SSL, instálelo con uno de los métodos a continuación, según la forma en que se instaló Nginx.
Agregar el módulo SSL podría interrumpir brevemente el servicio de Nginx. Haga una copia de seguridad de la configuración y los datos de Nginx antes de continuar, y aplique este cambio fuera del horario de mayor demanda.
Mediante un administrador de paquetes
Ejecute los siguientes comandos en la terminal de su servidor:
RHEL/CentOS
# Add the official Nginx repository.
sudo tee /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# Upgrade Nginx.
sudo yum upgrade nginx
Debian/Ubuntu
# Upgrade Nginx.
sudo apt-get update
sudo apt-get install --only-upgrade nginx
Compilar desde el código fuente
-
Instale las dependencias de compilación.
RHEL/CentOS
sudo yum install -y gcc pcre-devel zlib-devel openssl-develDebian/Ubuntu
sudo apt-get update sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -
Anote los parámetros de compilación actuales.
nginx -VCopie todos los parámetros que aparecen después de
configure arguments:. Los necesitará en el paso 4. -
Descargue el código fuente de la versión actual de Nginx. Ejecute
nginx -vpara consultar la versión (se usa 1.14.2 como ejemplo). Luego, descargue y extraiga el paquete de código fuente:wget http://nginx.org/download/nginx-1.14.2.tar.gz tar -zxvf nginx-1.14.2.tar.gz cd nginx-1.14.2 -
Recompile Nginx con el módulo SSL. Agregue
--with-http_ssl_moduleal final de los parámetros que anotó y vuelva a compilar:Si aparece el error
error: 'ENGINE_by_id' is deprecated: Since OpenSSL 3.0 [-Werror=deprecated-declarations], ejecutemake CFLAGS='-Wno-error=deprecated-declarations'en su lugar.# Keep all original parameters to avoid losing existing modules. ./configure <Original parameters> --with-http_ssl_module make -
Reemplace el binario de Nginx. Haga una copia de seguridad del binario original (se usa
/usr/local/nginx/sbin/nginxcomo ejemplo):# Replace /usr/local/nginx/sbin/nginx with the actual path to your nginx binary. sudo cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bakSobrescriba el archivo con el binario recién compilado:
# Replace /usr/local/nginx/sbin/nginx with the actual path to your nginx binary. sudo cp objs/nginx /usr/local/nginx/sbin/nginx -
Compruebe que el módulo SSL esté instalado.
nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'La salida
--with-http_ssl_moduleconfirma que el módulo está instalado.
Configurar el certificado SSL
Los siguientes pasos utilizan Nginx 1.14.2 y el archivo de configuración /etc/nginx/nginx.conf como ejemplo. Para encontrar el archivo de configuración activo en su servidor, consulte How can I find the active Nginx configuration file?
-
Abra el archivo de configuración. Puede personalizar los nombres de archivo y las rutas de almacenamiento del archivo de certificado (
.pemo.crt) y del archivo de clave privada (.key). Asegúrese de que las rutas en la configuración de Nginx sean correctas y de que el proceso de Nginx tenga permiso de lectura sobre esos archivos.sudo vim /etc/nginx/nginx.conf -
Agregue un bloque de servidor para HTTPS. Copie el bloque
serverexistente que escucha en el puerto 80, cambielisten 80porlisten 443 ssly agregue las directivas SSL que se muestran a continuación. Mantenga el resto de la configuración sin cambios.# Original server block listening on port 80 server { listen 80; server_name yourdomain www.yourdomain; # Other configurations location / { proxy_pass http://127.0.0.1:8000; } } # New server block for HTTPS. server { # Change the original 'listen 80' to 'listen 443 ssl'. listen 443 ssl; # Original server_name. You can add more domain names supported by the current certificate. server_name yourdomain www.yourdomain; # ======================= Start of certificate configuration ======================= # Specify the certificate file (the intermediate certificate can be appended to this .pem file). Replace /etc/ssl/cert/ssl.pem with the absolute path of your certificate file. ssl_certificate /etc/ssl/cert/ssl.pem; # Specify the private key file. Replace /etc/ssl/cert/ssl.key with the absolute path of your private key file. ssl_certificate_key /etc/ssl/cert/ssl.key; # Configure the SSL session cache to improve performance. ssl_session_cache shared:SSL:1m; # Set the SSL session timeout period. ssl_session_timeout 5m; # Customize the TLS protocol types and cipher suites to use (the following is an example configuration; evaluate whether you need to configure it). ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # Specify the allowed TLS protocol versions. Higher TLS versions provide better security for HTTPS communication, but have poorer browser compatibility than lower TLS versions. ssl_protocols TLSv1.2 TLSv1.3; # Prioritize the cipher suites specified by the server. ssl_prefer_server_ciphers on; # ======================= End of certificate configuration ======================= # Other configurations } -
(Opcional) Redirija HTTP a HTTPS. Agregue la directiva
returnal bloque de servidor del puerto 80.# Original server block listening on port 80 server { listen 80; server_name yourdomain www.yourdomain; # Redirect all HTTP traffic to HTTPS. return 301 https://$host$request_uri; # Other original configurations can be removed as they will no longer be reached. } -
(Opcional) Configure las rutas del certificado cuando el servicio web Nginx o Tengine se ejecuta en un contenedor Docker.
Un contenedor tiene su propio sistema de archivos, aislado del servidor host, por lo que Nginx no puede leer los archivos del certificado directamente desde una ruta del host. Monte el certificado digital (el archivo
.pem, que puede incluir la cadena de certificados intermedios) y el archivo de clave privada que descargó desde la consola de SSL Certificates dentro del contenedor, y luego haga referencia a sus rutas internas.-
Asigne el archivo de certificado, el archivo de clave privada y el archivo de configuración al iniciar el contenedor. La opción
:rolos monta como solo lectura.# Replace /host/path/to/ with the actual absolute paths of the certificate file, private key file, and configuration file on the host server. docker run -d --name nginx-ssl \ -v /host/path/to/cert.pem:/etc/nginx/ssl/cert.pem:ro \ -v /host/path/to/cert.key:/etc/nginx/ssl/cert.key:ro \ -v /host/path/to/nginx.conf:/etc/nginx/nginx.conf:ro \ -p 443:443 \ nginx -
En
nginx.conf, establezca los elementos de configuraciónssl_certificateyssl_certificate_keycon las rutas internas del contenedor en lugar de las rutas del host.ssl_certificate /etc/nginx/ssl/cert.pem; ssl_certificate_key /etc/nginx/ssl/cert.key; -
Reinicie el contenedor para aplicar los cambios.
docker restart nginx-ssl
Si los archivos no están montados, o si
nginx.confaún apunta a rutas del host en lugar de rutas internas del contenedor, Nginx no iniciará y mostrará el errorcannot load certificate: No such file or directory. Para más información sobre solución de problemas, consulte las preguntas frecuentes. Una vez que el contenedor se reinicie, abra su sitio en un navegador y confirme que el certificado se carga correctamente. -
-
Compruebe que la configuración no tenga errores de sintaxis.
sudo nginx -t -c /etc/nginx/nginx.confSi la salida incluye tanto
syntax is okcomotest is successful, la configuración es válida. De lo contrario, corrija los errores reportados y vuelva a ejecutar la prueba.
Recargar Nginx
Estos comandos asumen que Nginx se inició con la ruta de configuración predeterminada. Si tiene una ruta de instalación o un archivo de configuración personalizados, ajústelos según corresponda.
Nginx se está ejecutando
Recargue la configuración sin reiniciar el servicio:
sudo nginx -s reload
Si la recarga falla, consulte FAQ para solucionar el problema.
Nginx no se está ejecutando
Inícielo:
nginx
Paso 4: Comprobar el despliegue
Abra un navegador y vaya a
https://yourdomain. Reemplaceyourdomaincon su dominio real.-
Un ícono de candado en la barra de direcciones confirma que el certificado se desplegó correctamente. A partir de la versión 117 de Chrome, el ícono
se reemplazó por un nuevo ícono
. Haga clic en él para consultar los detalles del certificado. Si ve errores de acceso o no aparece el ícono de candado, borre la caché del navegador o inténtelo de nuevo en modo incógnito.
Si los problemas persisten, consulte FAQ para solucionarlos.
Pasar a producción
Al hacer un despliegue en producción, aplique las siguientes prácticas recomendadas:
|
Practice |
Why it matters |
How to apply |
|
Ejecutar con un usuario distinto de root |
Limita el alcance de un incidente de seguridad |
Cree un usuario de sistema dedicado con privilegios bajos para la aplicación |
|
Terminar SSL en la puerta de enlace |
Simplifica la gestión de certificados y reduce la complejidad del backend |
Despliegue el certificado en un Server Load Balancer (SLB). El SLB termina HTTPS y reenvía HTTP sin cifrar al backend |
|
Externalizar secretos |
Evita que las credenciales se filtren a través del código fuente o los archivos de configuración |
Utilice variables de entorno, HashiCorp Vault o Alibaba Cloud Key Management Service en lugar de codificar contraseñas de forma fija |
|
Forzar la redirección de HTTP a HTTPS |
Previene ataques de intermediario (man-in-the-middle) sobre tráfico sin cifrar |
Agregue |
|
Deshabilitar versiones inseguras de TLS |
SSLv3, TLSv1.0 y TLSv1.1 son vulnerables a ataques conocidos |
Establezca |
|
Monitorear certificados y renovarlos a tiempo |
Un certificado expirado interrumpe HTTPS para todos los usuarios |
Habilite el monitoreo de dominios. Alibaba Cloud comprueba la validez del certificado y envía recordatorios de renovación antes de que expire. Consulte Purchase and enable public domain name monitoring |
Preguntas frecuentes
¿Por qué HTTPS no es accesible después de la instalación?
Revise lo siguiente en orden:
El puerto 443 está bloqueado: el security group o el firewall no permite el tráfico entrante en el puerto 443. Consulte Abrir el puerto 443.
Dominio no coincidente: el dominio al que intenta acceder no aparece en Bound Domains del certificado. Consulte la tabla de cobertura de dominios en Requisitos previos.
Nginx no se recargó: la configuración no se recargó después de los cambios. Ejecute
sudo nginx -s reload.Rutas de archivo incorrectas: las directivas
ssl_certificateossl_certificate_keyapuntan a rutas incorrectas. Compruebe las rutas absolutas de sus archivos.pemy.key.Falta el certificado en los servicios ascendentes: si su dominio enruta a través de una Content Delivery Network (CDN), un Server Load Balancer (SLB) o un Web Application Firewall (WAF), el certificado también debe instalarse en esos servicios. Consulte Certificate deployment locations when traffic passes through multiple Alibaba Cloud services.
Certificado no desplegado en todos los servidores: si el DNS del dominio resuelve a varios servidores, instale el certificado en cada uno de ellos.
Para obtener más ayuda, consulte Resolve certificate deployment issues based on browser error messages y SSL certificate deployment troubleshooting guide .
¿Cómo actualizo o reemplazo un certificado SSL sin tiempo de inactividad?
Haga una copia de seguridad de los archivos
.pemy.keyactuales en el servidor.Descargue el nuevo certificado y la clave privada desde la consola de Certificate Management Service.
Cargue los nuevos archivos en el servidor y reemplace los existentes. Utilice exactamente las mismas rutas y nombres de archivo que se indican en la configuración de Nginx.
Recargue Nginx:
sudo nginx -s reload.
¿Cómo encuentro el archivo de configuración activo de Nginx (nginx.conf) en un servidor Linux?
Ejecute
ps -ef | grep '[n]ginx: master' | grep -- ' -c '. Si la salida incluye algo como-c /etc/nginx/custom.conf, Nginx está utilizando ese archivo de configuración personalizado.Si el paso 1 no devuelve resultados, Nginx utiliza la ruta predeterminada con la que se compiló. Ejecute
nginx -V 2>&1 | grep -oP -- '--conf-path=[^ ]*'para mostrar la ruta predeterminada, por ejemplo--conf-path=/etc/nginx/nginx.conf.
¿Cómo deshabilito TLSv1.0 y TLSv1.1 para corregir las advertencias de que "el certificado no cumple con los estándares"?
Establezca la directiva ssl_protocols en la configuración de Nginx con el siguiente valor:
ssl_protocols TLSv1.2 TLSv1.3;
Esto deshabilita los protocolos inseguros TLSv1.0 y TLSv1.1. Después de guardar el archivo, ejecute nginx -s reload para aplicar el cambio.
¿Por qué nginx -t falla con bind() to 0.0.0.0:443 failed (98: Address already in use)?
Otro proceso ya está escuchando en el puerto 443. Ejecute sudo ss -tlnp | grep :443 para identificarlo. Luego, detenga el proceso en conflicto (como otro servidor web o una instancia de Nginx bloqueada) o configúrelo para usar un puerto diferente.
¿Por qué nginx -t falla con cannot load certificate "/etc/nginx/ssl/domain.pem": BIO_new_file() failed?
Nginx no encuentra el archivo de certificado en la ruta especificada en la configuración. Corrija la directiva ssl_certificate en nginx.conf para que apunte a la ruta absoluta real de su archivo .pem.
¿Por qué la recarga de Nginx falla con the "ssl" parameter requires ngx_http_ssl_module?
La compilación de Nginx no incluye el módulo SSL. Instale o recompile Nginx con ngx_http_ssl_module habilitado. Consulte Install the SSL module.
¿Por qué obtengo No such file or directory: fopen('/cert/3970497_demo.aliyundoc.com.pem','r') al recargar Nginx?
La ruta especificada para ssl_certificate o ssl_certificate_key es incorrecta. Compruebe que las rutas en su configuración sean rutas absolutas correctas y que los archivos existan en esas ubicaciones.
¿Por qué Nginx no puede leer los archivos del certificado SSL y muestra el error permission denied?
El usuario del proceso worker de Nginx no tiene acceso de lectura a los archivos del certificado.
Identifique el usuario worker de Nginx: busque la directiva
userennginx.conf(por ejemplo,user nginx;).Otorgue a ese usuario permiso de lectura (
r) sobre los archivos de certificado y clave privada, así como permiso de ejecución (x) en todos los directorios superiores de la ruta.
¿Nginx 1.2 admite certificados descargados desde SSL Certificate Management V2.0?
Sí. Los certificados emitidos a través de SSL Certificate Management V2.0 son iguales a los emitidos mediante V1.0. La única diferencia es el método de compra.