2 回答
TA贡献1796条经验 获得超10个赞
您可以使用普通服务器证书,就像您在 Web 服务器中使用的服务器证书一样。当您连接时,Go 将正确检查。
至于客户端证书,这里有一个要点,展示了如何从 Go 生成和使用客户端证书。
我已经将此代码用于类似的客户端联系服务器的安全系统。
您不需要通过 IP 地址连接,因为客户端将检查服务器的证书是否与主机名匹配,这是一个非常好的检查。
希望有帮助!
TA贡献1735条经验 获得超5个赞
需要什么?
证书颁发机构 (CA)
由第一个 CA 签署的另一个 CA
如果您愿意,还有更多 CA
2 和 3 是可选的
CA 需要 template.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageCRLSign
服务器证书和密钥
使用创建的最少 CA 签署证书。最少的 CA 将是您用来验证客户端证书的 CA
此证书还充当客户端证书,因此它需要
template.KeyUsage = x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature
template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}
如果您需要更多安全性,请添加 SAN。
template.DNSNames
template.IPAddresses
在您的服务器中
一个
var (
selfname string
certFile = flag.String("cert", "", "server certificate file.")
keyFile = flag.String("key", "", "server private key file.")
rootCA = flag.String("ca", "cacerts.pem", "rootca")
)
certpool := x509.NewCertPool()
pem, err := ioutil.ReadFile(*rootCA)
if err != nil {
log.Fatalf("Failed to read client certificate authority: %v", err)
}
if !certpool.AppendCertsFromPEM(pem) {
log.Fatalf("Can't parse client certificate authority")
}
config := &tls.Config{
ServerName: selfname, // os.Hostname()
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: certpool,
MinVersion: tls.VersionTLS10,
}
server := http.Server{
Addr: ":12345",
ReadTimeout: time.Second * 10,
WriteTimeout: time.Second * 10,
TLSConfig: config,
}
log.Fatalln(server.ListenAndServeTLS(*certFile, *keyFile))
- 2 回答
- 0 关注
- 296 浏览
添加回答
举报