【问题标题】:Unable to load RSA private key to sign a string无法加载 RSA 私钥来签署字符串
【发布时间】:2019-07-06 17:48:36
【问题描述】:

我正在尝试使用我使用来自here 的命令生成的私钥对字符串消息进行签名。这是我用来加载和签署消息的下面这段代码。

private String signMessage(String message) throws Exception {
    Signature rsa = Signature.getInstance("SHA1withRSA");
    rsa.initSign(getPrivate(privateKeyPath));
    rsa.update(message.getBytes());
    return rsa.sign().toString();
}

public PrivateKey getPrivate(String filename) throws Exception {
    byte[] keyBytes = Files.readAllBytes(new File(filename).toPath());
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(spec);
}

为了澄清我提供的 privatekeyPath 类似于/path/test.der。

但是,我在尝试签署消息时收到以下错误 - java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

这里有什么问题?为什么我似乎无法使用私钥签署消息?有人可以指定一种工作方式来完成这项工作吗?

【问题讨论】:

  • 您还有其他问题,rsa.sign().toString(); 将返回一个数组引用,而不是任何签名。您需要对结果进行编码以获得有效的字符串 (stackoverflow.com/questions/13109588/encoding-as-base64-in-java/…)
  • 很抱歉,我误读了您的问题并将der 与cer 混淆了。 der 文件可以包含二进制证书或私钥。在 pem 文件的情况下,它们以 base 64 编码。在此处查看完整示例 stackoverflow.com/questions/11410770/…
  • 看来你的getPrivate方法是正确的,所以我猜问题出在私钥的生成或格式上。是这样的吗?
  • Signature.verify(signature[]) 只有一个参数。消息设置为Signature.update(message[]),公钥设置为Signature.initVerify(pubKey)
  • 好吧,我没听懂你的意思。第二个参数是签名。在您的问题中,这将是rsa.sign() 的结果。请注意,在链接的问题中,签名以 base64 编码。您不需要这样做,因为您可以使用二进制数组。在您的代码中,rsa.sign().toString() 是一个错误,因为二进制数组无法转换为字符串。您应该使用二进制数据或将其编码为 base 64

标签: java openssl digital-signature


【解决方案1】:

看来你的getPrivate方法是正确的,所以我认为问题出在密钥的生成或格式上

der 文件可以包含二进制证书或私钥。对于 pem 文件,它们以 base 64 编码。通常您需要一个 .key 文件或内容以 -----BEGIN PRIVATE KEY----- 开头的 .pem 文件

确保您使用的是包含pkcs#8 密钥的二进制der 格式,以便Java 可以读取它。在此处查看完整示例:https://stackoverflow.com/a/19387517/6371459


在您的代码中rsa.sign().toString() 是一个错误,因为二进制数组无法转换为字符串。您应该使用二进制数据或将其编码为 base 64 请注意,在链接的问题中,签名以 base64 编码。您不需要这样做,因为您可以使用二进制数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2020-12-07
    • 2011-11-05
    • 2023-04-02
    • 2013-06-08
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多