Nginx 服务器安装 SSL证书(RHEL CentOS)

参考:在 Linux(RHEL/CentOS/Ubuntu/Debian)下的 Nginx 或 Tengine 服务器中安装/配置/部署 SSL 证书Nginx 配置-SSL&The plain HTTP request was sent to HTTPS port 解决

1. 登录 Linux 服务器

通过 SSH 客户端登录 Linux 服务器。

2. 开放安全组和防火墙的 443 端口

首先,验证服务器 443 端口的监听状态和可达性。

# 检查是否安装 nc 命令,若未安装则尝试安装
command -v nc > /dev/null 2>&1 || sudo yum install -y nc
# 请将 <当前服务器的公网 IP> 替换为实际的公网 IP 地址
# 检查本地是否有服务监听 443 端口,并测试该端口是否可从外部访问
sudo ss -tlnp | grep -q ':443 ' || (sudo nc -l 443 & sleep 1; nc -w 3 -vz <当前服务器的公网 IP> 443)

若上述命令显示 443 端口未开放或不可访问,请参照以下步骤在安全组和防火墙中开放 443 端口。

2.1 识别防火墙服务类型

执行以下命令,识别系统当前正在运行的防火墙服务类型:

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

如果输出为none,则表示系统未启用常见的防火墙服务,通常无需进一步操作。否则,请根据输出的类型(firewalldufwnftablesiptables),执行以下相应命令开放 443 端口:

2.2 配置防火墙规则

  • 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
    

2.3 持久化iptables规则(针对使用iptables的系统)

为避免iptables规则在系统重启后失效,请执行以下命令持久化规则(此示例适用于 CentOS/RHEL 系统):

sudo yum install -y iptables-services
sudo service iptables save

3. 检查 Nginx 是否安装了 SSL 模块

执行以下命令,检查 Nginx 是否已编译http_ssl_module模块:

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

注意: 若系统提示nginx: command not found,请根据 Nginx 的实际安装路径(例如/usr/local/nginx/sbin/nginx)运行命令。例如:/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o -- '--with-http_ssl_module'

如果命令没有返回 --with-http_ssl_module,则表示未安装http_ssl_module。需要为 Nginx 安装 SSL 模块

4. 上传 SSL 证书和私钥文件

将 SSL 证书文件(通常为.pem.crt格式)和私钥文件(通常为.key格式)上传到服务器的指定目录,例如/etc/nginx/cert

修改证书文件及目录权限:

执行以下命令,为 Nginx 配置文件(如nginx.conf)中user指令所指定的用户(例如nginx用户)添加相关的读写权限:

# 请将以下目录和文件路径替换为实际路径
sudo chmod +x /etc/nginx/cert
sudo chmod +r /etc/nginx/cert/ssl.pem /etc/nginx/cert/ssl.key

5. 在 Nginx 中配置 SSL 证书和私钥文件

执行以下命令打开 Nginx 配置文件(通常为nginx.conf):

sudo vim /etc/nginx/nginx.conf

添加监听 443 端口的server块:

建议将现有监听 80 端口的server块复制,并在此基础上进行修改以新增一个监听 443 端口的server块。将新块的监听端口修改为listen 443 ssl,并补充 SSL 证书配置(包括ssl_certificatessl_certificate_key指令)。其他配置项可根据需求保持不变。

# 原有监听 80 端口的 server 块示例
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    
    # 其它配置
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

# 复制原有监听 80 端口的 server 块,新增为一个监听 443 端口的 server 块
server {
    # 将原有 listen 80 修改为 listen 443 ssl
    listen 443 ssl;
    # 原有 server_name,可继续新增更多当前证书支持的域名
    server_name yourdomain.com www.yourdomain.com;
    
    # ======================= 证书配置开始 =======================
    # 指定证书文件(中间证书可拼接至该 .pem 文件中),
    # 请将 /etc/nginx/cert/ssl.pem 替换为实际使用的证书文件的绝对路径
    ssl_certificate /etc/nginx/cert/ssl.pem;
    
    # 指定私钥文件,
    # 请将 /etc/nginx/cert/ssl.key 替换为实际使用的私钥文件的绝对路径
    ssl_certificate_key /etc/nginx/cert/ssl.key;
    
    # 配置 SSL 会话缓存,以提高性能
    ssl_session_cache shared:SSL:1m;
    
    # 设置 SSL 会话超时时间
    ssl_session_timeout 5m;
    
    # 自定义设置使用的 TLS 协议类型以及加密套件。
    # 以下为配置示例,请自行评估是否需要配置,并根据安全要求调整。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    
    # 指定允许的 TLS 协议版本。
    # TLS 协议版本越高,HTTPS 通信的安全性越高,但相较于低版本 TLS 协议,
    # 高版本 TLS 协议对浏览器的兼容性可能较差。
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # 优先使用服务端指定的加密套件
    ssl_prefer_server_ciphers on;
    # ======================= 证书配置结束 =======================
   
    # 其它配置
}

可选:设置 HTTP 请求自动跳转到 HTTPS

在原有监听 80 端口的server块中添加return指令,实现 HTTP 请求自动重定向到 HTTPS:

# 原有监听 80 端口的 server 块
server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
        
    # 设置 HTTP 请求自动跳转到 HTTPS
    return 301 https://$host$request_uri;
    
    # 原有其它配置
}

可选:重定向 HTTP 访问 HTTPS 端口的错误

如果直接使用 HTTP 访问 HTTPS 端口,可能会收到The plain HTTP request was sent to HTTPS port错误。可以通过配置error_page指令将此类错误重定向到 HTTPS:

server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    # 设置 HTTP 请求重定向到 HTTPS
    error_page 497 https://$http_host$request_uri;

    # 原有其它配置
}

验证配置文件的合法性与正确性:

执行以下命令验证 Nginx 配置文件的语法:

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

若输出包含syntax is oktest is successful,则表示配置测试通过。否则,请根据提示修正配置,直至测试通过。

6. 重载 Nginx 服务

  • 若 Nginx 服务已启动:

    sudo nginx -s reload
    
  • 若 Nginx 服务未启动:

    nginx
    
posted @ 2025-08-27 00:29  Higurashi-kagome  阅读(66)  评论(0)    收藏  举报