我正在尝试使用 PEM(X.509) 证书(存储在磁盘上的 privateKey.pem 文件中)对通过 Java 中的套接字发送的消息进行签名,但是在找到一个接近的示例时遇到了很多麻烦。我通常是一个 C++ 人,只是介入帮助这个项目,所以当我不熟悉 API 时,我很难将它们全部组合成可以工作的代码。
不幸的是,我仅限于 Java 标准的方法(1.6.0 Update 16),所以虽然我发现了一个使用BouncyCastle的PEMReader的类似示例,但它对这个特定项目没有多大帮助。
我的 privateKey.pem 密钥受密码保护,形式为:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED DEK-Info:
DES-EDE3-CBC,63A862F284B1280B
[...]
tsjQI4H8lhOBuk+NelHu7h2+uqbBQzwkPoA8IqbPXUz+B/MAGhoTGl4AKPjfm9gu
OqEorRU2vGiSaUPgDaRhdPKK0stxMxbByUi8xQ2156d/Ipk2IPLSEZDXONrB/4O5
[...]
-----END RSA PRIVATE KEY-----
它们的密钥是使用 OpenSSL 生成的:
openssl.exe genrsa -out private_key.pem 4096
我无法在运行前将此密钥转换为 DER 或其他格式,任何必要的转换都需要在代码内部完成,因为密钥需要易于替换并且格式将保持为 PEM。
我听到了很多我不完全确定的事情,并希望 SO 的集体思想可以帮助将这些碎片拼凑在一起。
听说PEM证书需要Base64 Decoded才能转换成可以使用的DER证书。我有一个名为MiGBase64的 Base64 解码工具,但我不完全确定如何/何时需要完成此解码。
我迷失在 Java API 文档中,试图追踪存在的 15 种不同类型的密钥、密钥库、密钥生成器、证书等,但我对它们中的任何一个都不够熟悉,无法正确识别我需要成为使用,以及如何一起使用它们。
基本算法看起来很简单,这就是为什么我无法编写一个同样简单的实现特别令人沮丧的原因:
1) 从文件中读取 privateKey.pem
2) 将私钥加载到 XXX 类中,使用 Passphrase 解密密钥
3) 使用带有 Signature 类的密钥对象对消息进行签名
非常感谢您对此提供帮助,尤其是示例代码。我一直在努力为这个问题找到有用的例子,因为大多数“接近”的例子都是使用 BouncyCastle 生成新的键,或者只是使用不适用的不同形式的键/类。
这似乎是一个非常简单的问题,但它让我发疯,任何非常简单的答案?