2015-01-14 34 views
2

以下是我在Go中使用HTTPS服務器的代碼。服務器要求客戶端提供SSL證書,但不會驗證證書(按設計)。如何在Go中訪問客戶端的證書?

您可以生成公鑰/私鑰對,如下,如果你想給它一個嘗試:

$ openssl genrsa -out private.pem 2048 
$ openssl req -new -x509 -key private.pem -out public.pem -days 365 

有誰知道我可以在處理程序訪問客戶端證書?假設我想報告一些關於客戶呈現給客戶的證書的屬性。

謝謝, 克里斯。

package main 

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

const (
    PORT  = ":8443" 
    PRIV_KEY = "./private.pem" 
    PUBLIC_KEY = "./public.pem" 
) 

func rootHandler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprint(w, "Nobody should read this.") 
} 

func main() { 

    server := &http.Server{ 
     TLSConfig: &tls.Config{ 
      ClientAuth: tls.RequireAnyClientCert, 
      MinVersion: tls.VersionTLS12, 
     }, 
     Addr: "127.0.0.1:8443", 
    } 

    http.HandleFunc("/", rootHandler) 
    err := server.ListenAndServeTLS(PUBLIC_KEY, PRIV_KEY) 
    if err != nil { 
     fmt.Printf("main(): %s\n", err) 
    } 
} 

回答

3

似乎r *http.Request具有TLS *tls.ConnectionState場這反過來又PeerCertificates []*x509.Certificate場,所以

fmt.Fprint(w, r.TLS.PeerCertificates) 

大概可以做

+0

非常感謝,認爲沒有的伎倆! – chrisvdb