使用 PEM 编码的加密私钥对消息进行本机签名
我正在尝试使用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解码才能将其转换为可以使用的DER证书。我有一个名为MiGBase64的Base64解码工具,但我不完全确定如何/何时需要完成此解码。
我在Java API文档中迷失了,试图追踪存在的15种不同类型的密钥,KeyStores,KeyGenerators,Certificates等,但我对它们中的任何一个都不够熟悉,无法正确识别我需要使用哪些密钥,以及如何一起使用它们。
基本算法似乎非常简单,这就是为什么我无法编写同样简单的实现而特别令人沮丧的原因:
1) 从文件
读取 privateKey.pem 2) 将私钥加载到 XXX 类中,使用密码解密密钥
3) 将密钥对象与 Signature 类一起使用对消息进行签名
非常感谢这方面的帮助,特别是示例代码。我一直在努力寻找这个问题的有用示例,因为大多数“接近”示例都是使用BouncyCastle生成新密钥,或者只是使用不同形式的键/类在这里不适用。
这似乎是一个非常简单的问题,但它让我发疯,任何非常简单的答案?