一 HTTPS概述

1.1 HTTPS介绍

超文本传输安全协议HTTPS(Hypertext Transfer Protocol Secure)是超文本传输协议和SSL/TLS的组合,用以提供加密通讯及对网络服务器身份的鉴定。
HTTPS也可以理解为HTTP over SSL,即HTTP连接建立在SSL安全连接之上。
HTTPS连接经常被用于万维网上的交易支付和企业信息系统中敏感信息的传输。
注意:HTTPS与RFC 2660中定义的安全超文本传输协议(S-HTTP)不同。

1.2 SSL介绍

SSL(Secure Socket Layer)安全套接字层是一种数字证书,它使用ssl协议在浏览器和web server之间建立一条安全通道,数据信息在client与server之间的安全传输。SSL使用证书来创建安全连接,通常有两种验证模式:
  • 仅客户端验证服务器的证书,客户端自己不提供证书;
  • 客户端和服务器都互相验证对方的证书。
注意:编译安装的Nginx默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译nginx时指定–with-http_ssl_module参数。

二 自签名证书

2.1 自签名证书

SSL需要使用TLS证书对通信进行加密,通常可通过openssl工具生产自建证书。

2.2 openssl创建证书

  1 [root@nginx01 ~]# openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=ZheJiang/L=HangZhou/O=Xianghy/OU=Web Security/CN=tls.linuxds.com"
释义:
-days 36500:证书有效期,100年;
-newkey rsa:2048:同时产生一个新证书和一个新的SSL key(加密强度为RSA 2048);
-keyout:SSL输出文件名;
-out:证书生成文件名;
C:使用国际标准组织(ISO)国码格式,填写2个字母的国家代号,中国请填写CN;
ST:省份,比如填ZheJiang;
L:城市,比如填写HangZhou;
O:组织单位,比如填写公司名称的拼音;
OU:部门;
CN:配置 SSL 加密的网站地址。
提示:可自建泛域名的证书,如*.linuxds.com。

三 免费证书申请

3.1 腾讯云申请

腾讯提供免费一年的SSL证书申请,具体操作略。

3.2 其他申请

免费证书也可通过:https://freessl.cn进行申请,具体操作略。

四 配置SSL

