Как использовать java для создания csr из существующего хранилища ключей

Как использовать код Java для создания csr из существующего хранилища ключей?

Влияние функции будет таким же, как (но не создание файла)

keytool -certreq -alias certificate_alias -keystore jssecacerts -storepass changeit -file client.csr

Я только что узнал "Создание запроса на подпись сертификата с помощью API Java"

Но у меня уже есть сертификат X.509, как я могу использовать этот сертификат для создания csr в java?

KeyStore ts = KeyStore.getInstance("JKS");
FileInputStream is = new FileInputStream(trustStoreFileName);

ts.load(is, trustStorePassword.toCharArray());
is.close();
X509Certificate x509Cert = (X509Certificate)ts.getCertificate("certificate_alias");

Как я могу использовать приведенную выше информацию для создания CSR?

Я просто решаю это~

Чтобы поделиться всем моим кодом для создания csr из существующего сертификата.

KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream is = new FileInputStream(trustStoreFileName);

ks.load(is, trustStorePassword.toCharArray());
is.close();

X509Certificate x509Cert = (X509Certificate)ks.getCertificate("certificate_alias");

X500Principal principal = x509Cert.getSubjectX500Principal();
X500Name x500Name = new X500Name( principal.getName() );

PublicKey publicKey = x509Cert.getPublicKey();
PrivateKey privateKey = (PrivateKey) ks.getKey("certificate_alias", trustStorePassword.toCharArray());

String sigAlg = x509Cert.getSigAlgName();
PKCS10 pkcs10 = new PKCS10(publicKey);
Signature signature = Signature.getInstance(sigAlg);
signature.initSign(privateKey);
pkcs10.encodeAndSign(new X500Signer(signature, x500Name));
ByteArrayOutputStream bs = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(bs);
pkcs10.print(ps);
byte[] c = bs.toByteArray();
try {
    if (ps != null)
        ps.close();
    if (bs != null)
        bs.close();
} catch (Throwable th) {
}

person RoyHSIEH    schedule 01.12.2016    source источник
comment
Вы создаете CSR из существующего хранилища ключей. Вы не можете сгенерировать CSR из сертификата, так как у него нет закрытого ключа. Ваш вопрос не имеет смысла.   -  person user207421    schedule 02.12.2016
comment
Спасибо за ответ, я разобрался~   -  person RoyHSIEH    schedule 07.12.2016
comment
Отвечает ли это на ваш вопрос? Создать запрос на подпись сертификата в приложении для Android   -  person Josh Correia    schedule 25.07.2020


Ответы (1)


Вам нужен открытый ключ из сертификата и закрытый ключ для подписи CSR. JKS может содержать сертификаты x509 и пары ключей. Итак, убедитесь, что он у вас есть

PrivateKey privateKey = ts.getPrivateKey("certificate_alias");

Как только CSR будет подписан, ЦС выдаст новый X509Certificate. Но не принято повторно использовать существующие ключи (которые могли быть скомпрометированы) для выпуска нового сертификата. Рекомендуется сгенерировать новую пару ключей

person pedrofb    schedule 02.12.2016