TLS身份验证:每个证书需要包含哪些内容?

时间:2014-10-17 14:24:41

标签: go x509

我正在编写配置守护程序。

它的工作原理如下:

接受

  • GET(阅读)
  • POST(更新)
  • PUT(创建)
  • 删除(删除)

方法

示例:

PUT http://server1/key(body = value)

在键

下存储值

GET http://server1/key

返回响应正文中的值

现在,当进行PUT,POST,DELETE时,它会复制此请求并将其发送给对等方,以便每个节点都具有相同的数据,并且在其中一个节点不可用的情况下可以查询任何节点。它添加了一个标题,以便节点知道它们不应该复制请求并发送给其他节点。

好的,到目前为止,这是有效的,但现在我只想让节点和WebUI能够将请求传输到这些节点。这里是TLS发挥作用的地方。

据我所知,我需要rootCA,所以我可以签署服务器和客户端证书。我想拥有有效的证书,而不是“自签名”,因为我会使用Go和crypto / tls,它应该验证证书。

我的问题是:

每个证书需要哪些扩展名或字段? 将新节点添加到配置服务器池时,我不想重新生成服务器和客户端证书。

我将通过IP地址连接,而不是通过hostname / dnsname连接(通过为自己的dnsname分配IP来跳过主机名查找和潜在的第三方窃听,例如s1.myserver.com是我的IP 1.2.3.4随机dude用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身份验证”?

2 个答案:

答案 0 :(得分:0)

您可以使用普通服务器证书,例如您在服务器的Web服务器中使用的证书。当你连接时,Go会正确检查。

至于客户端证书,here is a gist显示如何生成和使用Go的客户端证书。

我已将此代码用于与客户联系的类似安全系统。

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

希望有所帮助!

答案 1 :(得分:0)

需要什么?

  1. 证书颁发机构(CA)
  2. 第一个CA签署的另一个CA
  3. 如果您愿意,可以使用更多CA.
  4. 2和3是可选的

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

    1. 服务器证书和密钥
    2. 使用创建的最少CA签署证书。最少的CA将是您将用于验证客户端证书的CA

      此证书还充当客户端证书,因此需要

      template.KeyUsage = x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature
      template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth, x509.ExtKeyUsageServerAuth}
      

      如果您需要更多安全性,请添加SAN。

      template.DNSNames
      template.IPAddresses
      
      1. 在您的服务器中
      2. 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))