登录
首页 >  Golang >  Go问答

如何从 Golang TCP 握手中提取客户端证书的通用名称(Common Name)?

来源:stackoverflow

时间:2024-02-06 12:22:32 376浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《如何从 Golang TCP 握手中提取客户端证书的通用名称(Common Name)?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我有很多客户端使用不同的证书连接到我的 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的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>