从here,我了解到,我们需要一个公共密钥和用户识别:
目标是在两个节点(客户端和服务器)之间建立SSL / TLS连接。
根据上图,我的理解是提供公共密钥作为创建CSR的输入,但第4步使用私钥(server-key.pem
)创建CSR({{1} })
步骤1)创建证书颁发机构密钥
server.CSR
第2步)创建证书颁发机构
$ openssl genrsa -aes256 -out ca-key.pem 4096
第3步)创建服务器密钥
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
步骤4)按输入用户识别创建证书签名请求(CSR)
$ openssl genrsa -out server-key.pem 4096
步骤5)添加配置
$ openssl req -subj "/CN=dockerbuild.harebrained-apps.com" -sha256 -new -key server-key.pem -out server.csr
步骤6)创建服务器证书
$ echo subjectAltName = IP:40.xx.xx.164,IP:10.0.0.4,IP:127.0.0.1,DNS:dockerbuildsys.westus.cloudapp.azure.com,DNS:dockerbuild.harebrained-apps.com > extfile.cnf
第7步)创建客户端私钥
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
步骤8)通过输入用户标识为客户端创建CSR
$ openssl genrsa -out key.pem 4096
步骤9)作为客户端证书扩展文件
$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr
步骤10)创建客户端证书
$ echo extendedKeyUsage = clientAuth > extfile.cnf
步骤11)删除签名请求
$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
步骤12)删除密钥的写入权限
$ rm -v client.csr server.csr
步骤13)读取权限证书为每个用户
$ chmod -v 0400 ca-key.pem key.pem server-key.pem
步骤14)在服务器端上传,证书颁发机构($ chmod -v 0444 ca.pem server-cert.pem cert.pem
),服务器证书(ca.pem
)和服务器密钥(server-cert.pem
)
我对对称和非对称密钥加密非常了解。
我们使用非对称密钥双方解决密钥分发问题(对称密钥)
我明白,每个证书具有所有者的公开密钥+标识(其提供证书)
问题:
1)server-key.pem
,ca-key.pem
和server-key.pem
是对称密钥吗?
2)为什么要创建证书颁发机构(key.pem
)?为什么我们需要私钥(ca.pem
)来创建证书颁发机构?
3)为什么我们需要私钥来创建CSR?因为它与上图矛盾?
4)为什么在创建证书之前创建证书签名请求(CSR)?客户端和服务器
5)为什么我们需要两个证书(服务器证书ca-key.pem
和客户端证书server-cert.pem
)?
6)cert.pem
是否创建包含公钥和用户标识的openssl req -subj "/CN=dockerbuild.harebrained-apps.com" -sha256 -new -key server-key.pem -out server.csr
?如果是,此公钥与证书(server.csr
)提供的公钥有何不同?
7)如果在上述过程中没有创建对称密钥,那么客户端和服务器如何进行加密通信?
8)server-cert.pem
/ server-key.pem
/ server-cert.pem
(在服务器上上传)如何与ca.pem
/ key.pem
/ cert.pem
(在客户端上)一起工作)?
答案 0 :(得分:3)
1)ca-key.pem,server-key.pem和key.pem是对称密钥吗?
这些是非对称密钥。创建证书时完全不涉及对称密钥。对称密钥仅涉及TLS中的实际加密。
2)为什么要创建证书颁发机构(ca.pem)?为什么我们需要私钥(ca-key.pem)来创建证书颁发机构?因为它与上面的图矛盾
CA是信任锚。 CA的私钥用于颁发(签名)新证书。包含公钥的CA证书受到喜欢验证证书的一方的信任。请参阅datatype precedence,以更好地了解CA证书,叶证书和签名(使用私钥完成)如何一起使用。
实际上没有必要拥有一个CA,即可以使用一个自签名证书。但是在这种情况下,希望使用证书来验证连接的每一方都需要对它应该能够验证的每个自签名证书有一些先验知识。这不能很好地扩展,即,显式信任CA,然后从这种信任中派生出CA颁发的证书更容易。
3)为什么我们需要私钥来创建CSR?因为它与上图矛盾?
对CSR进行签名,以证明您拥有与CSR(以及将来的证书)中的公钥匹配的私钥。
4)为什么在创建证书之前创建证书签名请求(CSR)?客户端和服务器
通常,CSR由不同于CA的另一方创建。在这种情况下,CSR是一个已签名的容器,它提供有关当事方喜欢已颁发的证书的信息。从技术上来讲,创建证书不是必需的,而是在组织上。
5)为什么我们需要两个证书(服务器证书server-cert.pem和客户端证书cert.pem)?
我们没有。通常,仅需要服务器证书即可确保客户端与正确的服务器通信。客户端证书仅在相互身份验证时才需要,服务器也希望使用证书对客户端进行身份验证。
6)server.csr是否包含公钥+用户标识?是,该公钥与证书提供的公钥有何不同?
CSR中的公钥与证书中的公钥相同。证书(域)中包含特定于用户的信息,但是CA在颁发证书之前必须通过其他方式验证这些信息实际上是正确的(即用户拥有该域)。
7)如果在上述过程中没有创建对称密钥,那么客户端和服务器如何进行加密通信?
TLS握手包含一个身份验证部分(根据证书检查服务器是否为预期的一部分)和一个密钥交换。后者生成用于加密应用程序数据的对称密钥。有关详细信息,请参见SSL Certificate framework 101: How does the browser actually verify the validity of a given server certificate?。
8)server-key.pem / server-cert.pem / ca.pem(在服务器上上传)如何与key.pem / cert.pem / ca.pem(在客户端上)一起工作?
服务器证书的私钥用于在TLS握手中签署一些挑战,以证明服务器拥有给定的证书。如果完成相互身份验证,则以类似的方式使用客户端证书的私钥。 CA证书用于验证证书(再次参见How does SSL/TLS work?)。