如何从 golang tcp 握手中获取 clientCert.Subject.CommonName?

问题描述 投票:0回答:1

我有很多客户端使用不同的证书连接到我的 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, error) {

将其传递给

tls.RequireAndVerifyClientCert
或除此之外,但 *tls.ClientHelloInfo 没有我需要的信息。

go ssl ssl-certificate x509certificate
1个回答
0
投票

因此,我可以访问 ConnectionState().PeerCertificates[0] 并首先读取 clientCert.Subject.CommonName,然后再告诉它要使用哪个服务器证书和密钥。

无法根据客户端证书来决定使用哪个服务器证书。

在 TLS 握手中,服务器首先发送其服务器证书,然后请求客户端证书,只有在此之后客户端才会将其客户端证书发送到服务器。

© www.soinside.com 2019 - 2024. All rights reserved.