如何在Nginx中配置SSL以保护Web服务的安全性?

1. 什么是SSL?

SSL(Secure Socket Layer),中文称为安全套接字层,是为了保障网络通信安全而设计的一种加密协议。使用 SSL 可以在浏览器和服务器之间建立一条加密的通信管道,确保数据传输的保密性、完整性和可靠性。

2. 为什么需要在Web服务中配置SSL?

Web 服务中不配置 SSL,所有传输的数据都是明文,容易被中间人拦截和篡改,造成用户的信息泄露和安全风险。

3. Nginx 中配置 SSL 的步骤

3.1 申请 SSL 证书

要在 Web 服务中使用 SSL,需要先从证书颁发机构(CA)申请肯定的 SSL 证书。目前常见的商用 SSL 证书颁发机构有 Symantec、GoDaddy、Comodo 等,也可以通过 Let’s Encrypt 免费申请。这里以 Let’s Encrypt 证书为例,说明申请 SSL 证书的步骤。

3.1.1 安装 certbot 工具

certbot 是一个用于自动化获取 Let's Encrypt 证书、以及配置 HTTPS 服务的开源工具,可以自动化申请证书并添加到 Nginx 配置中。

安装 certbot 工具,需要先安装 EPEL 源、Certbot 源,并使用 yum 命令安装 certbot 工具。

# 安装 EPEL 源

sudo yum install epel-release

# 安装 Certbot 源

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

# 安装 certbot 工具

sudo yum install certbot python-certbot-nginx

3.1.2 申请 SSL 证书

申请 SSL 证书需要在申请前准备好域名,并将域名指向 Nginx 服务器的公网 IP。在使用 certbot 工具申请证书时,需要提供有效的域名和邮箱地址。

# 使用 certbot 申请 SSL 证书

sudo certbot --nginx -d example.com

# 如果需要同时绑定多个域名,可以使用下面的命令

sudo certbot --nginx -d example.com -d www.example.com

如果申请成功,certbot 会将证书和私钥保存在默认目录中,并自动修改 Nginx 配置文件以启用 SSL。

3.2 配置 Nginx 支持 SSL

3.2.1 安装 OpenSSL 模块

Nginx 不支持 SSL 协议,需要安装 OpenSSL 模块,使 Nginx 可以支持 SSL 协议。

# 安装 OpenSSL 开发库

sudo yum install openssl openssl-devel

3.2.2 修改 Nginx 配置文件

在配置文件中增加 SSL 配置段,启用 SSL。

首先备份原有的 Nginx 配置文件,并新建一个配置文件。

# 备份原有的 Nginx 配置文件

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak

# 新建 Nginx 配置文件

sudo vim /etc/nginx/conf.d/ssl.conf

新建的 ssl.conf 配置文件中,增加 SSL 配置段,启用 HTTPS 协议。

# 增加 SSL 配置段

server {

listen 443 ssl;

server_name example.com;

# SSL 证书和私钥的位置

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# SSL 协议版本和加密算法

ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;

ssl_prefer_server_ciphers on;

# 防止恶意程序注入

add_header X-Content-Type-Options nosniff;

add_header X-XSS-Protection "1; mode=block";

location / {

proxy_pass http://localhost:8080; # Nginx 反向代理的地址

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-Proto https;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

修改 Nginx 配置文件后,重新启动 Nginx 生效。

# 检查配置文件是否正确

sudo nginx -t

# 重新启动 Nginx

sudo systemctl restart nginx

3.3 HTTP 转 HTTPS

为了更好的提高网站的安全性,可以让 HTTP 请求自动跳转到 HTTPS 请求。

3.3.1 修改 Nginx 配置文件

在配置文件中,增加一个 HTTP 组件,将 HTTP 请求自动跳转到 HTTPS 请求。

# 增加 HTTP 组件

server {

listen 80;

server_name example.com;

return 301 https://example.com$request_uri;

}

重新检查配置文件是否正确并重新启动 Nginx。

# 检查配置文件是否正确

sudo nginx -t

# 重新启动 Nginx

sudo systemctl restart nginx

3.4 测试 SSL 配置是否生效

配置完成后,需要测试 SSL 配置是否生效。

在浏览器中输入访问网站地址,如果页面显示 "已通过 SSL 加密" 等字样,就说明 SSL 配置已经生效。

也可以使用 SSL 检查工具,对网站进行检测。

4. 浏览器访问 HTTP 资源的安全问题

在 Nginx 中配置了 SSL,用户访问网站时,浏览器会提示网站已通过 SSL 加密,数据传输安全。但是,如果网站中包含 HTTP 资源,例如图片、脚本等,浏览器会认为整个网站不是安全的,会给用户发出警告。

4.1 什么是混合内容?

HTTP 和 HTTPS 是不同的协议,如果一个网站同时包含 HTTP 和 HTTPS 资源,并且这些资源在同一个页面中呈现,这就是混合内容。

混合内容可能会被中间人拦截或篡改,放大安全风险,因此浏览器为了保证用户的安全,会对包含混合内容的网站做出警告。

4.2 如何避免混合内容?

要避免混合内容,就必须将 HTTP 资源全部替换为 HTTPS 资源。可以通过以下方式来避免混合内容。

4.2.1 使用 Nginx 启用 HTTPS 访问

Nginx 可以启用 HTTPS 访问,将 HTTP 资源转变为 HTTPS 的访问方式。

4.2.2 使用相对路径引用资源

在引用资源时,使用相对路径的方式,这样无论是 HTTP 还是 HTTPS,都可以正确引用资源。

例如,CSS 文件在根目录下的 /css/style.css,可以使用相对路径引用。

4.2.3 使用 HTTPS 版本的第三方库和插件

使用 HTTPS 版本的第三方库和插件,例如 jQuery、Bootstrap 等,避免加载 HTTP 版本的资源。

4.2.4 验证 HTTPS 证书的有效性

要确保 HTTPS 证书的有效性,避免使用自签名证书和过期证书,以免被浏览器视为不受信任的证书。

在使用证书时,最好使用由公信证书机构颁发的有效证书。

5. 总结

为了保障 Web 服务的安全性,必须配置 SSL 证书。在 Nginx 中配置 SSL 的步骤包括申请 SSL 证书、安装 OpenSSL 模块、修改 Nginx 配置文件、HTTP 转 HTTPS 以及测试 SSL 配置是否生效。

在配置 SSL 证书时,必须确保证书的有效性,同时避免混合内容的安全问题。

后端开发标签