https 原理与实践
https 原理与实践
经典三问,是什么,为什么,怎么做?
是什么
是一种http的安全协议,在tcp ip网络模型里,http应用层是在tcp 传输层之上的,https协议规定了在tcp传输层之上还有一层tls/ssl层,这一层对http应用层发出去和接收的报文做加密和解密。 
为什么
出现https原因,在我看来有两点
1,因为http是明文传输,极不安全,需要对报文进行加密。
2,我们无法确认浏览的网站的身份信息,如果是钓鱼网站,诱使我们输入银行账号密码之类的就麻烦了。
怎么做
简而言之,「https规定了 加密算法对报文进行加密,解决明文传输的问题。采用数字证书的方式解决对服务端的身份认证问题」。
加密报文方式
对称加密和非对称加密
对称加密是加密和解密都采用同一个密钥。 非对称加密 将密钥分为公钥和私钥, 公钥进行加密的报文,用私钥可以解密。私钥加密的报文,用公钥可以解密(这种加密方式也是数字证书采用的原理)
一般对称加密会比非对称加密性能高几个数量级。但是就安全性而言,非对称加密安全性会更高,那么https采用的是什么加密方式呢?
两者结合的加密方式
由于对称加密性能更好,所以https在真正加密报文时还是采用的对称加密方式,但是对称加密的密钥是通过非对称加密协商后传给对方的。这样的加密方式就能保证在性能更好的前提下也有不错的安全性。
数字证书原理以及应用
数字证书是什么
数字证书 是一个可信组织验证和签发的识别信息。有点类似于现实生活中的身份证,公安机关给我们颁发身份证为的就是证明个人身份,而在网络世界里,这个组织就是ca组织。
来看看向ca组织提交注册信息以及验证数字证书的过程。

