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,则表示系统未启用常见的防火墙服务,通常无需进一步操作。否则,请根据输出的类型(firewalld、ufw、nftables、iptables),执行以下相应命令开放 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_certificate和ssl_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 ok和test is successful,则表示配置测试通过。否则,请根据提示修正配置,直至测试通过。
6. 重载 Nginx 服务
-
若 Nginx 服务已启动:
sudo nginx -s reload -
若 Nginx 服务未启动:
nginx
浙公网安备 33010602011771号