Nginx 配置 HTTPS 协议

发表于 2022-11-24

前言

HTTP 协议在逐渐的被 HTTPS 协议所取代。随着国内外很多的大型互联网公司已经启用了全站 HTTPS,由此可见 HTTPS 协议的普及将会是未来互联网的趋势。

HTTPS 是在 HTTP 的基础上再建立了一层 SSL 加密层,以此来实现对传输数据的加密操作,HTTPS 也被称为是 HTTP 协议的安全版。HTTPS 已经被广泛应用于需要安全网络通讯的场景,例如交易支付等业务场景。

更多的 HTTPS 就不再本文赘述,主要是记录如何使用 Nginx 配置 HTTPS 协议支持。

查看 SSL 模块安装情况

Nginx 采用默认安装时是没有安装 SSL 模块的,所以需要配置指定 SSL 的安装。 查看 Nginx 安装情况

/usr/local/nginx/sbin/nginx -V

########################################## 输出 ##########################################
nginx version: nginx/1.20.1
built by gcc 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)
built with OpenSSL 1.1.1g FIPS  21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
########################################## 输出 ##########################################

如果在 configure arguments 行没有看到 http_ssl_module 就表示 Nginx 没有安装 SSL 模块支持,所以需要重新安装 Nginx。

如果看到已有 http_ssl_module 就表示 Nginx 已经安装过 SSL 模块,可以跳过安装 SSL 模块直接配置 SSL 证书。

安装 SSL 模块

如果需要执行覆盖安装或者更新操作的,提前备份 Nginx 配置文件或者 Nginx 安装目录。如果安装出现异常也可以由备份恢复。

进入 Nginx 的源码包。如果源码包缺失可以重新下载对应版本的源码安装包,或者卸载后重装。

cd /usr/local/src/nginx-1.20.1

在源码包中执行配置命令,指定我们需要安装 SSL 模块。

./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module

配置完成后就可以执行安装操作了。

make
make install

安装完成后就可以通过命令/usr/local/nginx/sbin/nginx -V查看安装情况

配置 SSL 证书

配置 SSL 的写法可能因为版本问题存在不同的写法。

例如:Nginx 1.15.0 以上使用 listen 443 ssl 代替了 listen 443 和 ssl on。

# 只举例 server 模块的配置,因为在这里配置了 HTTPS 的相关东西
    server {
        listen 443 ssl;
        # 请填写绑定证书的域名
        server_name www.demo.com;
        # 请填写证书文件的相对路径或绝对路径
        ssl_certificate www.demo.com_bundle.crt;
        # 请填写私钥文件的相对路径或绝对路径
        ssl_certificate_key www.demo.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1.2 TLSv1.3;
        # 请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        location / {
            default_type         html;
            root                 /files/solo/solo/static-site;
        }
    }

常规配置还有将 HTTP 的请求重定向到 HTTPS

    server {
        listen 80;
        # 请填写绑定证书的域名
        server_name www.demo.com;
        # 把 HTTP 的域名请求转成 HTTPS
        return 301 https://$host$request_uri;
    }

重启 Nginx 服务

重启前验证配置文件是否有问题,确认配置正确后再重启 Nginx 服务

例如: Nginx 没有正确安装 HTTPS 模块,在执行这一步就会有错误提示。

[emerg] the “ssl” parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf

验证配置文件

/usr/local/nginx/sbin/nginx -t

重启 Nginx 服务

/usr/local/nginx/sbin/nginx -s reload