在前一篇文章"go语言实现双向TLS认证的REST Service"中介绍了如何实现client和server端之间的双向TLS认证,这里再介绍如何在server端获取client证书的内容。
比如如何获取证书里的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函数的入口处添加一个validRequest步骤来验证client证书里的一些属性,例如我们的例子里验证Subject的Common Name是不是guest,如果不是就报错。
关于证书的详细内容资料,请参考:
https://golang.org/pkg/crypto/x509/#Certificate