在前一篇文章"go語言實現(xiàn)雙向TLS認(rèn)證的REST Service"中介紹了如何實現(xiàn)client和server端之間的雙向TLS認(rèn)證,這里再介紹如何在server端獲取client證書的內(nèi)容喧兄。
比如如何獲取證書里的Subject屬性等咙边。
package main
import (
"net/http"
"encoding/json"
)
func myHandler(w http.ResponseWriter, r *http.Request) {
if ! validRequest(r) {
res := map[string]string {"error": http.StatusText(http.StatusUnauthorized)}
b, _ := json.Marshal(res)
w.WriteHeader(http.StatusUnauthorized)
w.Header().Set("Content-Type", "application/json")
w.Write(b)
} else {
// normal call flow
...
}
}
func validRequest(r *http.Request) bool {
if r.TLS != nil {
for _, cert := range r.TLS.PeerCertificates {
if cert.IsCA == false {
// Do something with the cert, for example:
// signature := cert.Signature
// issuer := cert.Issuer
subject := cert.Subject
if subject.CommonName == "guest" {
return true
}
}
}
}
return false
}
這個例子中在Handler函數(shù)的入口處添加一個validRequest步驟來驗證client證書里的一些屬性赫粥,例如我們的例子里驗證Subject的Common Name是不是guest棠众,如果不是就報錯荞怒。
關(guān)于證書的詳細(xì)內(nèi)容資料耻讽,請參考:
https://golang.org/pkg/crypto/x509/#Certificate