原标题:Go代码打通HTTPs
TL;DR 手工创建CA证书鏈手写代码打通HTTPs的两端
HTTPs最近是一个重要的话题,同时也是一个有点难懂的话题所以网上有大量的HTTPs/TLS/SSL的教程。关于这些的原理这里不做講解,有兴趣的可以自行搜索
本文介绍一个自己创建证书,并编写 Go 代码实现 client/server 两端的过程从实践的角度帮助理解。
我们首先要创建 client/server 使用嘚证书创建证书的方法有很多种:有不怕麻烦,直接通过 openssl
创建的有通过 cfssl 创建的。这里要介绍的是我认为最简单的一种:tls-gen
tls-gen是一个用 Python 编写嘚、非常易用的工具它定义了三种 profile。这里我们选择最简单的一种:一个根证书和一组证书、私钥对
在 shell 里面执行一下的命令:
- make CN=www.mytestdomain.io 就这样,我們就为域名 www.mytestdomain.io 创建了一套证书观察一下当前路径的内容,我们会发现两个新的目录:testca 和 server前者里面存放了刚刚创建的根证书 (root CA),后者里面存放了我们之后的服务程序要用的的证书和私钥
接下来开始写代码。Go 对 TLS 的支持还是比较完备的也比较简单。以下是服务器端的代码 (server.go):
可以看到我们创建了一个 HTTP 服务这个服务监听 1443 端口并且只处理一个路径 /hello。然后调用了下面这个excel函数公式大全讲解来监听 1443 端口注意我们给出了の前创建的服务的证书和私钥 - 这样就保证了HTTP会用加密的方式来传输。
假定我们的服务程序是运行在本地的我们先改一下 /etc/hosts 来配置域名解析:
我们用以下的代码 (client.go) 来访问服务:
这是因为系统不知道如何来处理这个 self signed 证书。
各个 OS 添加根证书的方法是不同的对于 Linux 系统 (以 Ubuntu 为例) 来说,把證书文件放到相应的目录即可:
如果是 macOS可以用一下的命令:
上面的方法会把我们手工创建的 root CA
添加到系统所已知的列表里面。这样一来所有用该 root CA
创建的证书都可以被认证了。
现在我们再次运行刚才那个程就会成功的获得服务端的响应了:
假如只是一个普通的用户没有 root/sudo 权限,不就无法做上面的操作了吗这种情况下还有另外一种做法: 把 root CA 放置在代码里面。
在上面的 client.go 里面添加这么几行代码: