首先我的架构是(公网 → NAT 转发 → Nginx 代理 → IIS 服务器),实现公网 HTTPS 访问,SSL 证书必须部署在 Nginx 服务器上,且是唯一需要部署证书的节点。
公网用户的 HTTPS 请求,首先通过 NAT 转发到你的 Nginx 服务器(NAT 仅做端口映射,不处理 SSL 加密)。Nginx 作为反向代理,需要先解密 HTTPS 请求(这就需要 SSL 证书),再以HTTP 协议将请求转发到内网的 IIS 服务器(IIS 无需处理加密,只负责业务逻辑)。→ 整个链路的加密 / 解密只在 “公网 ↔ Nginx” 之间进行,“Nginx ↔ IIS” 是内网 HTTP 通信,无需加密(若内网需安全,可单独配置,但公网 HTTPS 核心依赖 Nginx 的证书)。
首先去你购买ssl的服务商网站下载证书,将它保存到你的nginx服务器上。格式一般为pem和key的两个文件。域名解析可能需要添加相关ssl信息,这个可以根据不同服务商的文档操作。

当然如果没有也可以生成本地认证。主要是记录一下 SSL 证书的生成以及证书配置,SSL的理论和细节不细说了。这组命令是自签名证书的 “标准流程”,核心产出「server.key + server.crt」。
|
1 2 3 4 5 |
openssl genrsa -out server.key 2048 #生成 2048 位 RSA 私钥 openssl req -new -key server.key -out server.csr #生成证书签名请求(CSR) cp server.key server.key.org #备份原始私钥 openssl rsa -in server.key.org -out server.key #解密私钥(移除密码保护,可选) openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt #生成自签名证书(最终可用证书) |
Nginx 配置 HTTPS 时,支持 PEM 格式的证书文件,server.key 和server.crt本质上已经是 PEM 格式,只是文件后缀不同(.crt/.key 是常见别名,.pem 是通用后缀)。已经是 PEM 格式,直接用即可,无需额外转换。如果需要 .pem 后缀,仅需重命名文件。执行以下命令,若能正常输出证书信息,说明是合法 PEM 格式:
|
1 2 3 4 5 |
# 验证证书(server.crt) openssl x509 -in server.crt -text -noout
# 验证私钥(server.key) openssl rsa -in server.key -text -noout |
特殊情况:证书是 DER 格式需要转换为 PEM 格式,命令如下
|
1 2 3 4 5 |
# DER 格式证书(.der)转 PEM 格式(.pem) openssl x509 -inform der -in server.der -out server.pem
# DER 格式私钥转 PEM 格式 openssl rsa -inform der -in server.key.der -out server.key.pem |
将 SSL 证书(.crt/.pem)和私钥(.key)上传到 Nginx 的证书目录,建议路径:/etc/nginx/ssl/。
编辑 Nginx 的站点配置文件vi /etc/nginx/nginx.cong
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# 1. HTTPS服务配置(监听443端口,部署SSL证书) server { listen 443 ssl; listen [::]:443 ssl; # 支持IPv6(可选) server_name www.yourdomain.com; # 你的公网域名(必须与证书域名一致)
# 核心:SSL证书配置(替换为你的证书路径) ssl_certificate /etc/nginx/ssl/yourdomain.crt; # 证书文件路径 ssl_certificate_key /etc/nginx/ssl/yourdomain.key; # 私钥文件路径
# SSL安全优化(必配,避免弱加密被攻击) ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLSv1.0/TLSv1.1 ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off;
# 2. 反向代理到内网IIS服务器(HTTP转发) location / { proxy_pass http://192.168.1.200:80; # 替换为你的IIS内网IP+端口 proxy_set_header Host $host; # 传递域名到IIS(IIS需绑定该域名) proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP到IIS proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 告诉IIS:原始请求是HTTPS(关键!)
# 超时配置(适配IIS的动态页面/文件上传) proxy_connect_timeout 60s; proxy_read_timeout 120s; } }
# 3. 可选:HTTP 80端口重定向到HTTPS(强制公网用户用HTTPS访问) server { listen 80; listen [::]:80; server_name www.yourdomain.com;
return 301 https://$host$request_uri; # 永久重定向到HTTPS } |
Nginx 的配置分为 主配置文件 和 站点配置文件。
主配置文件路径/etc/nginx/nginx.conf
站点配置文件存放目录
|
1 2 3 4 5 6 |
# CentOS/RHEL 系列 /etc/nginx/conf.d/ # 站点配置文件目录(默认启用,后缀 .conf)
# Ubuntu/Debian 系列 /etc/nginx/sites-available/ # 存放所有站点配置(未启用) /etc/nginx/sites-enabled/ # 启用的站点(通过软链接指向 available 目录) |
主配置文件(nginx.conf)末尾会通过 include 指令加载所有站点配置,无需手动修改主配置:
|
1 2 3 4 5 |
# nginx.conf 末尾的默认配置(CentOS 示例) include /etc/nginx/conf.d/*.conf; # 加载 conf.d 目录下所有 .conf 文件
# Ubuntu 示例(通过软链接控制启用/禁用) include /etc/nginx/sites-enabled/*; |
在浏览器上放访问,可以看到这个连接是安全的则证书配置成功。点开可以看到证书信息。


如果是本地认证仍旧会显示不安全,但仍旧可以看到证书的详细信息。