2010-04-14 13 views
19

я только что создал самозаверяющий сертификат на коробке Linux работает TOMCAT 6.Как экспортировать закрытый ключ из хранилища ключей самозаверяющих сертификата

Я создал ключи, как это, действительные в течение 10 лет:

keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650 

и скопировал хранилище ключей в папку в tomcat и обновил server.xml, чтобы указать на хранилище ключей.

Теперь моя сеть администратор просит для государственного и частного ключа (для нашей балансировки нагрузки)

я могу генерировать открытый ключ с помощью:

openssl s_client -connect mydomain.com:8443 

Но как я могу экспортировать/извлечение закрытый ключ?

ответ

43

Немного сложно. Сначала вы можете использовать keytool, чтобы поместить закрытый ключ в формат PKCS12, который более переносимый/совместимый, чем различные форматы хранилища в Java. Ниже приведен пример с закрытым ключом с псевдонимом «mykey» в хранилище ключей Java и копирование его в файл PKCS12 с именем myp12file.p12. [обратите внимание, что на большинстве экранов эта команда выходит за пределы правой части окна: вам нужно прокрутку вправо, чтобы увидеть все это]

keytool -v -importkeystore -srckeystore .keystore -srcalias mykey -destkeystore myp12file.p12 -deststoretype PKCS12 
Enter destination keystore password: 
Re-enter new password: 
Enter source keystore password: 
[Storing myp12file.p12] 

Теперь файл myp12file.p12 содержит закрытый ключ в формате PKCS12, которые могут быть использованы непосредственно со многими пакетами программного обеспечения или дальнейшей обработки с использованием команды openssl pkcs12. Например,

openssl pkcs12 -in myp12file.p12 -nocerts -nodes 
Enter Import Password: 
MAC verified OK 
Bag Attributes 
    friendlyName: mykey 
    localKeyID: 54 69 6D 65 20 31 32 37 31 32 37 38 35 37 36 32 35 37 
Key Attributes: <No Attributes> 
-----BEGIN RSA PRIVATE KEY----- 
MIIC... 
. 
. 
. 
-----END RSA PRIVATE KEY----- 

Распечатывает закрытый ключ незашифрованным.

Обратите внимание, что это закрытый ключ и вы ответственны за оценивая последствия для безопасности его извлечения из Java хранилища и перемещая его вокруг.

+0

Команда OpenSSL выше, дает следующее сообщение об ошибке: 6016: ошибка: 0D07207B: ASN1 подпрограммы кодирования: ASN1_get_object: заголовок слишком длинный. \ Crypto \ ASN1 \ asn1_lib.c: 150: – user265330

+0

@ user265330: Извините, что слышал, но это сработало для меня. Какую версию openssl вы используете? –

+0

OMG спасибо. Вытягивал мои волосы на три дня. Только чтобы обнаружить, что я использовал неправильный private.key. Я смог извлечь private.key из JKS, и он работает. +10000 для вас. – cbmeeks

2

http://anandsekar.github.io/exporting-the-private-key-from-a-jks-keystore/

public class ExportPrivateKey { 
     private File keystoreFile; 
     private String keyStoreType; 
     private char[] password; 
     private String alias; 
     private File exportedFile; 

     public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) { 
       try { 
         Key key=keystore.getKey(alias,password); 
         if(key instanceof PrivateKey) { 
           Certificate cert=keystore.getCertificate(alias); 
           PublicKey publicKey=cert.getPublicKey(); 
           return new KeyPair(publicKey,(PrivateKey)key); 
         } 
       } catch (UnrecoverableKeyException e) { 
     } catch (NoSuchAlgorithmException e) { 
     } catch (KeyStoreException e) { 
     } 
     return null; 
     } 

     public void export() throws Exception{ 
       KeyStore keystore=KeyStore.getInstance(keyStoreType); 
       BASE64Encoder encoder=new BASE64Encoder(); 
       keystore.load(new FileInputStream(keystoreFile),password); 
       KeyPair keyPair=getPrivateKey(keystore,alias,password); 
       PrivateKey privateKey=keyPair.getPrivate(); 
       String encoded=encoder.encode(privateKey.getEncoded()); 
       FileWriter fw=new FileWriter(exportedFile); 
       fw.write(“—–BEGIN PRIVATE KEY—–\n“); 
       fw.write(encoded); 
       fw.write(“\n“); 
       fw.write(“—–END PRIVATE KEY—–”); 
       fw.close(); 
     } 


     public static void main(String args[]) throws Exception{ 
       ExportPrivateKey export=new ExportPrivateKey(); 
       export.keystoreFile=new File(args[0]); 
       export.keyStoreType=args[1]; 
       export.password=args[2].toCharArray(); 
       export.alias=args[3]; 
       export.exportedFile=new File(args[4]); 
       export.export(); 
     } 
} 
Смежные вопросы