HTTPS/PKI 服务器公钥/私钥对

HTTPS/PKI 服务器公钥/私钥对

在 HTTPS 安全会话握手中,我理解服务器出示其公钥,客户端使用该公钥加密对称会话密钥并将其返回给服务器。

我的问题是,服务器何时生成其私钥/公钥对?我可以看到它为每个连接生成一个密钥对,并且我可以看到它只有一个密钥对,它会在每个连接中重复使用。为每个连接创建密钥对似乎更安全。这重要吗?

答案1

首先,TLS 具有一些密钥交换类型。您描述的方法实际上已经逐步淘汰了一段时间——实际上几乎所有的 TLS 连接都使用 Diffie-Hellman 密钥交换算法来生成对称密钥。

在您描述的较旧的所谓“静态 RSA 密钥交换”协议中,服务器根本不生成密钥对;它始终使用预先存在的密钥对来自其 TLS 证书。(通常证书的密钥对由系统管理员生成。)

服务器将出示其 X.509 证书(其中包含公钥);客户端将验证该证书,然后使用其公钥加密共享密钥。如果服务器能够解密,那么这还可以向客户端证明服务器确实拥有所出示的证书。

但这种方法已被逐步淘汰,部分原因是RSA 加密问题(与 RSA 签名相反),部分原因是它不提供“前向保密”,因为所有对称秘密都用相同的永久密钥加密。

类似地,TLS 有两种 Diffie-Hellman 密钥交换;“静态 DH”,其中服务器始终使用来自其证书的相同 DH 参数(您可以猜到它有与静态 RSA 类似的问题)和“临时 DH”,其中 DH 密钥对在每个连接时都会重新生成。

为每个连接创建密钥对似乎更安全。这重要吗?

如果服务器可以生成临时密钥对并使用其“主”密钥作为证明对其进行签名,那确实会更安全。

对于 RSA 密钥交换,此方法从未在 SSL 或 TLS 中使用过,尽管它SSHv1 中也曾使用过(SSHv1 很久以前也已完全淘汰)。在 SSHv1 中,服务器守护进程用于在启动时生成临时 RSA 密钥对,然后每小时左右生成一次。

但对于“临时 DH”,即 (EC)DHE 密钥交换,这正是正在做的事情。服务器生成一个新的 DH 密钥对对于每个连接并使用其证书对其进行签名。

简短的回答是:

  • 使用RSA、密码套件时DHECDH服务器的密钥对是静态的,并且公钥嵌入到其 TLS 证书中(因此仅当系统管理员获得新证书时才会重新生成)。
  • 使用DHEECDHE密码套件,每次连接都会生成服务器的密钥对。

相关内容