Как изменить формат, в котором Java+BouncyCastle записывает мой закрытый ключ?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как изменить формат, в котором Java+BouncyCastle записывает мой закрытый ключ?

Сообщение Anonymous »

У меня есть файл pkcs12, содержащий пару открытого и закрытого ключей, созданную с помощью openssl. Моя Java-программа считывает файл pcks12 и сохраняет открытый и закрытый ключи отдельно для использования демоном http. Однако некоторые ключи вызывают проблемы.
Когда я создаю ключ с помощью RSA, все работает нормально. Проблема в EC и конкретно в Java и Bouncy Castle. Я могу извлечь закрытый ключ из файла pkcs12 в командной строке и получить файл, который начинается с «----- BEGIN PRIVATE KEY -----». Я могу использовать команду openssl ec, чтобы прочитать этот файл, и демон HTTP тоже его примет.
Но ключ, создаваемый Java, начинается с '-----BEGIN ЧАСТНЫЙ КЛЮЧ ЕС -----'. Команда openssl ec не может его прочитать, и демон HTTP тоже отклоняет его.
Мне нужно иметь возможность экспортировать закрытый ключ, чтобы его можно было использовать HTTP. Я предполагаю, что это означает ключ в форме «----- BEGIN PRIVATE KEY -----». Или мне нужно, чтобы демон Apache httpd принимал форму, которую выводит Java.
Подробная информация приведена ниже. Мы будем очень благодарны за любую помощь!
Вот как я создал закрытый ключ:
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-384 \
-pkeyopt ec_param_enc:named_curve \
-out "$KEY_DIR/$commonname.key" -pass pass:$PASSWORD


Вот как я извлек его из файла PKCS12 в командной строке:
openssl pkcs12 -in rick5.p12 -nocerts -noenc -out good.key
А вот суть кода Java, который я использую для написания закрытого ключа (certfile — это файл PKCS12):
try (FileInputStream in = new FileInputStream(certFile)) {

KeyStore certs = KeyStore.getInstance(keyStoreType);
certs.load(in, certSecret_in.toCharArray());

} catch(Exception e){
throw new RuntimeException("Unable to load server certificate", e);
}

try (PEMWriter writer = new PEMWriter(new FileWriter(path))){

Key key = certificate.getKey(alias, secret.toCharArray());
writer.writeObject(key);

} catch (Exception e) {
throw new RuntimeException("Could not save private key", e);
}

Вот еще одна информация, которая может оказаться полезной. В приведенном ниже выводе «good.key» — это ключ, который я извлек из файла pkcs12 с помощью командной строки openssl. Файл bad.key — это файл, созданный Java.
root@rick5:lumeta# openssl ec -in good.key -noout -text
read EC key
Private-Key: (384 bit)
priv:
ac:76:0c:6a:08:9f:53:a1:7d:0e:a9:be:35:87:cc:
aa:a2:ce:05:86:2c:9d:41:df:fe:0e:d0:4d:07:a2:
bf:b2:6b:19:0b:09:3b:68:2a:b4:93:d6:c5:83:cf:
dd:c2:97
pub:
04:e9:77:06:a0:a4:72:47:e3:9a:1a:2b:ff:cc:54:
c7:85:a4:2b:2a:c3:ce:2c:8c:17:7e:18:8b:a1:e2:
d8:95:5f:22:84:eb:44:63:51:1e:f5:20:43:5e:4e:
87:32:30:2a:41:18:82:77:91:e0:a7:3a:89:24:26:
87:67:3d:a8:4d:0f:b4:27:65:21:40:86:c7:c5:32:
cc:e8:fd:7d:11:8d:bb:48:dc:f9:af:aa:4c:d7:cd:
7f:b6:94:5d:89:1c:e4
ASN1 OID: secp384r1
NIST CURVE: P-384

root@rick5:lumeta# openssl ec -in bad.key -noout -text
read EC key
Could not read private key from bad.key
402CCD163B7F0000:error:1608010C:STORE routines:ossl_store_handle_load_result:unsupported:crypto/store/store_result.c:151:
unable to load Key

root@rick5:lumeta# openssl asn1parse -in good.key -strictpem
0:d=0 hl=3 l= 182 cons: SEQUENCE
3:d=1 hl=2 l= 1 prim: INTEGER :00
6:d=1 hl=2 l= 16 cons: SEQUENCE
8:d=2 hl=2 l= 7 prim: OBJECT :id-ecPublicKey
17:d=2 hl=2 l= 5 prim: OBJECT :secp384r1
24:d=1 hl=3 l= 158 prim: OCTET STRING [HEX DUMP]:30819B0201010430AC760C6A089F53A17D0EA9BE3587CCAAA2CE05862C9D41DFFE0ED04D07A2BFB26B190B093B682AB493D6C583CFDDC297A16403620004E97706A0A47247E39A1A2BFFCC54C785A42B2AC3CE2C8C177E188BA1E2D8955F2284EB4463511EF520435E4E8732302A4118827791E0A73A89242687673DA84D0FB42765214086C7C532CCE8FD7D118DBB48DCF9AFAA4CD7CD7FB6945D891CE4

root@rick5:lumeta# openssl asn1parse -in bad.key -strictpem
0:d=0 hl=3 l= 155 cons: SEQUENCE
3:d=1 hl=2 l= 1 prim: INTEGER :01
6:d=1 hl=2 l= 48 prim: OCTET STRING [HEX DUMP]:AC760C6A089F53A17D0EA9BE3587CCAAA2CE05862C9D41DFFE0ED04D07A2BFB26B190B093B682AB493D6C583CFDDC297
56:d=1 hl=2 l= 100 cons: cont [ 1 ]
58:d=2 hl=2 l= 98 prim: BIT STRING


Подробнее здесь: https://stackoverflow.com/questions/792 ... rivate-key
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»