Golang Go语言 TLS 问题
Golang Go语言 TLS 问题
用 Golang 写一个 TLS 隧道,不想验证域名(SNI),双向验证两端证书是否为同个 CA 证书签发,该如何实现。。
试过 VerifyPeerCertificate 但是在本地网络下可以运行,到了远程就报错,不知为何
路过大佬求点拨,以下是两端配置,谢谢。。。
======== Server ========
tlsConfig := tls.Config{} tlsConfig.InsecureSkipVerify = true tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert tlsConfig.Certificates = []tls.Certificate{func() tls.Certificate { CertKey, err := tls.X509KeyPair(ServerCert, ServerKey) if err != nil { panic(err) } return CertKey }()} tlsConfig.VerifyPeerCertificate = func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { Roots := x509.NewCertPool() Roots.AppendCertsFromPEM(CA) cert, _ := x509.ParseCertificate(rawCerts[0]) opts := x509.VerifyOptions{ DNSName: "", Roots: Roots, } _, err := cert.Verify(opts) if err != nil { return err } return nil }
===== Client =====
tlsConfig := tls.Config{} tlsConfig.InsecureSkipVerify = true tlsConfig.Certificates = []tls.Certificate{func() tls.Certificate { CertKey, err := tls.X509KeyPair(ClientCert, ClientKey) if err != nil { panic(err) } return CertKey }()} tlsConfig.ClientAuth = tls.RequireAndVerifyClientCert tlsConfig.VerifyPeerCertificate = func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error { Roots := x509.NewCertPool() Roots.AppendCertsFromPEM(CA) cert, _ := x509.ParseCertificate(rawCerts[0]) opts := x509.VerifyOptions{ DNSName: "", Roots: Roots, } _, err := cert.Verify(opts) if err != nil { return err } return nil }
更多关于Golang Go语言 TLS 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我也不清楚为啥会这样,直接看图吧
https://imgtu.com/i/HW3T76
https://imgtu.com/i/HW3HAK
更多关于Golang Go语言 TLS 问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
没做错误处理、自己处理一下
server 端:
cert, err := tls.LoadX509KeyPair(*cert, *key)
CA := x509.NewCertPool()
file, err := ioutil.ReadFile(*ca)
CA.AppendCertsFromPEM(file)
tlsConfig := tls.Config{
GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
return &cert, nil
},
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: CA,
// …
}
客户端:
cert, err := tls.LoadX509KeyPair(*cert, *key)
CA := x509.NewCertPool()
file, err := ioutil.ReadFile(*ca)
CA.AppendCertsFromPEM(file)
tlsConfig := tls.Config{
Certificates: []tls.Certificate{cert},
RootCAs: certPool,
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: certPool,
// …
}
咋解决滴
服务器设置:<br>InsecureSkipVerify = false<br>Certificates //放服务器证书<br>ClientCAs //放 CA 证书<br>ClientAuth = tls.RequireAndVerifyClientCert<br>
客户端设置:<br>InsecureSkipVerify = false<br>Certificates //放客户端证书<br>RootCAs //放 CA 证书<br>ServerName //设置 SNI ,必须与服务器证书的 servername 一致<br>
客户端连接地址可以是域名可以是 ip ,反正会使用 ServerName 验证 SNI
服务器和客户端证书建议用同一个 CA 证书签发,(其他情况没试过)该配置可以实现双向验证
关于Golang中TLS(传输层安全协议)的问题,这是一个非常关键且常见的议题,尤其是在构建安全的网络通信应用时。以下是一些关于Go语言中处理TLS问题的关键点:
-
TLS配置:在Go中,你可以通过
tls.Config
结构体来配置TLS。这包括设置证书和私钥、指定支持的TLS版本、配置CipherSuites(加密算法套件)等。确保这些配置符合你的安全需求。 -
加载证书和私钥:使用
tls.LoadX509KeyPair
函数加载服务器证书和私钥文件。这些文件通常是PEM格式。 -
创建TLS监听器:使用
net.Listen
创建一个TCP监听器,然后将其封装在tls.NewListener
中以启用TLS。 -
客户端TLS连接:在客户端,使用
tls.Dial
函数建立TLS连接。同样,你需要配置一个tls.Config
以指定证书验证、服务器名称等。 -
错误处理:对于TLS连接,常见的错误包括证书验证失败、协议不匹配等。确保你的代码能够妥善处理这些错误,并向用户提供清晰的错误信息。
-
定期更新TLS配置:随着TLS标准的发展,新的漏洞可能会被发现,因此定期更新你的TLS配置以使用最新的安全实践是非常重要的。
如果你遇到具体的TLS问题,如证书验证失败、连接超时等,建议检查你的TLS配置和服务器/客户端日志,以获取更多关于错误原因的信息。同时,确保你的Go语言环境和相关库都是最新的,以利用最新的安全修复和改进。