为了账号安全,请及时绑定邮箱和手机立即绑定

TLS 身份验证:每个证书需要包含什么?

TLS 身份验证:每个证书需要包含什么?

Go
蝴蝶不菲 2021-08-23 16:41:13
我正在编写一个配置守护进程。它是这样工作的:接受获取(读取)POST(更新)PUT(创建)删除(删除)方法例子:PUT http://server1/key (身体=价值)在键下存储值GET http://server1/key在响应正文中返回值现在,当执行 PUT、POST、DELETE 时,它会复制此请求并将其发送给对等方,这样每个节点都具有相同的数据,并且可以在其中一个节点不可用的情况下查询任何节点。它添加了一个标头,以便节点知道他们不应该复制请求并将其发送到其他节点。好的,到目前为止,这有效,但现在我只想允许节点和 WebUI 能够将请求传输到这些节点。这就是 TLS 发挥作用的地方。据我所知,我需要一个 rootCA,所以我可以签署服务器和客户端证书。而且我想要有效的证书,而不是“自签名”,因为我会使用 Go 和 crypto/tls 并且它应该验证证书。我的问题是:每个证书需要哪些扩展名或字段?当新节点添加到配置服务器池时,我不想重新生成服务器和客户端证书。我会通过 IP 地址连接,而不是通过主机名/dnsname(通过将 IP 分配给他们自己的 dnsname 来跳过主机名查找和第三方的潜在窃听,例如 s1.myserver.com 是我的 IP 1.2.3.4 和随机伙计创建一个带有 random.dude.com 1.2.3.4 的 DNS 条目,因为我通过对 clustercfg.mydomain.com 进行 NS 查找来获得所有节点的列表)在每个新节点上,我需要创建一个服务器证书(这是我,验证它是否正确)在每个新节点上,我需要创建一个客户端证书(以便我可以验证此客户端节点是否有效并被允许访问此服务器节点)问题是:X509v3 extensions:    X509v3 Key Usage: critical        Digital Signature, Key Encipherment, Certificate Sign    X509v3 Extended Key Usage:         TLS Web Server Authentication    X509v3 Basic Constraints: critical        CA:TRUE    X509v3 Subject Alternative Name:         DNS:server1.myserver.com, IP Address:2a02::0:0:0:0:0:0:2, IP Address:1.2.3.4rootCA、服务器证书、客户端证书需要什么才能进行“TLS 身份验证”?
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

您可以使用普通服务器证书,就像您在 Web 服务器中使用的服务器证书一样。当您连接时,Go 将正确检查。

至于客户端证书,这里有一个要点,展示了如何从 Go 生成和使用客户端证书。

我已经将此代码用于类似的客户端联系服务器的安全系统。

您不需要通过 IP 地址连接,因为客户端将检查服务器的证书是否与主机名匹配,这是一个非常好的检查。

希望有帮助!


查看完整回答
反对 回复 2021-08-23
?
喵喔喔

TA贡献1735条经验 获得超5个赞

需要什么?

  1. 证书颁发机构 (CA)

  2. 由第一个 CA 签署的另一个 CA

  3. 如果您愿意,还有更多 CA

2 和 3 是可选的

CA 需要 template.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageCRLSign

  1. 服务器证书和密钥

使用创建的最少 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))


查看完整回答
反对 回复 2021-08-23
  • 2 回答
  • 0 关注
  • 296 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信