我正在尝试将 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 可以读取的格式。
答案1
我尝试使用 RSA 密钥,它工作正常
直到 7.8 版,OpenSSH 才使用 OpenSSL 的“传统”(即非 PKCS8)格式来处理私钥类型 RSA、RSA 和 ECDSA,但不使用 Ed25519,后者使用 OpenSSH 的“新格式”,因为该算法(或其他 Bernstein 等人的算法)没有(现在仍然没有)OpenSSL 传统格式。如果您使用Windows 版本的puttygen,我猜你这样做了,尽管你没有这么说,因为 Unix 版本的 puttygen 没有将此转换描述为导出,它会以Conversions / Export OpenSSH key
OpenSSL 可以使用的旧格式写入 RSA,但会以 OpenSSL 无法使用的新格式写入 Ed25519。但也会Export OpenSSH key (force new format)
为 RSA 写入新格式,并且惯于可用。
虽然没有功能可以自动将 Ed25519 的 Putty 或 OpenSSH 格式转换为 OpenSSL 使用的 PKCS8 格式,但在 Unix 中手动破解 Ed25519 的 PKCS8 未加密变体并不难,包括 Windows 上的 Unixalikes(现在相当常见):WSL、git4win 又名 git-bash、cygwin、mingw、gnuwin32。只需Private-lines:
从未加密的 PuTTY ed25519 中取出并执行以下操作:
( printf '\x30\x2e\x02\x01\x00\x30\x05\x06\x03\x2b\x65\x70\x04\x22\x04\x20';
printf AAAAIDt5Sc7bkLdz0zduq1sOW4dgXWNvkzfKShwdR7U9H6gZ | base64 -d | tail -c+5 ) | openssl pkey
# for OpenSSL versions below 3.0.0 (all now EOL upstream) append -inform der
在裸机 Windows 中,我敢打赌在 PowerShell 中可以完成等效操作,但我对它了解不够多,无法做到这一点。
或者,正如 AB 所评论的,您可以使用 OpenSSL 生成密钥,它(不出所料)已经使用 OpenSSL 格式并且不需要任何转换:
openssl genpkey -algorithm ed25519
或者因为对于 Java 密钥库,你实际上想要创建私钥和自签名证书,您可以在命令中执行req
:
openssl req -newkey ed25519 -x509 -keyout keyfile -out certfile [-nodes] [other options]
最后,如果您想要一个 Java 密钥库,因为您正在使用支持 Ed25519 的 Java 版本/环境——而且我看不出任何其他合理的理由——您可以首先在 Java 中生成它:
keytool -genkeypair -keyalg ed25519 [-keystore file] [other options]
注意 Java 9 以上版本默认会将密钥库创建为 PKCS12 而非 JKS。如果您确实需要 JKS,请指定-storetype JKS
。但是没有支持 Ed25519 的 Java 版本需要甚至更喜欢 JKS,所以我不明白您为什么要这样做。