Todos los productos
Search
Centro de documentos

Certificate Management Service:Install an SSL certificate on an Nginx or Tengine server (Linux)

Última actualización: Sep 09, 2026

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 root o una cuenta con privilegios de sudo en el servidor

  • Un 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 (example.com)

Solo example.com

www.example.com o cualquier subdominio

Coincidencia exacta (www.example.com)

Solo www.example.com

El dominio raíz u otros subdominios

Comodín (*.example.com)

Subdominios de primer nivel: www.example.com, a.example.com

Dominio raíz example.com, subdominios multinivel como a.b.example.com

Para proteger un subdominio multinivel como a.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

  1. 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.

  2. 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 .pem y 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.
  3. Cargue los archivos .pem y .key en 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

Importante

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 devuelve nginx: 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.

Importante

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

  1. Instale las dependencias de compilación.

    RHEL/CentOS

    sudo yum install -y gcc pcre-devel zlib-devel openssl-devel

    Debian/Ubuntu

    sudo apt-get update
    sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
  2. Anote los parámetros de compilación actuales.

    nginx -V

    Copie todos los parámetros que aparecen después de configure arguments:. Los necesitará en el paso 4.

  3. Descargue el código fuente de la versión actual de Nginx. Ejecute nginx -v para 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
  4. Recompile Nginx con el módulo SSL. Agregue --with-http_ssl_module al 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] , ejecute make 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
  5. Reemplace el binario de Nginx. Haga una copia de seguridad del binario original (se usa /usr/local/nginx/sbin/nginx como 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.bak

    Sobrescriba 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
  6. Compruebe que el módulo SSL esté instalado.

    nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'

    La salida --with-http_ssl_module confirma que el módulo está instalado.

Configurar el certificado SSL

Importante

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?

  1. Abra el archivo de configuración. Puede personalizar los nombres de archivo y las rutas de almacenamiento del archivo de certificado (.pem o .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
  2. Agregue un bloque de servidor para HTTPS. Copie el bloque server existente que escucha en el puerto 80, cambie listen 80 por listen 443 ssl y 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
    }
  3. (Opcional) Redirija HTTP a HTTPS. Agregue la directiva return al 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.
    }
  4. (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.

    1. Asigne el archivo de certificado, el archivo de clave privada y el archivo de configuración al iniciar el contenedor. La opción :ro los 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
    2. En nginx.conf, establezca los elementos de configuración ssl_certificate y ssl_certificate_key con 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;
    3. Reinicie el contenedor para aplicar los cambios.

      docker restart nginx-ssl

    Si los archivos no están montados, o si nginx.conf aún apunta a rutas del host en lugar de rutas internas del contenedor, Nginx no iniciará y mostrará el error cannot 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.

  5. Compruebe que la configuración no tenga errores de sintaxis.

    sudo nginx -t -c /etc/nginx/nginx.conf

    Si la salida incluye tanto syntax is ok como test is successful, la configuración es válida. De lo contrario, corrija los errores reportados y vuelva a ejecutar la prueba.

Recargar Nginx

Importante

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

  1. Abra un navegador y vaya a https://yourdomain. Reemplace yourdomain con su dominio real.

  2. 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 image se reemplazó por un nuevo ícono image. 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.

    image

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 return 301 https://$host$request_uri; al bloque de servidor del puerto 80

Deshabilitar versiones inseguras de TLS

SSLv3, TLSv1.0 y TLSv1.1 son vulnerables a ataques conocidos

Establezca ssl_protocols TLSv1.2 TLSv1.3; en la configuración de Nginx

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_certificate o ssl_certificate_key apuntan a rutas incorrectas. Compruebe las rutas absolutas de sus archivos .pem y .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?

  1. Haga una copia de seguridad de los archivos .pem y .key actuales en el servidor.

  2. Descargue el nuevo certificado y la clave privada desde la consola de Certificate Management Service.

  3. 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.

  4. Recargue Nginx: sudo nginx -s reload.

¿Cómo encuentro el archivo de configuración activo de Nginx (nginx.conf) en un servidor Linux?

  1. 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.

  2. 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.

  1. Identifique el usuario worker de Nginx: busque la directiva user en nginx.conf (por ejemplo, user nginx;).

  2. 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.