go语言精进之路截图
server.key是网站拥有的自己的私钥,ca.key是ca的私钥,server.crt是网站的数字证书。
1,首先网站服务将自身的一些基本信息通过自身的私钥进行加密,然后将自身的公钥和基本信息密文通过证书签名请求的格式传递给ca。 2,ca得到请求后,利用网站服务的公钥,对其基本信息进行解密。然后再按x509数字证书规范生成公钥证书。
这里涉及到ca对证书信息的加密方式,前面提到用私钥加密的数据,可用公钥解密,当将证书信息通过私钥加密后,客户端就能通过ca的公钥去解密证书,能成功解密,说明证书的确是ca颁发的。
但实际加密却不是这样,因为非对称加密算法 加密的信息越多性能越差,所以是将证书信息通过摘要算法生成固定长度的字符后,再采用ca私钥对其摘要进行加密。 摘要算法(常见的如MD5,sha)确保了数据的完整性,因为多次相同内容的数据用相同摘要算法计算的结果一致,所以能基本保证数据未被篡改。
3,x509数字证书里面包含 以下信息: 服务端公钥(server.pub); 证书相关属性信息,如域名、有效期等; 证书颁发机构的签名信息 4,然后就是客户端的解密过程,拿到证书以后,通过ca公钥对证书以及公钥信息的摘要密文进行解密,得到消息摘要,然后用摘要算法对证书信息以及公钥信息进行摘要计算,将客户端得到的摘要和密文解密后的摘要进行对比,如果相同,说明内容未被篡改,证书有效。
数字证书的加密算法总结
通过私钥加密,公钥解密的方式提供证书的颁发证明,能成功解密说明证书的确是ca颁发的。 通过摘要算法,确保了证书的完整性,未被篡改的证明。
https握手过程简析
建立在https要解决什么问题的基础上,理解https的握手过程,看看它究竟做了什么设计,让握手过程更高效,更安全。
https是为了解决明文传输的不安全性,以及对端身份认证的问题。 
1,客户端发送client hello信息将自身支持的tls版本,密码套件的信息传给服务端。
2,服务端接收后会发送server hello信息 选择tls版本和加密算法发给客户端。
3,然后服务端发送server certificate 信息将自身的证书下发给客户端。
4,然后服务端接着又发送密钥协商请求 server key exchange, 在密钥协商环节,通常会使用到Diffie-Hellman(DH)密钥交换算法,这是一种密钥协商的协议,支持通信双方在不安全的通道上生成对称加密算法所需的共享密钥。注意这种交换算法使用的目的是既让通信双方都拥有一样的密钥,但是呢,密钥又不是通过数据传输到对面的,是协商产生的。
5 接着客户端收到证书后,先检验证书的有效性, 然后客户端生成接下来加密通信的密钥,同时将生成密钥的一些参数 用服务端的公钥加密后 发送给 服务端,这个阶段称为client key exchange阶段,服务端收到后按这些参数后用自身的私钥解密 然后也生成相同密钥。
6,最后客户端和服务端分别会将连接至今的所有报文进行加密发送给对方,以验证tls握手成功。
golang声明https服务器
懂了交互逻辑以后,就知道了,声明一个https服务的时候,得有一个ca颁发的证书,证书里面包含服务端自身的公钥信息和一些基本信息,然后还得指明明服务器的私钥,用于tls握手过程中对密钥协商参数的加解密。
package main
import (
// "fmt"
// "io"
"net/http"
"log"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server.\n"))
// fmt.Fprintf(w, "This is an example server.\n")
// io.WriteString(w, "This is an example server.\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
基于上述https原理,下面我将会用openssl 工具以及golang程序来演示下https加解密过程。
生成服务器私钥
openssl genrsa -out server.key 2048
生成x509证书
openssl req -new -x509 -key server.key -out server.crt -days 3650
server.crt 就是我们的自签名证书了,然后启动go https服务
启动go https服务
package main
import (
"log"
// "fmt"
// "io"
"net/http"
)
func HelloServer(w http.ResponseWriter, req *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Write([]byte("This is an example server.\n"))
// fmt.Fprintf(w, "This is an example server.\n")
// io.WriteString(w, "This is an example server.\n")
}
func main() {
http.HandleFunc("/hello", HelloServer)
err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
先测试下访问
(base) ➜ ~ curl https://proxy.example.com:443/hello
curl: (60) SSL certificate problem: self signed certificate
More details here: https://curl.se/docs/sslcerts.html
curl 提示是自签名证书,因为我们使用的openssl 按x509标准生成的证书,不是ca颁发的,所以curl有这个错误。
让系统信任该证书
不同操作系统添加信任的方式不同,我使用的是mac os,在钥匙串应用里将证书添加进来并设置为信任。
注意这里我设置了证书的域名是proxy.example.com ,所以我还需要设置下这个域名对应的ip
设置域名
vim /etc/hosts
255.255.255.255 broadcasthost
127.0.0.1 localhost
::1 localhost
## 添加上这行
127.0.0.1 proxy.example.com
再次访问
(base) ➜ ~ curl https://proxy.example.com:443/hello
This is an example server.
发现当前访问已经成功了。
完美收工。。。
参考文献: go 语言精进之路
https 原理与实践的更多相关文章
- https原理与实践
HTTPS 原理与证书实践 分类: Web应用 1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了 ...
- https原理及实践
转载请注明出处 安全知识 网络安全问题 数据机密性 在网络传输数据信息时,对数据的加密是至关重要的,否则所有传输的数据都是可以随时被第三方看到,完全没有机密性可言. 数据机密性解决问题思路 利用算法 ...
- Tengine HTTPS原理解析、实践与调试【转】
本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...
- https原理(四)双向实践(java客户端+tcp代理)
本文采用客户端与服务端共用一个密钥对 1 将https代理服务器(三)实践中的mkcert p12分解为一个公钥一个私钥 mac@macdeMacBook mkcert % openssl pkcs1 ...
- https原理(三)双向实践(curl)
接 https代理服务器(三)实践,实践双向ssl 本文采用客户端与服务端不同密钥对 1 mkcert myclient 生成客户端公钥 私钥 2 mkcert -pkcs12 myclient 也可 ...
- 分布式开放消息系统(RocketMQ)的原理与实践(转)
转自:http://www.jianshu.com/p/453c6e7ff81c 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回 ...
- js原生的轮播,原理以及实践
轮播,无论是文字轮播还是图片轮播,他们的原理是一样的,都是通过定时器执行循环展示和影藏. 一.手动轮播 (1)原理 一系列的大小相等的图片平铺,利用CSS布局只显示一张图片,其余隐藏.通过计算偏移量利 ...
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
内容简介 Paxos到Zookeeper分布式一致性原理与实践从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议. ...
- 2018-2019-2 20165234 《网络对抗技术》 Exp3 免杀原理与实践
实验三 免杀原理与实践 实验内容 1.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(1.5分) 2.通过 ...
- 2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165325 Exp3 免杀原理与实践 实验内容(概要) 一.正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己 ...
随机推荐
- Python常见加密解密算法
Python爬虫常见加密解密算法 url encode加密 简介:当url地址含有中文,或者参数有中文的时候,这个算是很正常了,但是把这样的url作为参数传递的时候(最常见的callback) ,需要 ...
- (数据科学学习手札150)基于dask对geopandas进行并行加速
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,geopandas作为我们非常 ...
- NX二次开发:保存时导出PDF并打开
该工程为在保存时执行开发的功能,函数入口点ufput.其他还有新建.打开.另存等都可以加入开发的操作,具体看UF_EXIT下的介绍. 用户出口是一个可选特性,允许你在NX中某些预定义的位置(或出口)自 ...
- window身上的方法 弹出框/打开和关闭
window身上的方法内置函数 alert() parseInt() parseFloat() setInterval(); setTimeout(); clearTimeout(); clearIn ...
- TS 基础及在 Vue 中的实践:TypeScript 都发布 5.0 版本啦,现在不学更待何时!
大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 微软于3月16日发布了 TypeScript 5.0 版本 ...
- 容器云平台监控告警体系(三)—— 使用Prometheus Operator部署并管理Prometheus Server
1.概述 Prometheus Operator是一种基于Kubernetes的应用程序,用于管理Prometheus实例和相关的监控组件.它是由CoreOS开发的开源工具,旨在简化Prometheu ...
- 创建用户认证授权的 kubeconfig 文件
创建用户认证授权的 kubeconfig 文件 当我们安装好集群后,如果想要把 kubectl 命令交给用户使用,就不得不对用户的身份进行认证和对其权限做出限制. 下面以创建一个 cby 用户并将其绑 ...
- [Java/Arthas]Arthas The telnet port 3658 is used by process 13988 instead of target process 11208, y[转载]
1 问题描述 Arthas 跟踪 一个已经在tomcat部署的工程quality,第一次使用过的是135091号进程,后来出现问题,换进程连接,报错如上图所示,提示端口占用.原因是上次连接了一个进程, ...
- [Java JDK]ResultSet.next()
1 JDK [jdk1.5doc] Moves the cursor down one row from its current position. A ResultSet cursor is ini ...
- JUC(六)堵塞队列与线程池
堵塞队列 简介 def:在多线程中实现高效.安全的数据传输,主要是通过一个共享的队列,使得数据能够从一端输入,从另一端输出 当队列是空的,取数据的线程就会被堵塞,直到其他线程往空的队列中添加数据 当队 ...