Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bekomme ich clientCert.Subject.CommonName vom Golang-TCP-Handshake?

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

王林
王林nach vorne
2024-02-06 09:36:03382Durchsuche

如何从 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,
    }

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 {

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen