我正在编写配置守护程序。
它的工作原理如下:
接受
方法
示例:
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身份验证”?
答案 0 :(得分:0)
您可以使用普通服务器证书,例如您在服务器的Web服务器中使用的证书。当你连接时,Go会正确检查。
至于客户端证书,here is a gist显示如何生成和使用Go的客户端证书。
我已将此代码用于与客户联系的类似安全系统。
您不需要通过IP地址连接,因为客户端将检查服务器的证书是否与主机名匹配,这是一个非常好的检查。
希望有所帮助!
答案 1 :(得分:0)
需要什么?
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))