Wie bekomme ich clientCert.Subject.CommonName vom Golang-TCP-Handshake?

王林
Freigeben: 2024-02-06 09:36:03
nach vorne
422 Leute haben es durchsucht

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

Frageninhalt

Ich habe viele Clients, die über unterschiedliche Zertifikate eine Verbindung zu meinem TLS-TCP-Endpunkt herstellen. Ich versuche RequireAndVerifyClientCert:

zu verwenden
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,
    }
Nach dem Login kopieren

So habe ich Zugriff auf ConnectionState().PeerCertificates[0] 并首先读取 clientCert.Subject.CommonName, bevor ich ihm sage, welches Serverzertifikat und welcher Schlüssel verwendet werden soll. Das heißt, jedes CommonName-Zertifikat erfordert ein anderes serverseitiges Zertifikat und einen anderen Schlüssel. Es handelt sich nicht nur um ein Serverzertifikat und einen Schlüssel, die für alle Verbindungen verwendet werden.

listener, err := tls.Listen("tcp", ":8080", baseTLSConfig)

    for {
        conn, _ := listener.Accept()
        clientCert := conn.(*tls.Conn).ConnectionState().PeerCertificates[0]
        switch clientCert.Subject.CommonName {
Nach dem Login kopieren

Aber diese Konvertierung schlägt fehl: (*tls.Conn) 并且我无法调用 ConnectionState 或者我进行另一个 tcp.Server 调用,但 len(PeerCertificates) ist Null. Ich habe versucht:

GetConfigForClient: func(hello *tls.ClientHelloInfo) (*tls.Config, 错误) {

Übergeben Sie es an tls.RequireAndVerifyClientCert oder anderswo, aber *tls.ClientHelloInfo verfügt nicht über die Informationen, die ich benötige.


Richtige Antwort


Es gibt keine Möglichkeit, anhand des Client-Zertifikats zu entscheiden, welches Serverzertifikat verwendet werden soll.

Beim TLS-Handshake sendet der Server zuerst sein Serverzertifikat und fordert dann das Client-Zertifikat an und erst danach sendet der Client sein Client-Zertifikat an den Server.

Das obige ist der detaillierte Inhalt vonWie bekomme ich clientCert.Subject.CommonName vom Golang-TCP-Handshake?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage