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('*',' '); // ...
随机推荐
- windows生成硬链接
因工作电脑需要同时使用pl/sql和toad工具需要同时配置32位和64位oracle client如此增加了维护tnsnames.ora的复杂程度使用windows硬链接可以减少工作量,每次只修改源 ...
- vbs notepad输入中文字符
结合网上的写法,总结了一下 Set wshobj=WScript.CreateObject("WScript.Shell") #code就是想输入的中文或中英文的结合code=&q ...
- NODE-环境变量的配置(踩坑总结)
初学Node.js,从官网下载了node.js的Windows Installer,安装完成后,通过控制台输入node命令,发现提示说“node"不是内部或外部命令,这通常是由于没有设置环境 ...
- 禁用U盘的两种方法
方法一:注册表 计算机\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet003\Services\USBSTOR 更改值为4即可,恢复时同理 ,重启即可 方法二:组策略
- Kali-linux测试网络范围
测试网络范围内的IP地址或域名也是渗透测试的一个重要部分.通过测试网络范围内的IP地址或域名,确定是否有人入侵自己的网络中并损害系统.不少单位选择仅对局部IP基础架构进行渗透测试,但从现在的安全形势来 ...
- Entity Framework——读写分离
1 实现 CustomDbContext扩展了DbContext,其构造函数带有形式参nameOrConnectionString,可以在使用CustomDbContext时指定数据库连接字符串. D ...
- Eclipse安装Sonarlint插件
这里安装的是Sonarlint3.6.插件安装非常简单.插件比Sonar更为简单快捷. 一.首先通过点击Eclipse上方Help菜单会出现一个下拉列表,点击其中的Eclipse MarketPlac ...
- java使用Redis(六个类型)
下载插件:https://mvnrepository.com/artifact/redis.clients/jedis/3.0.0 maven项目依赖: <dependency> < ...
- EF Core如何输出日志到Visual Studio的输出窗口
我们在使用EF Core的时候,很多时候需要在Visual Studio的输出窗口中知道EF Core在后台生成的SQL语句是什么,这个需求可以通过自定义EF Core的ILoggerFactory和 ...
- DBUtils连接池,websocket
1.mysql数据库连接池 概念:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放. 这样 ...