你了解HTTPS,但你可能不了解X.509
世上根本就没有HTTPS协议,只有HTTP协议。——知乎某答友
某天,收到领导指示:学习一下X.509相关原理。
很多开发者可能和我一样觉得X.509这个词很陌生,但其实我们经常和它打交道,属于典型的“日用而不知”的东西。
那么X.509是什么呢?
X.509是一种数字证书的格式标准。
应用很广泛,现在HTTPS依赖的SSL证书使用的就是使用的X.509格式。这也就是说,每当我们打开https开头的网站都会用到它。
格式标准
简单地说,格式标准就像写HTML文件时的规范:开头声明文档类型,html作为根标签,元信息放在head标签中,页面内容放在body标签中等等。
当然这个例子不是那么贴切,因为实际上不按照这个格式编写的html文件浏览器也能解析出来。
更贴切的例子应该是JSON文件格式,规定了嵌套关系必须用大括号,数组必须用中括号,字符串必须用双引号等等,如果违反了一条其中的规则,那么就无法被正确的解析。
这个标准的具体内容是什么呢?
X.509规定的格式大致如下:
版本号
序列号
签名算法
颁发者
证书有效期
开始日期
终止日期
主题
主题公钥信息
公钥算法
主体公钥
颁发者唯一身份信息(可选)
主题唯一身份信息(可选)
扩展信息(可选)
签名
下图是某网站的 X.509 证书信息
数字证书
那么数字证书又是什么?
简单的说,数字证书就是通过加密算法来制造的一个网络“身份证”,用来证明通信方的真实身份。
这个“身份证”的制作过程也很有意思,并不是由一个机构统一发放,而是层层颁发。
比如 A 持有了可信证书,那么它颁发给的 B 的证书也是可信的, B 再颁发给 C 的证书也是可信的。
整体结构很像数据结构中的“树”,其中 A 的证书为“根证书”,B 的为“中介证书”,C 的为“终端证书”。
而 A、B 都被称作认证机构,简称 CA(Certificate authority)。
根证书
|
中介证书
|
终端证书
- 根证书:通常预先安装在操作系统和浏览器中,是由大公司和政府联合制作的(用户也可以自己制作,但是会有安全风险),作为证书链的起点。
- 中介证书:持有中介证书的CA主要负责给终端颁发证书,这些终端证书既有收费的也有免费的,免费终端证书一般使用期限是1年。
- 终端证书:终端证书一般就是我们在浏览器上可以查看到的证书,通常用于具体网站服务中。这类证书不会再用作颁发新的证书。
每个证书都可以沿着树往上追溯到根证书,从而形成一条信任链。
比如下面这种图就是某网站证书的信任链信息。
关于 X.509 的内容就分享完了。
但是心中的疑惑驱使着我继续探索,这证书靠谱么?
如果黑客伪造认证机构给木马网站颁发证书呢?
安全机制
证书采用的是一种非对称加密机制来保证信息不被窃取和复制。
加密技术
这里稍稍解释下非对称机密,先说说密码学。
信息加密的需求其实一直都存在,从古代开始就使用各种技术来加密重要的信息,但是古代的加密安全程度都是基于加密方式的。
也就是说,别人如果知道了加密方式,那么就可以解密密文信息。
而现代的加密技术安全性在于密钥的安全,也就是说加密方式(算法)是公开的,只要密钥不被窃取或泄露,信息就是安全的。
虽然加密算法有很多种,但是大致上可以分为两类:对称加密和非对称加密。
对称加密的通信双方都是用同一个密钥进行加解密,而非对称加密则要求使用不同的密钥进行加密和解密。
再回到证书的颁发过程,现在很多云服务厂商都提供了申请数字证书的功能,它会像CA发起申请,CA收到申请之后,做了下面的事情:
- 使用加密算法生成公私钥对。私钥一般是以
.key为后缀名的文件,公钥存储于以.csr结尾的文件中。 - 在
.csr文件中补充一些信息比如有效期限等,颁发者,并用自己的私钥对证书进行签名。这样就生成符合X.509格式的证书。 - 用户收到证书后,在web服务器(或负载均衡等设备)上进行部署。
SSL证书
符合X.509格式的证书有多种,这里以SSL证书为例。
常见的场景会是下面这样:
- 客户端,比如浏览器会向服务端发送请求,服务端为了证明自己的身份,会发送证书给对方。
- 浏览器读取证书的数字签名部分,用自身根证书列表中对应的公钥证书对其进行解密。如果解密成功,并且证书哈希值与签名内的哈希值匹配一致,可证明站点提供的证书确实是该CA根证书签发的,否则给出风险提示。
- 验证通过之后,使用证书中的公钥对随机数和对称加密算法加密,发送给服务端,服务端用私钥进行解密,获得密钥和加密算法。
- 服务端与浏览器后续通信将会使用新的对称加密算法和随机密钥加密信息。
证书在整个流程起到了重要的作用,那么能不能通过窃取和伪造的方式来获取通信内容呢?
- 窃取。首先证书当然是可以被窃取的,因为它是公开的,但是拿到了证书后也只能和服务端进行通信,不能用来窃取其它信息,至于证书的私钥存储在服务端,更加不可能随意被窃取了。
- 伪造。如果有人伪造了一张网站证书,那么浏览器在向CA查询证书信息的时候就会验证失败。
那这么说就是绝对安全了吗?非也~
对于DNS劫持的情况还是无解的。比如浏览器访问网站的时候给了一个假证书,然后向CA验证证书的时候又访问了一个假网站,证书就有可能被验证通过。从而黑客可以作为中间方获取并转发双方的数据。
总结
SSL证书从生成到使用涉及到了三次加解密过程:
- 证书生成的时候利用私钥签名,验证证书的时候利用公钥解密。
- 确认证书有效后,利用证书中的公钥进行加密,服务端利用私钥解密。
- 双方使用新生成的随机密钥进行数据加解密。
用一张结构图表示下HTTPS和X.509的关系:
HTTPS
/ \
HTTP TLS/SSL
/ \
通信内容 确认身份
对称加密 SSL证书 —— X.509 格式,非对称加密
你了解HTTPS,但你可能不了解X.509的更多相关文章
- 听大神说:https和http有何区别?(转)
在做雅虎的时候,发现用第三方工具截取不到客户端与服务端的通讯,以前重来没碰到过这种情况,仔细看了看,它的url请求时基于https的,gg了下发现原来https协议和http有着很大的区别.总的来说, ...
- Wireshark抓包分析HTTPS与HTTP报文的差异
一.什么是HTTPS: HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换 ...
- https Full Handshake
1)加密套件交互: 2)密码交换: 3)身份认证: Full Handshake Initially, client and server "agree upon" null en ...
- HTTP协议和HTTPS协议初探
概况 HTTP是hypertext transfer protocol(超文本传输协议)的简写.它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEBserver之间交换数据的过程. HT ...
- mongodb之用户/认证/角色/权限管理
前言 用户权限管理很重要,只给需要的权限,防止应用系统漏洞导致脱库 认证和授权 Authentication 认证识别,解决我是谁 Authorization 操作授权,我能做什么 认证机制 MONG ...
- TCP和TLS/SSL会话细节
TCP数据段格式说明TCP建立连接和断开连接细节Https如何保证通信安全一次Https网络请求通信细节网络数据包分析工具wireshark的使用问题:SYN.ACK.FIN具体含义是什么?TCP建立 ...
- 密码学系列之:PKI的证书格式表示X.509
目录 简介 一个证书的例子 X.509证书的后缀 .pem .cer, .crt, .der .p7b, .p7c .p12 .pfx 证书的层级结构和交叉认证 x.509证书的使用范围 总结 简介 ...
- Java实现7种常见密码算法
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 前面在密码学入门一文中讲解了各种常见的密码学概念.算法与运用场景,但没有介绍过代码,因此,为作补充,这一篇将会介绍 ...
- 【流量劫持】躲避 HSTS 的 HTTPS 劫持
前言 HSTS 的出现,对 HTTPS 劫持带来莫大的挑战. 不过,HSTS 也不是万能的,它只能解决 SSLStrip 这类劫持方式.但仔细想想,SSLStrip 这种算劫持吗? 劫持 vs 钓鱼 ...
- HTTPS 互联网世界的安全基础
近一年公司在努力推进全站的 HTTPS 化,作为负责应用系统的我们,在配合这个趋势的过程中,顺便也就想去搞清楚 HTTP 后面的这个 S 到底是个什么含义?有什么作用?带来了哪些影响?毕竟以前也就只是 ...
随机推荐
- CI框架使用(一)
CI框架的使用是很简单,也 是mvc模式.其中有好多类直接调用. 在使用帮助函数的时候,都需要手动加载,或者是在配置文件中加一个自动加载 $this->load->helper('ur ...
- Navicat for MySQ v11-v12都有的,供大家学习提升使用
Navicat for MySQL破解版是一套专为 MySQL 设计的高性能数据库管理及开发工具,Navicat for MySQL破解版主要功能包括SQL创建工具或编辑器.数据模型工具.数据传输.导 ...
- 一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- 二分查找(Binary Search)的递归和非递归
Binary Search 有时候我们也把它叫做二进制查找 是一种较为高效的再数组中查找目标元素的方法 我们可以通过递归和非递归两种方式来实现它 //非递归 public static int bin ...
- windows安装TensorFlow和Keras遇到的问题及其解决方法
安装TensorFlow在Windows上,真是让我心力交瘁,想死的心都有了,在Windows上做开发真的让人发狂. 首先说一下我的经历,本来也就是起初,网上说python3.7不支持TensorFl ...
- kafka源码分析(二)Metadata的数据结构与读取、更新策略
一.基本思路 异步发送的基本思路就是:send的时候,KafkaProducer把消息放到本地的消息队列RecordAccumulator,然后一个后台线程Sender不断循环,把消息发给Kafka集 ...
- 玲珑OJ 1083:XJT Love Digits(离线处理+哈希)
http://www.ifrog.cc/acm/problem/1083 题意:比较好懂.注意答案的x不包含ax本身,所以才输出-1. 思路:离线处理.根据x排序,然后每次更新Hash[]数组就好了. ...
- springboot定时任务之旅
springboot定时任务 假设场景:单体应用的定时任务,假设我们已经有了一个搭建好的springboot应用,但是需要添加一个定时执行的部分(比如笔者遇到的是定时去请求一个接口数据来更新某个表), ...
- [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]列名 'user1' 无效
唉,还是自己对php执行sql语句运用不熟练.... 我的错误代码是这样的,(解决办法在最后) $re=sqlsrv_query($conn, "select * from visitor ...
- php常用实用函数整理
1.PHP加密解密 PHP加密和解密函数可以用来加密一些有用的字符串存放在数据库里,并且通过可逆解密字符串,该函数使用了base64和MD5加密和解密. function encryptDecrypt ...