Ошибка при импорте закрытого ключа в Java

ОБНОВЛЕНИЕ: Это предложение решило мою проблему

Я создал закрытый ключ с помощью OpenSSL и получил соответствующий открытый сертификат. Я создал закрытый ключ с помощью следующей команды:

openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key

И закрытый ключ, и открытый сертификат закодированы в кодировке Base64.

Формат закрытого ключа, закодированного в PEM, выглядит примерно так:

-----BEGIN ENCRYPTED PRIVATE KEY-----
...
-----END ENCRYPTED PRIVATE KEY-----

Публичный сертификат имеет формат:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Теперь я импортирую их в свое приложение Java, чтобы создать SSLContext. Я хочу избежать двух вещей:

  • Использование хранилища ключей Java (или .jks)
  • Использование BouncyCastle

Пока у меня есть следующий код Java:

Шаг 1. Считывание закрытого ключа и открытого сертификата:

byte[] certBytes = convertFileToBytes(new File("public.cer"));
byte[] keyBytes = convertFileToBytes(new File("private.key"));

Шаг 2. Создайте общедоступный сертификат из байтов, закодированных в двоичном формате:

private static X509Certificate generatePublicCert(byte[] certBytes) {
    CertificateFactory factory = CertificateFactory.getInstance("X.509");
    return (X509Certificate)factory.generateCertificate(new ByteArrayInputStream(certBytes));
}

Шаг 3. Создайте закрытый ключ из байтов, закодированных в двоичном формате:

private static PrivateKey generatePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(spec);
}

Шаг 4. Создайте SSLContext:

private static SSLContext getContext() {
    X509Certificate cert = generatePublicCert(certBytes);
    PrivateKey key = generatePrivateKey(keyBytes);

    KeyStore keyStore = KeyStore.getInstance("JKS"); // Do I still need this?
    keyStore.load(null);
    keyStore.setCertificateEntry("cert-alias", cert);
    keyStore.setKeyEntry("key-alias", key, "MyPassphrase".toCharArray(), new Certificate[] {cert});

    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    kmf.init(keyStore, "MyPassphrase".toCharArray());

    KeyManager[] km = kmf.getKeyManagers();
    context.init(km, null, null);
    return context;
 }

Но на шаге 3 я получаю сообщение об ошибке:

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(Unknown Source)
    at java.security.KeyFactory.generatePrivate(Unknown Source)

Что я делаю неправильно?


person BlueChips23    schedule 24.06.2015    source источник
comment
Разве вам не нужен класс EncryptedPrivateKeyInfo для расшифровки содержимого ЗАШИФРОВАННОГО ЧАСТНОГО КЛЮЧА?   -  person Jim Flood    schedule 24.06.2015


Ответы (1)


Вы уверены, что ваш ключ имеет правильный формат?

Попробуйте удалить строки, начинающиеся с ----, из файла ключа и сертификата.

person duffy356    schedule 24.06.2015