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

Go TLS身份验证:每个证书需要包含哪些内容?,go,x509,Go,X509,我正在编写一个配置守护程序 它的工作原理如下: 接受 阅读 更新后 投入创造 删除 方法 例如: 放http://server1/key 主体=价值 在键下存储值 得到http://server1/key 返回响应体中的值 现在,当执行PUT、POST、DELETE时,它会复制此请求并将其发送给对等方,以便每个节点都具有相同的数据,并且在其中一个节点不可用时可以查询任何节点。它添加了一个头,这样节点就知道它们不应该复制一个请求并发送给其他节点 好的,到目前为止这是可行的,但是现在我只希望允许节点

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

它的工作原理如下:

接受

阅读 更新后 投入创造 删除 方法

例如:

放http://server1/key 主体=价值

在键下存储值

得到http://server1/key

返回响应体中的值

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

好的,到目前为止这是可行的,但是现在我只希望允许节点和WebUI能够将请求传输到这些节点。这就是TLS发挥作用的地方

据我所知,我需要一个rootCA,这样我就可以签署服务器和客户端证书。我希望有有效的证书,而不是自签名,因为我将使用Go和crypto/tls,它应该验证证书

我的问题是:

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
每个证书需要哪些扩展名或字段? 当新节点添加到配置服务器池时,我不想重新生成服务器和客户端证书

我会通过IP地址而不是主机名/dnsname进行连接,通过将IP分配给他们自己的dnsname来跳过主机名查找和第三方的潜在窃听,例如,s1.myserver.com是我的IP 1.2.3.4,random 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身份验证?

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

至于客户端证书,显示如何从Go生成和使用客户端证书

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

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

希望有帮助

需要什么

证书颁发机构CA 由第一个CA签署的另一个CA 如果你愿意的话,再来一杯 2和3是可选的

CAs需要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
在您的服务器中 a
谢谢,我读了,我需要一段时间来测试,所以不能只使用ListendServetls,你必须手动执行listen/accept舞蹈,我希望避免这种情况。我确实希望通过IP连接,因为我通过查找clusterconf.mydomain.tld从接收的IP列表中删除了此服务器的IP,反向查找可能会返回不需要的主机名。这确实有帮助。但是您可以使用http.Server,不需要监听,也可以手动接受。但这是一个很好的解释。@dalu是的,你是对的。gist之所以这样做,是因为它用于调试客户端证书的问题。为了使用ListendServetls,我会尽量抽出时间对其进行更新。如果这样做,不要替换-扩展:将内部工作记录在纸上是很有用的。