linux
主页 > 服务器 > linux >

Nginx之https证书配置实现介绍

2025-12-11 | 佚名 | 点击:

首先我的架构是(公网 → 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 的证书)。

具体实现

证书获取

首先去你购买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配置

编辑 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/*;

结果验证

在浏览器上放访问,可以看到这个连接是安全的则证书配置成功。点开可以看到证书信息。

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

原文链接:
相关文章
最新更新