Невозможно загрузить закрытый ключ RSA для подписи строки - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь подписать строковое сообщение, используя закрытый ключ, который я сгенерировал с помощью команд из здесь .Ниже приведен фрагмент кода, который я использую для загрузки и подписания сообщения.

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);
}

Чтобы пояснить, какой секретный ключ, который я предоставляю, похож на /path/test.der.

Однако япри попытке подписать сообщение появляется следующая ошибка - java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format

Что здесь не так?Почему я не могу подписать сообщение закрытым ключом?Может кто-нибудь указать рабочий способ сделать это?

1 Ответ

1 голос
/ 11 июля 2019

Кажется, что ваш метод getPrivate правильный, поэтому я думаю, что проблема заключается в генерации ключа или в формате

Файл der может содержать сертификаты или закрытые ключи в двоичном виде.В случае файлов pem они кодируются в базе 64. Обычно вам нужен файл .key или .pem, содержимое которого начинается с -----BEGIN PRIVATE KEY-----

Убедитесь, что вы используете двоичный формат derсодержащий ключ pkcs#8, чтобы Java могла его прочитать.Смотрите полный пример здесь: https://stackoverflow.com/a/19387517/6371459


В вашем коде rsa.sign().toString() ошибка, потому что двоичный массив не может быть преобразован в строку.Вы должны использовать двоичные данные или закодировать их в базу 64 Обратите внимание, что в связанном вопросе подпись закодирована в base64.Вам не нужно этого делать, потому что вы можете использовать двоичный массив.

...