我正在尝试将 putty 生成的 Ed25519 私钥转换为 JKS 密钥库,我尝试查看大量文档,但我有点迷失
首先,我使用 puttygen 生成密钥(这是我用作示例的密钥,我不打算使用这个)
PuTTY-User-Key-File-3: ssh-ed25519
Encryption: none
Comment: eddsa-key-20240404
Public-Lines: 2
AAAAC3NzaC1lZDI1NTE5AAAAIN3TmCpGrfLD94S1GjHtsFUNw6hsd3SRHeuj06Yj
y9F5
Private-Lines: 1
AAAAIDt5Sc7bkLdz0zduq1sOW4dgXWNvkzfKShwdR7U9H6gZ
Private-MAC: df9c28347ae0cdd41627521dc1052f7043d6ce689e2e8bebfb492493ba6382c5
然后我使用 puttygen 将其导出为 OpenSSH 格式
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtz
c2gtZWQyNTUxOQAAACDd05gqRq3yw/eEtRox7bBVDcOobHd0kR3ro9OmI8vReQAA
AKC2h1lEtodZRAAAAAtzc2gtZWQyNTUxOQAAACDd05gqRq3yw/eEtRox7bBVDcOo
bHd0kR3ro9OmI8vReQAAAEA7eUnO25C3c9M3bqtbDluHYF1jb5M3ykocHUe1PR+o
Gd3TmCpGrfLD94S1GjHtsFUNw6hsd3SRHeuj06Yjy9F5AAAAEmVkZHNhLWtleS0y
MDI0MDQwNAECAwQFBgcICQoL
-----END OPENSSH PRIVATE KEY-----
然后我尝试使用 openssl 将其转换为 pkcs12 存储,但它无法读取私钥,所以我被困在这里。
openssl req -new -x509 -key key.pem -out certfile
结果是:
Could not find private key from key.pem
我尝试使用 RSA 密钥,它工作正常,但使用 Ed25519 我无法让 openssl 读取 openssh 格式或将其转换为 openssl 可以读取的格式。
在版本 7.8 之前,OpenSSH 对私钥类型 RSA、RSA 和 ECDSA 使用 OpenSSL“传统”(即非 PKCS8)格式,但不使用 Ed25519,Ed25519 使用 OpenSSH 的“新格式”,因为过去(现在仍然)没有 OpenSSL 传统格式该算法的格式(或其他 Bernstein 等人的算法)。如果你使用Windows 版本的puttygen,我假设你使用了,但你没有这么说,因为 Unix 版本的 puttygen 没有将这种转换描述为导出,
Conversions / Export OpenSSH key
以旧格式写入 RSA,OpenSSL 可以使用,但 Ed25519 以新格式写入OpenSSL 无法使用。但Export OpenSSH key (force new format)
也为 RSA 编写了新格式,但该格式将无法使用。虽然没有自动将 Ed25519 的 Putty 或 OpenSSH 格式转换为 OpenSSL 使用的 PKCS8 格式的功能,但 Ed25519 的 PKCS8 的未加密变体在 Unix 中并不难手动破解,包括 Windows 上的 Unixalikes(现在相当常见):WSL 、git4win 又名 git-bash、cygwin、mingw、gnuwin32。
Private-lines:
只需从未加密的 PuTTY ed25519 中获取并执行以下操作:在裸露的 Windows 中,我敢打赌,在 PowerShell 中也可以完成相同的操作,但我对它的了解还不够多,无法做到这一点。
或者,正如 AB 所评论的,您可以使用 OpenSSL 生成密钥,它(毫不奇怪)已经使用 OpenSSL 格式并且不需要任何转换:
或者,由于对于 Java 密钥库,您实际上想要创建私钥和自签名证书,因此您可以在
req
命令中执行此操作:最后,如果您想要一个 Java 密钥库,因为您使用的是支持 Ed25519 的 Java 版本/环境——而且我看不出任何其他有意义的原因——您可以首先在 Java 中生成它:
注意 Java 9 up 默认情况下将创建密钥库作为 PKCS12 而不是 JKS。如果您确实想要 JKS,请指定
-storetype JKS
。但是支持 Ed25519 的 Java 版本都不需要甚至更喜欢 JKS,所以我不明白你为什么想要这样做。