猿问

在 http.NewRequest 中检查服务器 SSL/TLS 证书的指纹

如何在 golang 中的 http 请求期间检查服务器 SSL/TLS 证书的指纹?


这个ruby 代码显示了我想在 Go 中做什么:


  @verify_callback = proc do |preverify_ok, store_context|

    if preverify_ok and store_context.error == 0

      certificate = OpenSSL::X509::Certificate.new(store_context.chain[0])

      fingerprint = Digest::SHA1.hexdigest(certificate.to_der).upcase.scan(/../).join(":")

      $valid_fingerprints.include?(fingerprint)

    else

      false

    end

  end


BIG阳
浏览 330回答 0
0回答

汪汪一只猫

您可能不应该自己实施证书检查,而是让 net/http 根据您提供的有效 CA 进行检查。此外,通常直接使用指纹工作是不值得的。例如,这是您设置 HTTPS 服务器的方式,该服务器要求客户端使用证书进行身份验证。客户端证书必须由 CA 签名,否则 SSL/TLS 握手将停止。    // Server's own certificate & key    cert, err := tls.LoadX509KeyPair("server.crt", "server.key")    if err != nil {       panic(err)    }    // Load the CA certificate(s)    capool := x509.NewCertPool()    cacert, err := ioutil.ReadFile("ca.crt")    if err != nil {       panic(err)    }    capool.AppendCertsFromPEM(cacert)    // Server configuration    config := tls.Config{Certificates: []tls.Certificate{cert}, ClientCAs: capool, ClientAuth: tls.RequireAndVerifyClientCert}    config.NextProtos = []string{"http/1.1"}    config.Rand = rand.Reader // Strictly not necessary, should be default    // TLS web server    myTLSWebServer := &http.Server{Addr: "myaddress", TLSConfig: &config, Handler: nil}    // .. proceed with setting handlers etc    http.HandleFunc("/", myHandler)    // Bind to port and start the server up    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 中返回失败。如果你真的坚持检查指纹,你可以从 Request TLS *tls.ConnectionState 中检索 TLS 状态。我认为您可能应该使用该结构中的签名进行指纹识别..在我的头顶上,大致沿着func lol(r *http.Request) {    tls := r.TLS    if tls != nil {       // Try the first one for simplicity       cert := tls.PeerCertificates[0]       signature := cert.Signature       // Do something with the signature    }}应该做的伎俩。
随时随地看视频慕课网APP

相关分类

Go
我要回答