| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 网络协议 -> SSL证书验证原理和https加密 -> 正文阅读 |
|
[网络协议]SSL证书验证原理和https加密 |
1、首先了解一下数字证书:它有点像身份证,是由权威的CA机构颁发的,证书的主要内容有:公钥(Public Key)、ISSUER(证书的发布机构)、Subject(证书持有者)、证书有效期、签名算法、指纹及指纹算法。 例如csdn的CA证书内容: 可以看到公钥是一串很长的2048 Bits的字符串,同时也可以看到<使用者>的内容包含了csdn.net网址,这个网址是CSDN唯一拥有的,后面验证链接url是否正确的时候用到,还有颁发者、有效期、签名哈希算法等等。当然还有指纹及指纹算法等其他内容,我们滚动到下面看看另外一个截图: 上面是CSDN网站CA证书,颁发者是GeoTrust,它就是权威的CA机构之一。到这里特别说明一下,CA机构除了给别人颁发证书以外,它也有自己的证书,为了区分我们称它为根证书,根证书也有自己的公钥和私钥,我们称之为根公钥和根私钥。然后根公钥和加密算法是向外公布的,而根私钥是机构自己绝对保密的。这个根证书在验证证书的过程中起着核心的作用。 1.1)什么是自签名 SSL 证书? SSL 证书包含以下信息:
从技术上讲,任何人都可以通过生成公私钥对,并包括上述所有信息来创建自己的 SSL 证书。此类证书称为自签名证书,因为使用的数字签名将是网站自己的私钥,而不是来自 CA。 但若使用自签名证书,就没有外部权威来验证源站服务器是否是它声称的身份。浏览器认为自签名证书不可信,并且尽管使用了 https:// URL,但可能仍然将站点标记为“不安全”。它们也可能会完全终止连接,从而阻止网站加载。 1.2)创建自签证书1)SSL使用证书来创建安全连接。有两种验证模式:
显然第二种方式安全性更高,一般用网上银行会这么搞,但是,普通的Web网站只能采用第一种方式。 客户端如何验证服务器的证书呢?服务器自己的证书必须经过某“权威”证书的签名,而这个“权威”证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威的证书就称为根证书。根证书直接内置在浏览器中,这样,浏览器就可以利用自己自带的根证书去验证某个服务器的证书是否有效。 如果要提供一个有效的证书,服务器的证书必须从VeriSign这样的证书颁发机构签名,这样,浏览器就可以验证通过,否则,浏览器给出一个证书无效的警告。申请一个证书签名的费用是一年几十~几百刀不等,所以如果只是出于管理目的,可以创建自签名证书,保证管理员通过浏览器安全连接到服务器。 2)创建自签名证书需要安装openssl,使用以下步骤:
脚本见:itranswarp.js/gencert.sh at master · michaelliao/itranswarp.js · GitHub 为HTTPS准备的证书需要注意,创建的签名请求的CN必须与域名完全一致,否则无法通过浏览器验证。 在当前目录下会创建出4个文件: www.test.com.crt:自签名的证书 www.test.com.csr:证书的请求 www.test.com.key:不带口令的Key www.test.com.origin.key:带口令的Key 服务器需要把www.test.com.crt发给浏览器验证,然后用www.test.com.key解密浏览器发送的数据,剩下两个文件不需要上传到Web服务器上。以Nginx为例,需要在server {...}中配置: 如果一切顺利,打开浏览器,就可以通过HTTPS访问网站。第一次访问时会出现警告(因为我们的自签名证书不被浏览器信任),把证书通过浏览器导入到系统(Windows使用IE导入,Mac使用Safari导入)并设置为“受信任”,以后该电脑访问网站就可以安全地连接Web服务器了: 注:在生成证书的时候可能报错 SSL routines:SSL_CTX_use_certificate:ee key too small 解决方法 openssl genrsa -des3 -out server.key 1024 改成2048 1.3)其他: 如何在应用服务器中配置证书呢?例如Tomcat等。正确的做法是不配置,让Nginx处理HTTPS,然后通过proxy以HTTP连接后端的应用服务器,相当于利用Nginx作为HTTPS到HTTP的安全代理,这样即利用了Nginx的HTTP/HTTPS处理能力,又避免了应用服务器不擅长HTTPS的缺点。 参考:给Nginx配置一个自签名的SSL证书 - 廖雪峰的官方网站 2、证书验证和https加密指纹是什么?指纹是一个证书的签名,是通过指纹算法sha1计算出来的一个hash值,是用来验证证书内容有没有被篡改的。 证书在发布之前,CA机构会把所颁发证书的内容通过指纹算法计算得到一个hash值,并用自己的根私钥加密;这个加密后的hash值只有对应的根公钥才能解密,所以在验证证书的时候,我们通过同样的指纹算法将证书内容通过计算得到另一个hash值,如果这个hash值跟证书上的签名解析出来的hash值相同,就代表证书没有被篡改过。 2.1)一个证书验证的过程:
说明:这里我们假设,如果浏览器的连接被某个钓鱼网截取了,钓鱼网也可以发一个自己的证书给浏览器,然后也可以通过证书没有被篡改的验证,但是在证书没有被篡改的情况下,通过对比证书上的URL和我们请求的URL,就可以发现这个证书的URL不是我们所要连接的网址,所以说钓鱼网也骗不了我们。(中间人攻击) 总结: 看到这里如果还不是很明白证书验证过程的话,我特别解析一下,我们知道CA机构有自己的根公钥和根私钥。在证书颁发之前,机构会用根私钥将这个证书内容加密得到一个签名,这个签名只能用对应的根公钥去解密。在客户端(浏览器)收到服务端发过来的证书以后,我们首先从浏览器中拿到机构的根公钥,用这个根公钥去解析证书的签名得到一个哈希值H1,这个H1代表证书的原始内容,假设这个证书上的签名是不法分子伪造的,但是伪造的签名不可能是根私钥加密生成的(因为根私钥是CA机构私有),所以根公钥也不可能去解密任何第三方生成的签名(加密内容只能由对应的公钥私钥解析)。然后我们再用同样的哈希算法对收证书内容进行计算得到哈希值H2,通过对比H1和H2是否相等就知道证书有没有被褚篡改过了。讲到这里,我们应该明白证书是否被篡改的验证机制了吧。 2.2)https加密过程:到这里,已经验证了证书是没有被篡改的并且确认连接的URL也是正确的,然后我们获取到了证书上的公钥。下一步有一个很重要的任务就是,如何将一个对称加密算法的秘钥安全地发给服务器。
下面基于一个简单的图例,去分析整个HTTPS的数字证书验证过程: 总结:数字证书的验证有两个重要的步骤,第一是验证数字证书没有被篡改以及连接的URL是否正确,第二是通过RSA机制的原理安全地将对称加密算法的秘钥发送给对方。这两步都完成以后,整个HTTPS的数字证书的验证就算是成功了。 好了,通过上面 的讲解,相信我们已经掌握了https的数字证书验证原理了。 2.3)如何申请一个证书?从上面我们知道了证书验证原理,简单梳理一下都需要哪些: 客户端用到的如下:
服务器端:
客户端需要的工具不需要我们配置,主要是服务器端,如何来的呢? 1)首先我们在服务器端用ssh-keygen命令来生成公私钥: 在服务器端命令行中执行,ssh-keygen会在服务器的"~/.ssh"目录中生成两个文件 id_rsa,id_rsa.pub,前者不带pub后缀的为私钥,后者带pub后缀的为公钥。 2)申请证书: 拿着服务器端的公钥去权威CA机构申请证书,CA机构的客服一般会想你要你的服务器公钥和你的网站信息,然后CA机构用CA机构的私钥加密你的服务器公钥得到公钥证书,然后CA机构会将公钥证书颁发给你。 经过上面两部操作我们就会得到公钥证书和服务的私钥,拿到这两个文件我们可以使用配置https协议的网站了。 这里要说明一下,我们向有些CA机构申请证书时,它不需要你提交服务器公钥,而是它会自己生成一对服务器的公私钥,然后把服务器公钥用CA私钥加密成证书,和服务器私钥一起发送给你,阿里云的免费证书就是这样操作的。 参考: |
|
网络协议 最新文章 |
使用Easyswoole 搭建简单的Websoket服务 |
常见的数据通信方式有哪些? |
Openssl 1024bit RSA算法---公私钥获取和处 |
HTTPS协议的密钥交换流程 |
《小白WEB安全入门》03. 漏洞篇 |
HttpRunner4.x 安装与使用 |
2021-07-04 |
手写RPC学习笔记 |
K8S高可用版本部署 |
mySQL计算IP地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:42:12- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |