一 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. JDK开发环境的搭建和环境变量的配置

    首先博主先说一下JDK.JRE.JVM的区别和联系.我们正常运行程序的话只需安装JRE就行啦,如果要编译运行Java程序就得需要JKD下的bin目录下的编译工具. JDK -- java develo ...

  2. JDBC知识点总结

    一:JDBC 概述     一.简介        1. JDBC(Java DataBase Connection,Java 数据库连接)是Java语言中用来规范客户端程序如何来访问数据库的应用程序 ...

  3. vipkid 面试经历

    今天下午去了位于钟鼓楼旁边的 vipkid 研发部进行了面试,面试过程中的回答只能说一般,面试官问的问题大概分为: 实际项目的设计问题 mysql的使用优化问题 多线程与锁的问题 JVM底层原理的问题 ...

  4. 图灵学院-微服务11-分布式链路跟踪Sleuth详解

    当客户端访问到第一个service 1的时候,会生成当前链路追踪的一个全局的trance ID,在一次调用过Service1--Service2--Service3--Service4时,整个服务访问 ...

  5. easymock笔记2

    EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest. EasyMock 可以mock interface和抽象java 类,但是不可以mock拥有被final ...

  6. 入门大数据---通过Flume、Sqoop分析日志

    一.Flume安装 参考:Flume 简介及基本使用 二.Sqoop安装 参考:Sqoop简介与安装 三.Flume和Sqoop结合使用案例 日志分析系统整体架构图: 3.1配置nginx环境 请参考 ...

  7. 3分钟理解NMS非极大值抑制

    1. NMS被广泛用到目标检测技术中,正如字面意思,抑制那些分数低的目标,使最终框的位置更准: 2. 假如图片上实际有10张人脸,但目标检测过程中,检测到有30个框的位置,并且模型都认为它们是人脸,造 ...

  8. Egret游戏大厅制作思路

    Egret游戏大厅制作思路 Egret中,写好的代码最终都被打包到main.js里面,只有库文件会单独生成出来,按需加载. 游戏中有需求,要将一些游戏(或者模块)进行外包,然后从主游戏大厅中进入,那么 ...

  9. ShellExecute指定IE浏览器打开网页

    ShellExecute(NULL,L"open", L"iexplore.exe", L"www.baidu.com", NULL, SW ...

  10. 二.3.token认证,jwt认证,前端框架

    一.token: 铺垫: 之前用的是通过最基本的用户名密码登录我的运维平台http://127.0.0.1:8000/---这种用的是form表单,但是这种对于前后端分离的不适合.前后端分离,应该通过 ...