Nginx配置ssl证书(https),给自己的站点上绿锁
Posted 孔子-说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx配置ssl证书(https),给自己的站点上绿锁相关的知识,希望对你有一定的参考价值。
转自:https://www.kongzid.com/archives/nginx1
https其实就是一种加密的http,让nginx实现用https来访问网站,http是80端口,https是443端口。配置了SSL证书的站点,当用户访问的时候浏览器地址栏标志着 HTTPS 的绿色小锁头从心理层面上可以给用户专业安全的心理暗示,本文简单介绍了如何在 Nginx 上配置 HTTPS 服务器,给自己的站点上『绿锁』。
- 为什么要加密?例如在网上银行汇款,在你汇款的过程当中,你会输入银行卡的密码,如果不加密,这些数据传输的过程中就有可能被人截获,破解。如果你使用了https,数据在传输的过程中是会加密的。即使抓到了数据包,但是无法破解出来。
1、配置ssl的前提条件
- 配置ssl证书之前,申请ssl证书,获取的途径很多(阿里云、腾讯云均有免费SSL证书,第三方服务购买等)。这里不详细解释。具体如何申请可以到百度搜一下,以下是我的SSL证书。
- SSL 证书主要有两个功能:加密和身份证明,通常需要购买,也有免费的,通过第三方 SSL 证书机构颁发。
- 申请证书一般的都是一年的有效期,在腾讯云/阿里云购买了域名后申请SSL证书,可自动添加DNS记录验证,很快就能验证通过。
- 在服务器上已安装nginx,并可以正常访问。linux下安装nginx教程:Linux下JAVA WEB服务器的搭建四(NGINX)
2、开始配置ssl
2.1 验证是否安装http_ssl_module模块
要确保nginx已安装http_ssl_module模块,进入到nginx目录,输入一下命令查看nginx有没有http_ssl_module模块,如果出现 configure arguments: --with-http_ssl_module
表示nginx已安装该模块。
./nginx -V
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVJJhkFE-1653881910601)(/upload/2022/05/image-1652669034653.png)]
由上图红色圈中的部分可以看到,nginx服务器已安装了http_ssl_module模块。
2.2 安装http_ssl_module模块
如果没有安装http_ssl_module模块,可以根据以下步骤进行安装:
- 重新配置新的编译参数
# 进入nginx目录
cd /opt/nginx/nginx-1.20.1-server1
# 执行命令重新配置新的编译参数,prefix后面的路径是你安装nginx的路径
./configure --prefix=/usr/local/nginx --with-http_ssl_module
- 重新编译nginx
执行 make
命令编译,可以看到屏幕上nginx源代码编译的过程。
- 注意:千万不要make install,这样会覆盖原有的配置
make
- make完成后,停止nginx服务
通过以下命令停止nginx服务
nginx -s quit
或
nginx -s stop
- 拷贝nginx启动程序到安装目录
停止nginx服务后,进入objs目录,将nginx启动程序,拷贝到安装目录下,替换原有的启动程序。
cp ./objs/nginx /usr/local/nginx/sbin/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcMKDgoI-1653881910601)(/upload/2022/05/image-1652671355366.png)]
- 启动nginx,查看http_ssl_module模块是否安装成功
# 进入nginx安装目录
cd /usr/local/nginx/sbin/
# 启动nginx
./nginx
# 查看http_ssl_module模块是否安装成功
./nginx -V
2.3 上传证书到服务器
在服务器上新建一个目录cert,把申请下来的证书上传上去。可以通过命令或xftp工具上传。
2.4 配置nginx.conf
打开配置文件nginx.conf,加入以下配置
# 第一个server的配置为给没有加www前缀的访问域名加www前缀
server
listen 80; # nginx配置端口
listen [::]:80;
server_name kongzid.com;
if ($http_host ~* "^(.*)")
set $domain $1;
rewrite ^(.*) http://www.kongzid.com break;
# 配置http访问自动转发到https
# rewrite ^(.*) https://$host$1 permanent;
# return 301 https://www.kongzid.com$request_uri;
# rewrite ^(.*) https://www.kongzid.com$request_uri;
# 第二个server的配置为http访问域名转到https访问
server
listen 80; # nginx配置端口
listen [::]:80;
server_name www.kongzid.com;
# 配置http访问自动转发到https
# rewrite ^(.*) https://$host$1 permanent;
return 301 https://www.kongzid.com$request_uri;
# 第三个server的配置为https配置ssl证书
server
listen 443 ssl;
# server_name _; # 值为 _ 表示 域名和ip都能访问
ssl_certificate "/usr/***/cert/7775335_www.***.com.pem"; # ssl的.pem文件(绝对地址)
ssl_certificate_key "/usr/***/cert/7775335_www.***.com.key"; # ssl的.key文件(绝对地址)
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
client_max_body_size 1024m;
location /
index index.html index.htm;
2.5 重启nginx
使用 nginx -s reload
命令重启nginx,如果重启的时候提示报错,说明nginx配置有问题,请仔细核对。
# 检测nginx配置是否正确
nginx -t
# 重启nginx
nginx -s reload
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TdDRRWRI-1653881910602)(/upload/2022/05/image-1652673384060.png)]
3、HTTPS服务器优化
3.1 激活 keepalive 长连接
激活 keepalive 长连接,一个连接发送更多个请求。复用 SSL 会话参数,在并行并发的连接数中避免进行多次 SSL『握手』。
这些会话会存储在一个 SSL 会话缓存里面,通过命令 ssl_session_cache
配置,可以使缓存在机器间共享,然后利用客戶端在『握手』阶段使用的 seesion id 去查询服务端的 session cathe(如果服务端设置有的话),简化『握手』阶段。
1M 的会话缓存大概包含 4000 個会话,默认的缓存超时时间为 5 分钟,可以通过使用 ssl_session_timeout
命令设置缓存超时时间。下面是一個拥有 10M 共享会话缓存的多核系统优化配置例子:
server
listen 443 ssl;
server_name www.****.com;#域名
ssl_certificate /root/project/ssl/nginx.crt;#证书路径
ssl_certificate_key /root/project/ssl/nginx.key;#key路径
ssl_session_cache shared:SSL:1m; #s储存SSL会话的缓存类型和大小
ssl_session_timeout 5m; #会话过期时间
ssl_ciphers HIGH:!aNULL:!MD5; #为建立安全连接,服务器所允许的密码格式列表
ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
#配置共享会话缓存大小
ssl_session_cacheshared:SSL:10m;
#配置会话超时时间
ssl_session_timeout 10m;
#设置长连接
keepalive_timeout 70;
#...
Nginx 默认支持 HTTP协议的 keep-alive 持续连接(长连接)功能,其默认的超时时间为75秒,在此期间内后续的http请求可以复用已建立的TCP连接,从而节省新建TCP连接握手的时间与资源。
- 不过就像所有事物都有两面性,keep-alive 在某些场景可能也会有不足之处,例如就算是在空闲状态下它还是会消耗服务器资源,因此你可以根据自己的实际需求调整 keep-alive的超时时间,比如调整某台负载较高的nginx服务器 keep-alive 超时时间调整为 30秒。
3.2 使用 HSTS 策略强制浏览器使用 HTTPS 连接
HSTS – HTTP Strict Transport Security,HTTP严格传输安全。它允许一个 HTTPS 网站要求浏览器总是通过 HTTPS 来访问,这使得攻击者在用戶与服务器通讯过程中拦截、篡改信息以及冒充身份变得更为困难。
只要在 Nginx 配置文件server内部加上以下头信息就可以了:
add_headerStrict-Transport-Security"max-age=31536000; includeSubDomains;preload"always;
- max-age:设置单位时间内強制使用 HTTPS 连接
- includeSubDomains:可选,所有子域同时生效
- preload:可选,非规范值,用于定义使用『HSTS 预加载列表』
- always:可选,保证所有响应都发送此响应头,包括各种內置错误响应
以上是关于Nginx配置ssl证书(https),给自己的站点上绿锁的主要内容,如果未能解决你的问题,请参考以下文章
Certbot给网站域名申请免费SSL证书 及Nginx配置