2015-04-13 2 views
0

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

openssl genrsa -out privatekey.pem 2048 
openssl req -new -x509 -key privatekey.pem -out publickey.cer -days 365 
openssl pkcs12 -export -out public_privatekey.pfx -inkey privatekey.pem -in publickey.cer 

преобразовал PFX JKS в следующей команде:

keytool -importkeystore -srckeystore public_privatekey.pfx -srcstoretype pkcs12 
-destkeystore clientcert.jks -deststoretype JKS 

, и я доступ, что закрытый ключ входа и общественности сертификат ключа, используя следующий код Java:

KeyStore ks = KeyStore.getInstance("JKS"); 
ks.load(new FileInputStream(keystoreFile), "[email protected]#".toCharArray()); 

KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("1", new KeyStore.PasswordProtection("[email protected]#".toCharArray())); 
java.security.cert.X509Certificate cert = (java.security.cert.X509Certificate) keyEntry.getCertificate(); 

Я должен напечатать значение закрытого ключа на консоль следующим:

String key = Base64.encode(keyEntry.getPrivateKey().getEncoded()); 
System.out.println(key); 

Когда я сравниваю содержимое строки «ключ» и содержимое в файле «privatekey.pem», оба они разные. Является ли это чем-то, что я неправильно понимаю, или возникает проблема получения значения секретного ключа в коде?

ответ

3

Существует несколько форматов хранения секретных ключей. Среди них PKCS#1 и PKCS#8. Они отличаются алгоритмами шифрования и структурой ASN.1. Кроме того, PKCS # 8 поддерживает другие ключевые алгоритмы, кроме RSA.

Например это ASN.1 дамп первых байт незашифрованного PKCS # 8 Файл:

0000 4BE: SEQUENCE { 
0004 1: INTEGER 0 
0007 D: SEQUENCE { 
0009 9:  OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1) 
     :  (PKCS #1) 
0014 0:  NULL 
     :  } 
0016 4A8: OCTET STRING, encapsulates { 
001A 4A4:  SEQUENCE { 
001E 1:  INTEGER 0 
0021 101:  INTEGER  
     :   00 B3 17 E6 31 3C 36 24 ....1<6$ 

И тот же ключ в PKCS формат # 1 (опять же только первые несколько байт, остальная часть файла в основном сырой ключ):

0000 4A4: SEQUENCE { 
0004 1: INTEGER 0 
0007 101: INTEGER  
     :  00 B3 17 E6 31 3C 36 24 ....1<6$ 

Этот сайт содержит более подробное объяснение этих двух форматов: https://tls.mbed.org/kb/cryptography/asn1-key-structures-in-der-and-pem

Java обычно генерирует формат PKCS # 8, в то время как OpenSSL поддерживает оба формата и может конвертировать между ними: https://www.openssl.org/docs/apps/pkcs8.html

KeyStore Explorer также может генерировать, обрабатывать и преобразовывать оба формата.

Итак, если преобразовать privatekey.pem в PKCS # 8 с OpenSSL или KSE, он должен выглядеть идентично выходу System.out.println(key):

openssl pkcs8 -topk8 -in privatekey.pem -out privatekey.pkcs8 -nocrypt 
+0

. О, да, я запустил указанную вами команду и содержимое личного ключа теперь идентично. Означает ли это, что частный ключ отличается от PKCS # 1 и PKCS # 8, или ключ остается тем же, и это просто формат для хранения секретного ключа? –

+1

@MuhammadSalmanFarooq Сам ключ не изменяется, PKCS # 1 и # 8 - это просто разные форматы хранения. – Omikron

+0

@Omikron Привет, я получил строку с кодировкой base64 открытого ключа RSA, и как я могу узнать, что это PKCS # 1 или PKCS # fromat в java? На самом деле, я получил обе строки формата, и я могу декодировать его в java-объект RSApublickey с помощью метода diffrent, и я хочу определить, какой формат в одном методе, и сделать перевод ~ – Jaycee

0
String key = Base64.getEncoder().encodeToString(keyEntry.getPrivateKey().getEncoded()); 
+0

Он делает то же самое, как «Base64.encode (keyEntry.getPrivateKey () .getEncoded()) «делает для меня. –

1

Сложно сказать, какая кодировка будет использовать ваш Java-провайдер. Кроме того, когда вы сравниваете файл «privatekey.pem», как вы получаете контент?

не имеют прямого решения, но некоторые предложения ниже:

Распечатайте PEM

> openssl -in privatekey.pem -outform <DER/PEM> 

Где-то в печати будет base64 закодированного секретного ключа.

Также попробуйте проверить поставщика JCE, который его использует.

+0

Я открыл файл privatekey.pem в текстовом редакторе. У этого есть содержание как «----- BEGIN RSA PRIVATE KEY ----- ----- END RSA PRIVATE KEY -----« –

+0

в вашем текстовом редакторе, что видно на месте , делает это выглядите как MIIEuwIBADANBgkqhkiG9w0BAQEF ......... o25O4os ===== – hummingV

+0

Да, точно это похоже. Но вот вопрос, значение, о котором вы говорите, отличается в файле .pem тем, что я загрузил из Java-кода. Я загружаю его из одного хранилища ключей и ключей. –

Смежные вопросы