背景介绍
首先我的架构是(公网 → nat 转发 → nginx 代理 → iis 服务器),实现公网 https 访问,ssl 证书必须部署在 nginx 服务器上,且是唯一需要部署证书的节点。
为什么不能部署在 iis 或 nat 设备上?
公网用户的 https 请求,首先通过 nat 转发到你的 nginx 服务器(nat 仅做端口映射,不处理 ssl 加密)。nginx 作为反向代理,需要先解密 https 请求(这就需要 ssl 证书),再以http 协议将请求转发到内网的 iis 服务器(iis 无需处理加密,只负责业务逻辑)。→ 整个链路的加密 / 解密只在 “公网 ↔ nginx” 之间进行,“nginx ↔ iis” 是内网 http 通信,无需加密(若内网需安全,可单独配置,但公网 https 核心依赖 nginx 的证书)。
- nginx 的角色:ssl 终端(解密 https)+ 反向代理(转发 http 到 iis);
- iis 的角色:纯 http 业务服务器(接收 nginx 的转发请求,返回 http 响应);
- nat 的角色:仅做 “公网端口→内网 nginx 端口” 的映射(无需配置 ssl 相关)。
具体实现
证书获取
首先去你购买ssl的服务商网站下载证书,将它保存到你的nginx服务器上。格式一般为pem和key的两个文件。域名解析可能需要添加相关ssl信息,这个可以根据不同服务商的文档操作。

当然如果没有也可以生成本地认证。主要是记录一下 ssl 证书的生成以及证书配置,ssl的理论和细节不细说了。这组命令是自签名证书的 “标准流程”,核心产出「server.key + server.crt」。
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 格式:
# 验证证书(server.crt) openssl x509 -in server.crt -text -noout # 验证私钥(server.key) openssl rsa -in server.key -text -noout
特殊情况:证书是 der 格式需要转换为 pem 格式,命令如下
# 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配置
编辑 nginx 的站点配置文件vi /etc/nginx/nginx.cong
# 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
站点配置文件存放目录
# centos/rhel 系列 /etc/nginx/conf.d/ # 站点配置文件目录(默认启用,后缀 .conf) # ubuntu/debian 系列 /etc/nginx/sites-available/ # 存放所有站点配置(未启用) /etc/nginx/sites-enabled/ # 启用的站点(通过软链接指向 available 目录)
主配置文件(nginx.conf)末尾会通过 include 指令加载所有站点配置,无需手动修改主配置:
# nginx.conf 末尾的默认配置(centos 示例) include /etc/nginx/conf.d/*.conf; # 加载 conf.d 目录下所有 .conf 文件 # ubuntu 示例(通过软链接控制启用/禁用) include /etc/nginx/sites-enabled/*;
结果验证
在浏览器上放访问,可以看到这个连接是安全的则证书配置成功。点开可以看到证书信息。


如果是本地认证仍旧会显示不安全,但仍旧可以看到证书的详细信息。
到此这篇关于nginx之https证书配置实现的文章就介绍到这了,更多相关nginx https证书配置内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论