HTTPS相关知识以及在golang中的应用
最近简单学习了HTTPS,并在golang中实践了一下,现在把学到的知识记录下来,方便以后查看,如果有幸能帮到有需要的人就更好了,如果有错误欢迎留言指出。
- 一些简单的概念,可以自行百度百科
- HTTPS简介:HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。
- HTTPS与HTTP的区别:HTTP是以明文的方式来传递数据的,HTTPS是在HTTP的基础上加入了SSL协议的加密传输方式。
- CA(Certificate Authority):ca就是我们所说的证书颁发机构,ca是可信的权威机构,其实就是个办证的,给他钱,他给我们办证,当然了办的都是真证。ca机构也是有证书的,我们的电脑中自带了很多ca机构的证书,这些证书被称为“根证书”,根证书的作用就是检查别人的证是不是合法的。系统中的根证书如图:
- 服务端证书:在使用https时,服务端要载入服务端证书和服务端私钥,这里涉及到一些非对称加密的知识(简单讲,非对称加密就是有两个钥匙,公钥和私钥,用公钥加密用私钥解密,这样会安全一些,比如说,客户端要向服务器传消息,可以给服务器一个请求,拿到服务器的公钥,用服务器的公钥把数据加密,加密后的数据传给服务器,服务器收到之后用服务器端的私钥解密,拿到数据,非对称开销大,不适合大数据量传输)可以自行搜索学习一下。服务端证书就是上面提到的办证(CA)的给你办的证,你得有这个证,人家才觉得你这人靠谱,证书中呢有一些信息,例如服务端公钥,谁给你办的证(CA的签名)
- 服务端私钥:这就是解密一些客户端发到服务器来的前置数据所用的私钥。
客户端和服务器通信时二者需要的数据:
客户端和服务器通信的流程:
在golang中的使用:
首先我们要有一个服务于https的服务端,通过golang的http包,很简单的就能完成https服务端的构建
func main() { http.HandleFunc("/test", func(writer http.ResponseWriter, request *http.Request) {
defer request.Body.Close()
writer.Write([]byte("hello world"))
}) if err := http.ListenAndServeTLS(":8080", certPath, keyPath, nil); err != nil {
panic(err)
}
}
certPath和keyPath分别是服务端证书和服务端私钥的路径,在这里我用openssl生成了一个CA根证书,用这个CA根证书签发了服务器证书。
然后我将我用openssl生成的CA根证书导入浏览器中并信任该CA,然后重启chrome(不要随便导入未知的CA根证书,这很危险)
然后我们通过浏览器访问https://localhost:8080/test
ok,已经可以正常通信了。
如果没有把根证书导入到我们的电脑中并设置信任会怎么样呢?下面我将根证书设为不信任。
再次访问https://localhost:8080/test
浏览器会提示你这个链接不是安全的https链接
数据摘要:将数据做hash之后得到的就是数据摘要。常用的算法有md5,sha1等等。
签名:签名就是用私钥对数据摘要进行加密,这个操作就叫做签名。
签名解决的问题:在非对称加密中,加密公钥是公开的,AB两个终端建立连接,发送的公钥可能会被其他人获取到,这个人获取到公钥后可能会伪装成AB其中一人向另一个人发送加密后的请求。为了防止有人冒充,引入了签名的机制来验证发送人是否合法。
签名验证问题:在非对称加密中,公钥用于数据加密,私钥用于数据解密,私钥也可以用于对数据签名,用公钥来验证签名。
签名验证的流程:非对称加密中,A要向B传送密文,B要验证接收到的数据是否是A发送的,所以A需要在向B发送密文数据时一起发送一个签名。首先将要发送的数据明文做hash,得到数据摘要,再用私钥加密数据摘要,生成签名,将签名和已加密的密文,一起发送给B,B拿到密文和签名后,用私钥对密文进行解密,解密后获得明文,对明文做hash生成数据摘要,B将A发送来的签名用A的公钥进行解密,解密后获得的数据摘要和B自己生成的数据摘要做比对,如果相同就是没有被篡改过的数据。
HTTPS相关知识以及在golang中的应用的更多相关文章
- [skill][https][ssl/tls] HTTPS相关知识汇总
结论前置: A 身份验证 证书, 服务器证书 B 密钥协商 RSA DHE / ECDHE PSK C 加密通信 加密通信采用对称加密,使用B阶段协商出来的密钥. B 阶段如果使用 RSA 协 ...
- 爬虫(2)- HTTP和HTTPS 相关知识
HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...
- HTTP与HTTPS相关知识
URL的开头一般会有http或https,这是访问资源需要的协议类型.有时还会看到ftp.sftp.smb开头的URL,这些都是协议类型.一般使用得最多的还是http和https. HTTP HTTP ...
- JPA相关知识点滴--持续更新中.....
Java 持久化(JPA) •Java EE 5 在EJB 3.0 中包含JPA 1.0 •参考实现:TopLink Essentials •Java EE 6 包含JPA 2.0 •参考实现:Ec ...
- https相关知识总结
从园子里看到很多讲解不错的文章,将链接放到这里,备忘 浅析数字证书:https://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html
- CSS相关知识(持续更新中)
1. 弹性布局 一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式.引入弹性布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列.对齐和分配空白空间. 2. ...
- Android Https相关完全解析 当OkHttp遇到Https
一.概述 其实这篇文章理论上不限于okhttp去访问自签名的网站,不过接上篇博文了,就叫这个了.首先要了解的事,okhttp默认情况下是支持https协议的网站的,比如https://www.baid ...
- Android Https相关完全解析
转载: 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/48129405: 本文出自:[张鸿洋的博客] 一.概述 其实这篇文章理论 ...
- C#相关知识总结
字符串相关知识 判断某字符串中包含某个字符,并过滤 if (string.Contains("*")) string = string.Replace('*',' '); // ...
随机推荐
- QA-IDEA中用maven配置项目无法加载JDBC
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Im building Maven Java Web application and w ...
- antd Icon
引入 : import { Icon } from 'antd'; <Icon type = "home" //图标样式 theme = "filled" ...
- appium 获取app的应用包名package和activity
第一种,使用sdk自带的工具aapt,在sdk\builds-tools\目录下,切换到aapt所在目录 命令:aapt dump badging app的路径,运行后的结果中以下两行分别是应用包名p ...
- zt 我们要找出毒素的藏身处,尽快把它赶出身体
在中医看来,我们体内有很多毒素,凡是不能及时排出体外.对我们的身体和精神会产生不良作用的物质都可以称为“毒”,例如瘀血.痰湿.寒气.食积.气郁. 上火.这些毒素堆积在五脏之内,就会加速五脏的衰老,然后 ...
- dba_tables、all_tables、user_tables
本文摘抄自:http://blog.csdn.net/daxiang12092205/article/details/42921063 dba_tables : 系统里所有的表的信息,需要DBA权限才 ...
- Hibernate多对一关联关系
两个持久化类.Customer 和 OrderForm Customer 类. package com.zcd.hibernate.manyToOne; public class Customer { ...
- C#使用DotNetZip对zip压缩包进行添加删除操作
参考:http://stackoverflow.com/questions/9855155/how-can-i-delete-a-directory-in-a-zip-file-using-net D ...
- css3的代替图片的三角形
1.小三角形(与边框结合,不兼容IE8) .callout{ position: relative; width: 100px; height: 100px; background: #fce6ed; ...
- Selenium应用代码(常见封装的方法一)
常见封装的方法:输入.点击.判断元素是否存在.根据句柄切换窗口.根据title切换窗口.滚动窗口.截图 import java.awt.Rectangle;import java.awt.image. ...
- leetcode 78. Subsets 、90. Subsets II
第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值. level代表的是需要进行选择的数值的位置. 78. Subsets 错误解法: cl ...