问题内容 我有很多客户端使用不同的证书连接到我的 TLS tcp 端点。我正在尝试使用 RequireAndVerifyClientCert: certPool := x509.New
我有很多客户端使用不同的证书连接到我的 TLS tcp 端点。我正在尝试使用 RequireAndVerifyClientCert
:
certPool := x509.NewCertPool()
clientCACert, err := ioutil.ReadFile("client-ca.crt")
if err != nil {
log.Fatal(err)
}
certPool.AppendCertsFromPEM(clientCACert)
// Create a base TLS config
baseTLSConfig := &tls.Config{
ClientCAs: certPool,
ClientAuth: tls.RequireAndVerifyClientCert,
}
因此,在我告诉它要使用哪个服务器证书和密钥之前,我可以访问 ConnectionState().PeerCertificates[0]
并首先读取 clientCert.Subject.CommonName
。即每个 CommonName 证书需要不同的服务器端证书和密钥。它不仅仅是用于所有连接的一个服务器证书和密钥。
listener, err := tls.Listen("tcp", ":8080", baseTLSConfig)
for {
conn, _ := listener.Accept()
clientCert := conn.(*tls.Conn).ConnectionState().PeerCertificates[0]
switch clientCert.Subject.CommonName {
但是这个转换失败: (*tls.Conn)
并且我无法调用 ConnectionState
或者我进行另一个 tcp.Server 调用,但 len(PeerCertificates)
为零。我尝试过:
GetConfigForClient: func(hello *tls.ClientHelloInfo) (*tls.Config, 错误) {
将其传递给 tls.RequireAndVerifyClientCert
或除此之外,但 *tls.ClientHelloInfo 没有我需要的信息。
无法根据客户端证书来决定使用哪个服务器证书。
在 TLS 握手中,服务器首先发送其服务器证书,然后请求客户端证书,只有在此之后客户端才会将其客户端证书发送到服务器。
以上就是如何从 golang tcp 握手中获取 clientCert.Subject.CommonName?的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 如何从 golang tcp 握手中获取 clientCert.Subject.CommonName?
本文链接: https://lsjlt.com/news/561359.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0