Özel anahtarımı bir Java Keytool anahtar deposundan vermek istiyorum, bu yüzden openssl ile kullanabilirim. Bunu nasıl yapabilirim?
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>
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
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.
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.
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>
Ö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.