it-swarm-tr.com

Özel anahtarımı bir Java Keytool anahtar deposundan nasıl dışa aktarabilirim?

Özel anahtarımı bir Java Keytool anahtar deposundan vermek istiyorum, bu yüzden openssl ile kullanabilirim. Bunu nasıl yapabilirim?

117
Jonas

Java keytool kullanın ...

keytool 'ın özel biçiminden ("JKS" olarak adlandırılır) standart biçime aktar PKCS # 12 :

keytool -importkeystore \
    -srckeystore keystore.jks \
    -destkeystore keystore.p12 \
    -deststoretype PKCS12 \
    -srcalias <jkskeyalias> \
    -deststorepass <password> \
    -destkeypass <password>

... sonra P12'den PEM'e dışa aktarmak için openssl kullanın

openssl kullanarak sertifikayı dışa aktar:

openssl pkcs12 -in keystore.p12  -nokeys -out cert.pem

Şifrelenmemiş özel anahtarı dışa aktar:

openssl pkcs12 -in keystore.p12  -nodes -nocerts -out key.pem
135
Jaime Hablutzel

Java 6 olduğundan, özel anahtarları PKCS # 12'ye içe/dışa aktarabilirsiniz (.p12) keytool kullanan dosyalar, -importkeystore (önceki sürümlerde mevcut değildir).

Örneğin:

keytool -importkeystore -srckeystore existing-store.jks -destkeystore new-store.p12 -deststoretype PKCS12

PKCS12 anahtar deposu türü, varsayılan Oracle/Sun güvenlik sağlayıcısında standart anahtar deposu türü olarak da desteklenir.

62
Bruno

"Anahtar Deposu Gezgini" ni deneyin

Bruno'ya katılıyorum. Keytool Java anahtar deposu ile uğraşırken mükemmel bir araçtır, ancak bir fantezi ve oldukça güçlü ücretsiz araç vardır: Keystore Explorer

Çok kullanıyorum ve başka bir şeye ihtiyaç duymadım.

23
Tiho

Herkes burada JCEKS türü bir anahtar deposundan özel bir anahtar almaya çalışırken bulursa, diğer cevaplarda açıklanan keytool ve openssl talimatlarının işe yaramadığını buldum. Anahtarı almak için aşağıdaki Java sınıfını kullanmak zorunda kaldım.

import Sun.misc.BASE64Encoder;

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.FileWriter;
import Java.security.*;

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

    public void export() throws Exception {
        KeyStore keystore = KeyStore.getInstance(keyStoreType);
        BASE64Encoder encoder = new BASE64Encoder();
        keystore.load(new FileInputStream(keystoreFile), keyStorePassword);
        Key key = keystore.getKey(alias, keyPassword);
        String encoded = encoder.encode(key.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.keyStorePassword = args[2].toCharArray();
        export.alias = args[3];
        export.keyPassword = args[4].toCharArray();
        export.exportedFile = new File(args[5]);
        export.export();
    }
}

Kullanımı:

javac ExportPrivateKey.Java
java ExportPrivateKey <path_to_keystore> JCEKS <keystore_password> “<key_alias>” <key_password> <output_file_name>
6
cjbooms

Özel anahtarların taşınmasına PKCS # 12 adı verilen bir biçim vardır. Bu biçim daha sonra ihtiyaç geliştikçe PKI sertifikalarının ve ilgili anahtar depolarının gelişiminde ortaya çıktı. Özel anahtara erişip taşıyarak oluşturulan güven zinciri sorunlarını düşünürseniz, neden ilk özelliklere dahil edilmediğini, ancak operasyonel ihtiyaçtan dolayı baskıdan sonra geldiğini görebilirsiniz. Bu zorluğun temel sebebidir.

Java anahtar depoları PKCS # 12 formatının ilk kullanıcılarından biriydi ancak ithalatçılar ihracatçı değillerdi. Java anahtar deposunun güvenlik tasarımı, özel anahtarların standart özellik olarak dışa aktarılmasını hala desteklemiyor gibi görünüyor. Yine, bu gerçeğin iyi güvenlik nedenleri vardır. Bununla birlikte, özel rutinler burada belirtildiği gibi yazılmıştır: http://www.startux.de/index.php/Java/44-dealing-with-Java-keystoresyvComment44

Mümkünse, Java anahtar deposundan özel anahtarı kaldırmak yerine OpenSSL'de yeni bir anahtar deposu ve yeni anahtarlar oluşturmayı düşünürüm. Java anahtar deposunu açıp özel anahtarı çıkararak tasarlanmış güvenlik özelliklerinin ötesine geçiyorsunuz. PKCS # 12 dışa aktarma özelliği uzun yıllardır isteniyor ancak Java'da desteklenmiyor. Benim düşüncem, bunun çok iyi kriptolojik nedenlerden ötürü, bu yüzden kesinlikle gerekli olmadıkça bu adımı atmaya çalışacağım.

2
zedman9991