nginx优化https(ocsp)
前言
当用户使用客户端或其他的设备访问https网站时,需要先验证https证书,验证方式有两种:
- 证书颁发机构(ca)的证书吊销列表(CRL),CRL列出被认为不能再使用的证书的序列号。客户端通过访问CRL来验证网站证书是否有效。
- 在线证书状态协议(ocsp),其OCSP查询地址是http://ocsp.int-x3.letsencryp...,浏览器需要发送请求到这个地址来验证证书状态。
在线证书状态协议(OCSP)克服了证书注销列表(CRL)的主要缺陷:必须经常在客户端下载以确保列表的更新。当用户试图访问一个服务器时,在线证书状态协议发送一个对于证书状态信息的请求。服务器回复一个“有效”、“过期”或“未知”的响应。协议规定了服务器和客户端应用程序的通讯语法。在线证书状态协议给了用户的到期的证书一个宽限期,这样他们就可以在更新以前的一段时间内继续访问服务器。 ocsp比crl方式更加高效,但ocsp也存在一些问题,实时查询证书会给客户端带来一定性能影响,另一方面需要访问ca提供的第三方中心话验证服务器,如果这个第三方验证服务出现问题,或被攻击,将会导致ocsp验证失败。 这里我们推荐更先进的OCSP stapling。
什么是OCSP stapling?
正式名称为TLS证书状态查询扩展,可代替在线证书状态协议(OCSP)来查询X.509证书的状态。服务器在TLS握手时发送事先缓存的OCSP响应,用户只需验证该响应的有效性而不用再向数字证书认证机构(CA)发送请求。说白了,服务器代替客户端去进行OCSP查询,缓存查询结果,然后在与客户端进行TLS连接时返回给客户端。
Nginx 配置 OCSP stapling
我使用的环境如下:
CentOS/7.7.x NginX /1.12.x # 它从 1.3.7+ 开始支持OCSP stapling特性。
nginx配置
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/xxx.com/cert.pem;
ssl_certificate_key /etc/nginx/ssl/xxx.com/key.pem;
ssl_stapling on;
ssl_stapling_verify on;# 启用OCSP响应验证,OCSP信息响应适用的证书
ssl_trusted_certificate /path/to/xxx.pem;#选项应指向CA的根证书
resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s;#添加resolver解析OSCP响应服务器的主机名,valid表示缓存。
resolver_timeout 2s;# resolver_timeout表示网络超时时间
检测
检查https网站是否开启OCSP stapling有两种方法: 1.SSL Labs https://www.ssllabs.com/sslte... 如果开启返回 OCSP stapling Yes 2.通过命令
openssl s_client -connect admin.xxx.com:443 -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"
开启结果为:
OCSP response:
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
参考资料
http://nginx.org/en/docs/http... https://blog.sometimesnaive.o...
- 通过hiveserver远程服务构建hive web查询分析工具
- Hive 中内部表与外部表的区别与创建方法
- 常用统计分析 SQL 在 AWK 中的实现
- java 中 16 进制 HEX 转换成字节码形式的 UTF-8
- Hadoop 多表 join:map side join 范例
- 实战 windows7 下 eclipse 远程调试 linux hadoop
- Hive 在多维统计分析中的应用 & 技巧总结
- shell 学习笔记(18)
- Hive 中的复合数据结构简介以及一些函数的用法说明
- BloomFilter 简介及在 Hadoop reduce side join 中的应用
- 关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
- Hadoop Mapper 阶段将数据直接从 HDFS 导入 Hbase
- 译文 | 量化投资教程:投资组合优化与R实践
- 浅谈 java 中构建可执行 jar 包的几种方式
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP异常类及异常处理操作实例详解
- PHP面向对象程序设计(OOP)之方法重写(override)操作示例
- Python3与fastdfs分布式文件系统如何实现交互
- PHP判断是否微信访问的方法示例
- Pytorch损失函数nn.NLLLoss2d()用法说明
- python实现学生成绩测评系统
- Python dict的常用方法示例代码
- Scrapy模拟登录赶集网的实现代码
- opencv 图像腐蚀和图像膨胀的实现
- PHP实现微信退款的方法示例
- 基于Python和C++实现删除链表的节点
- python让函数不返回结果的方法
- PHP微商城开源代码实例
- PHP小程序支付功能完整版【基于thinkPHP】
- CodeIgniter框架实现的整合Smarty引擎DEMO示例