您可能不应该自己实现证书检查,而是让net/http根据您提供的有效CA进行检查。此外,通常直接使用指纹并不值得麻烦。
例如,这是如何设置要求客户端使用证书进行身份验证的HTTPS服务器。客户端证书必须由CA签名,否则SSL/TLS握手将停止。
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
panic(err)
}
capool := x509.NewCertPool()
cacert, err := ioutil.ReadFile("ca.crt")
if err != nil {
panic(err)
}
capool.AppendCertsFromPEM(cacert)
config := tls.Config{Certificates: []tls.Certificate{cert}, ClientCAs: capool, ClientAuth: tls.RequireAndVerifyClientCert}
config.NextProtos = []string{"http/1.1"}
config.Rand = rand.Reader
myTLSWebServer := &http.Server{Addr: "myaddress", TLSConfig: &config, Handler: nil}
http.HandleFunc("/", myHandler)
conn, err := net.Listen("tcp", settings.ServiceAddress)
if err != nil {
panic(err)
}
tlsListener := tls.NewListener(conn, &config)
myTLSWebServer.Serve(tlsListener)
阅读
tls.Config的文档,您会发现通过更改参数(
ClientAuth、ClientCAs、Certificates、RootCAs),您可以轻松选择不同的证书检查模式。通常,您会在
error中返回失败。
如果您坚持要检查指纹,您可以从请求
TLS *tls.ConnectionState中检索TLS状态。我认为您应该使用该结构体中的
Signature进行指纹识别。大致上,您可以这样做:
func lol(r *http.Request) {
tls := r.TLS
if tls != nil {
cert := tls.PeerCertificates[0]
signature := cert.Signature
}
}
应该可以解决问题。