最近在部署 KubeEdge 的时候遇到了一些和 TLS 有关的问题,对这方面不太了解,补习了一下
学习链接
流程
- server 生成 public key 和 private key
- server 将 server public key 和 id(例如域名)合并为 CSR(Certificate Signing Request)提交给 CA
- CA 使用 CA private key 基于 CSR 生成 signature(数字签名),并和 CSR 一起作为 CRT 发还给 server
- client 通过 tls 访问 server 时,server 将 server CRT 发给 client
- client 使用 [CA CRT].[CA CSR].[CA public key] 解密 [Server CRT].[Server Signature],并将结果与 [Server CRT].[Server CSR] 比较,如果一致,则可以使用 [Server CRT].[Server CSR].[Server Public Key] 对发送的数据进行加密
自签名
公钥私钥对
1 | openssl genrsa -out server.key 2048 |
生成 CSR :申请身份证
1 | openssl req -nodes -new -key server.key -subj "/CN=localhost" -out server.csr |
生成 CRT :
1 | openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt |
CA 签名
生成 CA 的 key 和 crt
1 | openssl genrsa -out ca.key 2048 |
生成 server 的相关信息
1 | openssl genrsa -out server.key 2048 |
注意,在执行最后一条命令的时候可能需要加上 server 的ip,否则可能会报 “x509: cannot validate certificate for x.x.x.x because it doesn’t contain any IP SANs”
将最后一条命令替换如下
1 | server_ip=<Your server ip> |
编写服务器
1 | func main() { |
使用 curl 访问:curl --cacert ca.crt https://localhost:8080
构建客户端访问
1 | func loadCA(caFile string) *x509.CertPool { |
双向验证
server:
1 | func main() { |
client:
1 | func main() { |
tcp + tls
websocket + tls
使用的库为 gorilla/websocket,样例修改自官网给出的样例 echo
server:
1 | // ... |
client:
1 | func loadCA(caFile string) *x509.CertPool { |