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的前提条件

  1. 配置ssl证书之前,申请ssl证书,获取的途径很多(阿里云、腾讯云均有免费SSL证书,第三方服务购买等)。这里不详细解释。具体如何申请可以到百度搜一下,以下是我的SSL证书。
  • SSL 证书主要有两个功能:加密和身份证明,通常需要购买,也有免费的,通过第三方 SSL 证书机构颁发。
  • 申请证书一般的都是一年的有效期,在腾讯云/阿里云购买了域名后申请SSL证书,可自动添加DNS记录验证,很快就能验证通过。
  1. 在服务器上已安装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模块,可以根据以下步骤进行安装:

  1. 重新配置新的编译参数
# 进入nginx目录
cd /opt/nginx/nginx-1.20.1-server1
# 执行命令重新配置新的编译参数,prefix后面的路径是你安装nginx的路径
./configure --prefix=/usr/local/nginx --with-http_ssl_module
  1. 重新编译nginx

执行 make 命令编译,可以看到屏幕上nginx源代码编译的过程。

  • 注意:千万不要make install,这样会覆盖原有的配置
make
  1. make完成后,停止nginx服务

通过以下命令停止nginx服务

nginx -s quit
或
nginx -s stop
  1. 拷贝nginx启动程序到安装目录

停止nginx服务后,进入objs目录,将nginx启动程序,拷贝到安装目录下,替换原有的启动程序。

cp ./objs/nginx /usr/local/nginx/sbin/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcMKDgoI-1653881910601)(/upload/2022/05/image-1652671355366.png)]

  1. 启动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),给自己的站点上绿锁的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置ssl证书(https),给自己的站点上绿锁

Nginx配置ssl证书(https),给自己的站点上绿锁

Certbot给网站域名申请免费SSL证书 及Nginx配置

nginx配置二级域名以及ssl证书,真的很简单

如何为自己的WordPress站点安装SSL证书开启https访问

阿里云免费购买SSL证书,nginx无缝升级https