【发布时间】:2021-11-01 20:17:20
【问题描述】:
我的目标是创建自己的 TLS 握手服务器,这样我就可以了解服务器-客户端之间的加密是如何工作的。我正在关注this 参考。在参考资料的Server Key Exchange Generation 部分中,私钥长度被称为 32 字节。但示例长度为 64 字节。此外,ssh-keygen 为private.key 输出 1612 个字符,为private.pub 输出 567 个字符。
我的预期结果:private.pub 应该在参考的Server Hello 部分中使用,它将长度为 32 字节的公钥发送给客户端。
我的实际结果:ssh-keygen 甚至 keytool(我无法使用 IntelliJ IDEA 读取文件,所以现在我正在避免它)输出超过 32 个字节。
使用的cmd
ssh-keygen
keytool -genkeypair -keyalg RSA -validity 7 -keystore keystore
测试\实验\tls\tls\TLSHandshake.java
class TLSHandshakeTest {
@Test
void doHandshake() {
String key = "MC4CAQAwBQYDK2VuBCIEIJCRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6v";
byte[] bytes = key.getBytes();
System.out.println(Arrays.toString(bytes));
// output: 64 instead of 32, does this mean that the `private.pub` file must be processed with an encoder?
System.out.println(bytes.length);
}
}
【问题讨论】:
-
键是64个字符,字节数组
bytes永远不会小于那个。 -
@Anders Lindgren 你能帮我了解一下服务器如何将公钥编码为 32 字节吗?假设我们将服务器配置为获取由
keytool生成的密钥库或由ssh-keygen生成的公钥? -
TLS1.3(或更早版本)服务器不能仅使用公钥,尤其不能使用
ssh-keygen生成的公钥文件。它通常需要一个证书,其中包含 公钥和许多其他信息(keytool -genkeypair创建这样的证书,尽管是不受信任的自签名证书),和 私钥。 PS:你标记了TLS1.2,但是你的Q不涉及TLS1.2。