ssl - 如何在 Go 中访问客户端的证书?

标签 ssl go

下面是我在 Go 中的 HTTPS 服务器代码。服务器要求客户端提供 SSL 证书,但不验证证书(设计)。

如果您想尝试一下,您可以按如下方式生成私钥/公钥对:

$ 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)
    }
}

最佳答案

似乎 r *http.Request 具有 TLS *tls.ConnectionState 字段,而该字段又具有 PeerCertificates []*x509.Certificate 字段,所以

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

大概可以做

关于ssl - 如何在 Go 中访问客户端的证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27940249/

相关文章:

java - 相互 SSL - 使用 java 作为客户端时,客户端证书链为空

带有字符串字段的 Go-Redis HMSet 给出了 WRONGTYPE 操作

go - 惯用语 Go Happy Path

python - 在 poplib 模块中找不到 POP3_SSL

spring - Spring-SAML 的 SSL 配置问题

asp.net - POODLE漏洞。如果客户端的浏览器可以回退到IIS上的SSL 3.0,则发出警告

go - 如何在 Go 中创建使用 TLS 客户端身份验证的测试服务器?

docker - 在 docker 中使用 gitlab private repo 作为 golang 依赖项

json - 在 golang 中,json.Unmarshal() 在 Playground /复制粘贴的 JSON 中有效,但在实际代码中无效

go - goroutine调用中 channel 接收运算符的阻塞行为