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

我正在编写一个配置守护进程。

它是这样工作的:

接受

  • 获取(读取)

  • 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.4

rootCA、服务器证书、客户端证书需要什么才能进行“TLS 身份验证”?


蝴蝶不菲
浏览 297回答 2
2回答

白衣染霜花

您可以使用普通服务器证书,就像您在 Web 服务器中使用的服务器证书一样。当您连接时,Go 将正确检查。至于客户端证书,这里有一个要点,展示了如何从 Go 生成和使用客户端证书。我已经将此代码用于类似的客户端联系服务器的安全系统。您不需要通过 IP 地址连接,因为客户端将检查服务器的证书是否与主机名匹配,这是一个非常好的检查。希望有帮助!

喵喔喔

需要什么?证书颁发机构 (CA)由第一个 CA 签署的另一个 CA如果您愿意,还有更多 CA2 和 3 是可选的CA 需要 template.KeyUsage = x509.KeyUsageCertSign | x509.KeyUsageCRLSign服务器证书和密钥使用创建的最少 CA 签署证书。最少的 CA 将是您用来验证客户端证书的 CA此证书还充当客户端证书,因此它需要template.KeyUsage = x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignaturetemplate.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}如果您需要更多安全性,请添加 SAN。template.DNSNamestemplate.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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go