nginx配置https

1. 介绍

HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):可以理解为HTTP+SSL/TLS, 即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL,用于安全的 HTTP 数据传输。HTTPS 相比 HTTP 多了一层 SSL/TLS.

SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。

TLS(Transport Layer Security,传输层安全):其前身是 SSL,它最初的几个版本(SSL 1.0、SSL 2.0、SSL 3.0)由网景公司开发,1999年从 3.1 开始被 IETF 标准化并改名,发展至今已经有 TLS 1.0、TLS 1.1、TLS 1.2 三个版本。SSL3.0和TLS1.0由于存在安全漏洞,已经很少被使用到。TLS 1.3 改动会比较大,目前还在草案阶段,目前使用最广泛的是TLS 1.1、TLS 1.2。

当客户端(例如Web浏览器)通过HTTPS向服务器发出请求时,服务器会响应一个数字证书,其中包含一个公钥。客户端然后使用此公钥加密一个随机对称密钥,该密钥用于加密在客户端和服务器之间发送的数据。这确保了数据不能被截获或被任何没有与服务器证书中的公钥相对应的私钥的人读取。

nginx 针对https提供ssl/tls配置功能的支持,这些功能由openssl库提供。nginx openssl模块在ngx_http_ssl_module实现,实际与openssl进行交互的模块还是在ngx_event_openssl以及ngx_event_openssl_stapling模块中。目前nginx可支持的ssl/tls版本如下: SSLv2  SSLv3 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3,具体配置可支持的版本可以自由进行设置。openssl模块配置openssl的开启以及关闭,通常https配置的端口一般是443。

2. 前置条件

  1. 服务器已经安装nginx并且通过http可以正常访问。
  2. 不会安装nginx的可以参考下这篇文章:https://www.pengtech.net/nginx/nginx_installation.html
  3. 拥有ssl证书,没有的可以去阿里购买或者免费申请一年,或者使用息签发证书。

如果以上条件都满足了,接下来开始配置https

3. 第一步:Nginx的ssl模块安装

如果你是按照上面的安装指南安装的nginx, 默认是安装了ssl模块的. 如果没有安装ssl模块需先安装ssl模块, 再进行后续的配置.

检查是否安装ssl模块的方法, 通过从终端运行以下命令来检查:

1
nginx -V 2>&1 | grep -o with-http_ssl_module

如果输出了”with-http_ssl_module”, 则表示SSL模块已经安装, 否则没有安装.

4. 第二步:配置ssl证书

将在阿里云或其它证书代理机构购买的证书下载下来, 解压缩下载好的证书(证书一般是pem或crt文件和key文件,这里名字可以随便改)

将下载好的证书上上传到服务器,我将证书放在了/usr/local/nginx/ssl文件夹.

修改/etc/nginx/conf.d/default.conf配置

1
2
3
4
5
6
7
8
9
10
11
12
server {                                                                 
listen 443;
server_name your_domain.com www.your_domain.com;
ssl on;
ssl_certificate /usr/local/nginx/ssl/nginx122.pem
ssl_certificate_key /usr/local/nginx/ssl/private122.key
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:4000/;
}
}

另外需要将来自http的请求重定向至https server

1
2
3
4
5
6
server {
listen 80;
server_name your_domain.com www.your_domain.com;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}

5. 第三步:重启nginx

1
2
3

systemctl retart nginx

6. 参考文档

Nginx配置Https(详细、完整)

阿里云免费SSL证书白嫖指南