4.1 配置语法

  1 server {
2 listen 443 ssl; #SSL 访问端口号为 443
3 server_name www.xxx.com; #填写绑定证书的域名
4 ssl_certificate tls.crt; #证书文件
5 ssl_certificate_key tls.key; #私钥文件
6 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照以下协议配置
7 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #配置加密套件
8 ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码;
9 ssl_session_timeout 5m; #会话过期时间;
10 ssl_session_cache shared:SSL:1m; #储存SSL会话的缓存类型和大小;
11 location / {
12 root /web/www/website/dist; #定义首页索引文件的名称
13 index index.html;
14 }

4.2 配置示例

  1 [root@nginx01 ~]# mkdir /usr/share/nginx/tls/
2 [root@nginx01 ~]# echo '<h1>WebTLS</h1>' > /usr/share/nginx/tls/index.html

4.3 配置虚拟主机

  1 [root@nginx01 ~]# mkdir -p /etc/nginx/tls
2 [root@nginx01 ~]# ll /etc/nginx/tls/
3 total 8.0K
4 -rw-r--r-- 1 root root 3.7K Jul 5 22:07 linuxds.crt
5 -rw-r--r-- 1 root root 1.7K Jul 5 22:07 linuxds.key
  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/tls.conf
2 server {
3 listen 443 ssl;
4 server_name tls.linuxds.com;
5 root /usr/share/nginx/tls/;
6 access_log /var/log/nginx/tls.access.log main;
7 error_log /var/log/nginx/tls.error.log warn;
8 ssl_certificate /etc/nginx/tls/linuxds.crt;
9 ssl_certificate_key /etc/nginx/tls/linuxds.key;
10 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
11 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
12 ssl_prefer_server_ciphers on;
13 ssl_session_timeout 5m;
14 ssl_session_cache shared:SSL:1m;
15 location / {
16 index index.html index.htm;
17 }
18 }
19 server
20 {
21 listen 80;
22 server_name tls.linuxds.com;
23 rewrite ^(.*) https://$host$1 permanent;
24 }
提示:如上http自动调整https也可如下写法:
  1 server {
2 listen 80;
3 server_name tls.linuxds.com; #填写绑定证书的域名
4 return 301 https://$host$request_uri; #把http的域名请求转成https
5 }
  1 [root@nginx01 ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
2 [root@nginx01 ~]# nginx -s reload #重载配置文件

4.4 确认验证

浏览器访问:http://tls.linuxds.com,观察是否自动调整至https://tls.linuxds.com。
参考官网:http://nginx.org/en/docs/http/configuring_https_servers.html。

五 HTTPS其他优化

5.1 优化CPU消耗

SSL 的运算需要消耗额外的 CPU 资源,一般多核处理器系统会运行多个工作进程(worker processes ),进程的数量不会少于可用的 CPU 核数。SSL 通讯过程中【握手】阶段的运算最占用 CPU 资源,通常有两个方法可以减少每台客户端的运算量:
  • 激活 keepalive 长连接,一个连接发送更多个请求;
  • 复用 SSL 会话参数,在并行并发的连接数中避免进行多次 SSL【握手】。
这些会话会存储在一个 SSL 会话缓存里面,通过命令 ssl_session_cache 配置,可以使缓存在机器间共享,然后利用客戶端在【握手【阶段使用的 seesion id 去查询服务端的 session cathe(如果服务端设置有的话),简化【握手】阶段。
1M 的会话缓存大概包含 4000 个会话,默认的缓存超时时间为 5 分钟,可以通过使用ssl_session_timeout 命令设置缓存超时时间。
示例:
  1 server
2 {
3 ……
4 ssl_session_timeout 10m; #配置会话超时时间
5 ssl_session_cache shared:SSL:10m; #配置共享会话缓存大小,视站点访问情况设定
6 keepalive_timeout 70; #设置长连接
7 ……
8 }

5.2 使用HSTS优化安全性

HSTS:HTTP Strict Transport Security,HTTP严格传输安全。它允许一个 HTTPS 网站要求浏览器总是通过 HTTPS 来访问,这使得攻击者在用戶与服务器通讯过程中拦截、篡改信息以及冒充身份变得更为困难。
示例:
  1 server
2 {
3 ……
4 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
5 ……
6 }
释义:
max-age:设置单位时间内強制使用 HTTPS 连接;
includeSubDomains:可选,所有子域同时生效;
preload:可选,非规范值,用于定义使用【HSTS 预加载列表】
always:可选,保证所有响应都发送此响应头,包括各种內置错误响应。
浏览器在获取该响应头后,在 max-age 的时间内,如果遇到 HTTP 连接,就会通过 307 跳转強制使用 HTTPS 进行连接,并忽略其它的跳转设置(如 301 重定向跳转)

5.3 提升算法优化安全性

HTTPS 基础配置采取的默认加密算法是 SHA-1,这个算法非常脆弱,安全性逐步降低,因此建议重要的 HTTPS 配置方案应该避免 SHA-1,可以使用 迪菲-赫尔曼密钥交换(D-H,Diffie–Hellman key exchange)方案。
  1. 生产dhparam.pem文件
  1 [root@nginx01 ~]# cd /etc/nginx/tls
2 [root@nginx01 tls]# openssl dhparam -out dhparam.pem 2048
  1. 配置Nginx采用的算法
  1 [root@nginx01 tls~]# server
2 {
3 ……
4 ssl_prefer_server_ciphers on; #优先采取服务器算法
5 ssl_dhparam /etc/nginx/tls/dhparam.pem; #使用DH文件
6 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
7 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #定义算法
8 ……
9 }

5.4 其他安全优化

通常Nginx要可以配合如下安全参数来提升安全性。
  1 {
2 ……
3 add_header X-Frame-Options DENY; #减少点击劫持
4 add_header X-Content-Type-Options nosniff; #禁止服务器自动解析资源类型
5 add_header X-Xss-Protection 1; #防止XSS攻击
6 ……
7 }

5.5 优化总结示例

使用相应优化后的配置如下:
  1 [root@nginx01 tls]# vi /etc/nginx/conf.d/tls.conf
2 server {
3 listen 443 ssl;
4 server_name tls.linuxds.com;
5 root /usr/share/nginx/tls/;
6 access_log /var/log/nginx/tls.access.log main;
7 error_log /var/log/nginx/tls.error.log warn;
8 ssl_certificate /etc/nginx/tls/linuxds.crt;
9 ssl_certificate_key /etc/nginx/tls/linuxds.key;
10 ssl_session_timeout 10m; #配置会话超时时间
11 ssl_session_cache shared:SSL:10m; #配置共享会话缓存大小
12 keepalive_timeout 70; #配置长连接
13 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #HSTS策略
14 add_header X-Frame-Options DENY; #减少点击劫持
15 add_header X-Content-Type-Options nosniff; #禁止服务器自动解析资源类型
16 add_header X-Xss-Protection 1; #防止XSS攻击
17 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
18 ssl_prefer_server_ciphers on; #优先采取服务器算法
19 ssl_dhparam /etc/nginx/tls/dhparam.pem; #使用DH文件
20 ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"; #定义算法
21 location / {
22 index index.html index.htm;
23 }
24 }
25 server
26 {
27 listen 80;
28 server_name tls.linuxds.com;
29 rewrite ^(.*) https://$host$1 permanent;
30 }
浏览器访问:http://tls.linuxds.com,观察响应头信息。
参考:https://aotu.io/notes/2016/08/16/nginx-https/index.html。
https://imququ.com/post/web-security-and-response-header.html

016.Nginx HTTPS的更多相关文章

  1. linux:Nginx+https双向验证(数字安全证书)

    本文由邓亚运提供 Nginx+https双向验证 说明: 要想实现nginx的https,nginx必须启用http_ssl模块:在编译时加上--with-http_ssl_module参数就ok.另 ...

  2. 为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务

    昨天测试开发微信小程序,才发现微信也要求用HTTPS加密数据,想来是由于之前苹果的ATS审核政策的缘故吧,微信想在苹果上开放小程序必然也只能要求开发者必须使用HTTPS了,于是在服务器上测试安装Ngi ...

  3. 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)

    在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...

  4. 在阿里云 ECS 搭建 nginx https nodejs 环境(二、https)

    在阿里云 ECS 搭建 nginx https nodejs 环境(二) 这次主要内容是 如何在 ubuntu 的nginx 下配置 二级域名. 一. 域名解析 首先你需要去到你的 域名服务商那边 进 ...

  5. Nginx Https配置不带www跳转www

    把 morethink.cn和www.morethink.cn合并到一个server上去,使用301永久重定向. 然后将 https://morethink.cn 转到 https://www.mor ...

  6. nginx https 配置样例

    站点nginx https 配置模板 第一章 nginx 支持https 配置样例 其他 相关链接地址 第一章 nginx 支持https 配置样例 说明:https 段配置参数说明 Server 段 ...

  7. nginx https ssl 设置受信任证书[转然哥]

    nginx https ssl 设置受信任证书[原创] 1. 安装nginx 支持ssl模块 http://nginx.org/en/docs/configure.html yum -y instal ...

  8. Nginx httpS server配置

    Nginx httpS 配置 配置同时支持http和httpS协议: server { listen ; #backlog:每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包 ...

  9. Nginx https加密以及nginx日志配置与管理

    Nginx https加密以及nginx日志配置与管理 使用Nginx的优点Nginx作为WEB服务器,Nginx处理静态文件.索引文件.自动索引的效率非常高.Nginx作为代理服务器,Nginx可以 ...

随机推荐

  1. 谈谈spring-boot-starter-data-redis序列化

    在上一篇中springboot 2.X 集成redis中提到了在spring-boot-starter-data-redis中使用JdkSerializationRedisSerializerl来实现 ...

  2. Wireshark论证TCP3次握手的过程

    wireshark过滤条件:ip.addr == 120.79.36.180 千万别写成 ip.dst == 120.79.36.180 ,这样子就看不到服务器给我们返回的包了 此时,在浏览器输入12 ...

  3. 流媒体学习计划表——pr

    参考教程 视频:b站oeasy 书籍:<adobe premiere pro cc 2018经典教程> 学习教训 一定要多做--实践是检验真理的唯一标准 书籍补充理论知识,视频讲究实操(理 ...

  4. PHP 多维数组转json对象

    PHP 多维数组转json对象 php 数组转json对象,可能大家都知道要用json_encode,但是转换出来的格式多有不同,此处做个小小的记录! 1. 一维数组转json对象 <?php ...

  5. 如何下载 Ubuntu 镜像文件?

    Ubuntu,是一款基于 Debian Linux 的以桌面应用为主的操作系统,内容涵盖文字处理.电子邮件.软件开发工具和 Web 服务等,可供用户免费下载.使用和分享. 但是对于国内的用户来说如果直 ...

  6. 入门大数据---Flume 简介及基本使用

    一.Flume简介 Apache Flume 是一个分布式,高可用的数据收集系统.它可以从不同的数据源收集数据,经过聚合后发送到存储系统中,通常用于日志数据的收集.Flume 分为 NG 和 OG ( ...

  7. ajax前后端交互原理(2)

    2.NPM使用 2.1.NPM是什么 NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,这里要搞清楚包的概念,通俗的说,包就是具有一定功能的工具(软件),本质 ...

  8. eclipse在debug模式下鼠标移动到变量上不显示值的问题

    在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的: Window->Preferences->Java->Editor-> ...

  9. python数据结构-最全的六种排序

    1.冒泡排序: 比较相邻的元素,如果第一个比第二个大,那就交换位置 让大的元素跟下一个相邻的元素作比较,如果大于交换位置 对所有元素重复以上步骤(除了最后一个),直到没有任何一个需要作对比 2.选择排 ...

  10. 从零创建发布属于自己的composer包

    原文地址:https://www.wjcms.net/archives/从零创建发布属于自己的composer包 今天给大家讲解一下如何从零创建发布属于自己的composer包. composer包用 ...