Проблемы с получением закрытого ключа из файла - PullRequest
0 голосов
/ 23 февраля 2019

У меня появляется сообщение об ошибке при создании экземпляра PKCS8Key, но я не могу понять проблему.когда я вызываю

new org.apache.commons.ssl.PKCS8Key(new FileInputStream(keyPath), pass.toCharArray())

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

java.lang.IllegalArgumentException: Null input buffer

    at javax.crypto.Cipher.doFinal(Cipher.java:2161)
    at org.apache.commons.ssl.PKCS8Key.decrypt(PKCS8Key.java:437)
    at org.apache.commons.ssl.PKCS8Key.decryptPKCS8(PKCS8Key.java:734)
    at org.apache.commons.ssl.PKCS8Key.<init>(PKCS8Key.java:237)
    at org.apache.commons.ssl.PKCS8Key.<init>(PKCS8Key.java:105)

Это хорошо работает с большим количеством файлов .cer / .key, на данный момент у меня есть только 1 файл с этим сообщением об ошибке .. но для меня это не такочистить поиск ... или понять, почему ввод неправильный.Наконец, мне нужно отправить своему пользователю четкое сообщение об исключении.

@Test
public void sealDocument() throws Exception {
    Security.addProvider(new BouncyCastleProvider());

    String keyPath = "example.key";
    String pass = "keyPass";
    String cerPath = "example.cer";
    String fileName = "doc.txt";

    CertificateFactory fact = CertificateFactory.getInstance("X.509");
    FileInputStream is = new FileInputStream(cerPath);
    X509Certificate cer = (X509Certificate) fact.generateCertificate(is);

    byte[] privateKeyByte = new org.apache.commons.ssl.PKCS8Key(new FileInputStream(keyPath), pass.toCharArray()).getDecryptedBytes();
    // Here is my error
    // When is creating
    KeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyByte);
//        java.lang.IllegalArgumentException: Null input buffer
//
//        at javax.crypto.Cipher.doFinal(Cipher.java:2161)
//        at org.apache.commons.ssl.PKCS8Key.decrypt(PKCS8Key.java:437)
//        at org.apache.commons.ssl.PKCS8Key.decryptPKCS8(PKCS8Key.java:734)
//        at org.apache.commons.ssl.PKCS8Key.<init>(PKCS8Key.java:237)
//        at org.apache.commons.ssl.PKCS8Key.<init>(PKCS8Key.java:105)

    //Next lines can be ignored

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec);

    // With 3 arguments I can seal
    sealDocument(privateKey, cer, fileName);

}

Мой вопрос заключается в том, что означает сообщение об ошибке, в основном, чтобы добавить

throw new SealDocumentException('a nice error Message');
...