Ich habe viele Clients, die über unterschiedliche Zertifikate eine Verbindung zu meinem TLS-TCP-Endpunkt herstellen. Ich versuche 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, }
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.
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!