keyStore.getKey () возвращает NULL - PullRequest
       30

keyStore.getKey () возвращает NULL

0 голосов
/ 08 октября 2018

Я хочу подписать PDF с самостоятельно сгенерированным сертификатом.В этом процессе мне нужно хранилище ключей и закрытый ключ.Подписание будет выполнено с помощью PDFBox с использованием класса CreateSignature()

. Для создания хранилища ключей с самостоятельно сгенерированным сертификатом я использую это:

   public KeyStore generateSampleKeyStoreWith509Certificate() throws KeyStoreException, NoSuchAlgorithmException,
        CertificateException, IOException, UnrecoverableEntryException {

    X509Certificate cert;
    PrivateKey caKey;

    try {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
        keyPairGenerator.initialize(1024, new SecureRandom());
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        caKey = keyPair.getPrivate();

        Date notBefore = new Date();
        Date notAfter = new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 365);
        SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(keyPair.getPublic().getEncoded());
        X509v3CertificateBuilder newGen = new X509v3CertificateBuilder(new X500Name(issuer), serial, notBefore,
                notAfter, new X500Name(subject), spkInfo);
        ContentSigner sigGen = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider("BC")
                .build(caKey);
        X509CertificateHolder certHolder = newGen.build(sigGen);
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream is1 = new ByteArrayInputStream(certHolder.getEncoded());
        cert = (X509Certificate) cf.generateCertificate(is1);
        is1.close();

    } catch (OperatorCreationException | CertificateException | IOException | NoSuchProviderException
            | NoSuchAlgorithmException e) {
        throw new RuntimeException(e);
    }

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null, password);
    keyStore.setCertificateEntry("SelfSigned", cert);

    return keyStore;
}

Сертификат введен правильно, ноне должно ли быть ключ тоже?Или я не прав, что в хранилище ключей должен быть ключ?

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

1 Ответ

0 голосов
/ 08 октября 2018
 X509Certificate[] certChain = new X509Certificate[1];
 certChain[0] = cert;

 keyStore.setKeyEntry("SelfSigned",caKey, password, certChain);

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

...