【转】golang证书认证通信_客户端

 

 

 

【转】golang证书认证通信_服务端_02

 

 

 

 

 

 【转】golang证书认证通信_sed_03

 

 【转】golang证书认证通信_golang_04

 

 

______________________________________________________________

1. Golang中证书相关包

  • crypto/tls实现tls1.2和tls1.3。



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


LoadX509KeyPair reads and parses a public/private key pair from a pair of files.




  • crypot/x509 解析X.509格式的密钥和证书。




CertPool is a set of certificates.




NewCertPool返回一个空的CertPool。




SystemCertPool returns a copy of the system cert pool.




AppendCertsFromPEM attempts to parse a series of PEM encoded certificates. It appends any certificates found to s and reports whether any certificates were successfully parsed.



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


示例:



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


  • net/http提供HTTP的client和server实现。

客户端定制:For control over HTTP client headers, redirect policy等:




Transport定制:For control over proxies, TLS configuration, keep-alives, compression等:



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


服务端定制:



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


HTTPS监听

Files containing a certificate and matching private key for the server must be provided.




ListenAndServeTLS listens on the TCP network address srv.Addr and then calls ServeTLS to handle requests on incoming TLS connections. Accepted connections are configured to enable TCP keep-alives.




ListenAndServeTLS always returns a non-nil error. After Shutdown or Close, the returned error is ErrServerClosed. Server需要定制时使用。

2. 认证过程

单向认证过程:

客户点包含ca.crt,服务端包含server.key和server.crt。

客户端:客户端生成一个随机数random-client,传到服务器端;

服务端:服务器端接收消息之后,生成一个随机数random-server和包含公钥的证书,一起回馈给客户端;

客户端:客户端收到的东西原封不动,加上premaster secret(通过random-client、random-server 经过一定算法生成的数据),再一次送给服务器端,这次传过去的东西是经过服务端的公钥进行加密后数据;

服务端:服务端经过私钥(server.key),进行解密,获取 premaster secret(协商密钥过程);

此时客户端和服务器端都拥有了三个要素:random-client、random-server和premaster secret,安全通道已经建立,以后的交流都会校检上面的三个要素通过算法算出的session key。

双向认证过程相当于客户端和服务端反过来再执行认证、加解密、协商一遍。

3. 单向认证

单向认证只需要服务器端有证书即可。

CA证书




Server证书

用CA证书签发server证书。




Server.go

服务器监听在:https://server:8088,域名是server证书申请的CN。

单向认证时服务端只需要使用http.ListenAndServeTLS()或srv.ListenAndServeTLS()导入证书即可。一般情况下,不需要配置Server,直接采用默认的http.ListenAndServeTLS()。



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


Client.go

需要提前将server添加到/etc/hosts中以便本地测试。

单向认证时client端需导入CA根证书,需要定制http.Transport。

Golang默认支持HTTP/2协议,只要使用TLS则默认启动HTTP/2特性,但对http Client做一些定制化配置后,会覆盖掉http库的默认行为,导致开启HTTP/1.1。



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


Curl的-k参数可忽略证书验证:



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


如果/CN使用IP地址,就会报如下类似错误:




Client测试



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


HTTP/1.1非加密(10数据帧)

HTTP/1.1单向认证(17数据帧)

HTTP/2单向认证(22数据帧)

4. 双向认证 

双向认证要求客户端和服务端都要有证书,且都用CA证书验证对端证书。

Client证书

用CA证书签发client证书,而非server证书签发。

注意生成client端证书的时候,要多添加一个字段,golang的server端认证程序会对这个字段进行认证:




Server.go

双向认证时需定制http.Server,增加CA证书等。

定制的http.Server的Handler是一个interface,需要实现ServeHTTP()接口函数;

加载服务端的公钥和私钥用于解密客户端发送过来的随机字符;

加载CA证书是为了验证客户端的证书是否合格;



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


Client.go

Client需要定制http.Transport以加载客户端证书和CA证书。

Client的证书需要tls.LoadX509KeyPair()导入。



【转】golang证书认证通信_客户端_05


【转】golang证书认证通信_客户端_05


Curl验证




Client测试




HTTP/1.1双向认证(19数据帧)

HTTP/2双向认证(24数据帧)

 

5. 跳过证书验证

POSTMAN或curl中都可以跳过单向证书验证,golang也可以滴。