2014-06-12 5 views

Antwort

12

Hier ein kurzes Beispiel dafür, wie Kunden zu verlangen Zertifikat. Der Trick besteht darin, die http.Server manuell zu erstellen und zu konfigurieren, anstatt die Utility-Routinen zu verwenden.

package main 

import (
    "crypto/tls" 
    "fmt" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { 
     fmt.Fprintf(w, "Hello cert") 
    }) 

    server := &http.Server{ 
     Addr: ":8090", 
     TLSConfig: &tls.Config{ 
      ClientAuth: tls.RequireAndVerifyClientCert, 
     }, 
    } 

    server.ListenAndServeTLS("cert.pem", "cert.key") 
} 

Der wichtige Teil ist die tls.Config Struktur, welche die Art und Weise steuern, der Server mit TLS verhalten wird. Das Feld ClientAuth enthält die Client-Zertifikat-Richtlinie, in unserem Fall Erfordern Sie ein Client-Zertifikat und überprüfen Sie es. Beachten Sie, dass andere Richtlinien verfügbar sind ...

Sie sollten sich auch das Feld ClientCAs der gleichen Struktur ansehen, mit dem Sie eine Liste der Stammzertifizierungsstellen verwenden können, gegen die der Client verifizieren muss.

Hinweis: Ich nehme an, dass Sie auch eine Zertifikatserver-Seite verwenden, um die Kommunikation zu verschlüsseln. Die server.ListenAndServeTLS Methode macht immer noch einen großen Teil der Arbeit für Sie als Nebeneffekt. Wenn Sie es nicht brauchen, müssen Sie in diese method tauchen, um es manuell zu tun (und die Methode der niedrigeren Stufe server.Serve zu verwenden).

+0

Es ist genau das, was ich will. Und wie kann ich auf das Zertifikat zugreifen, um die Felder selbst zu sehen? – Druxtan

+0

@Druxtan können Sie das Befehlszeilentool openssl verwenden, um Zertifikate zu analysieren, wenn Sie das meinen. Sie können es von Go aus tun, aber das sollte nicht nötig sein, wenn der Client über ein gültiges Zertifikat verfügt. – Intermernet

+1

Sie können es tun, aber es wäre ein Schmerz in den Arsch, wie dies intern von den Standard-Paketen behandelt wird. – Elwinar

Verwandte Themen