无法加载RSA私钥以对字符串进行签名

时间:2019-07-06 17:48:36

标签: java openssl digital-signature

我正在尝试使用私钥对字符串消息签名,该私钥是使用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

这是怎么了?为什么我似乎无法用私钥签名消息?有人可以指定一种可行的方法来完成此任务吗?

1 个答案:

答案 0 :(得分:1)

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

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

开头

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


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