it-gundan.com

Java Keytool 키 저장소에서 개인 키를 내보내려면 어떻게해야합니까?

Java Keytool 키 저장소에서 개인 키를 내보내려고하므로 openssl과 함께 사용할 수 있습니다. 어떻게해야합니까?

117
Jonas

JKS에서 P12로 변환하려면 Java keytool 사용) ...

keytool 독점 형식 ( "JKS")에서 표준화 된 형식으로 내보내기 PKCS # 12 :

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

... openssl을 사용하여 P12에서 PEM으로 내보내기

openssl를 사용하여 인증서 내보내기 :

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

암호화되지 않은 개인 키를 내 보냅니다.

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

Java 6이므로 개인 키를 PKCS # 12로 가져 오기/내보내기 (.p12) keytool 옵션을 사용하여 -importkeystore (이전 버전에서는 사용할 수 없음).

예를 들면 다음과 같습니다.

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

PKCS12 키 저장소 유형은 기본 Oracle/Sun 보안 제공자에서 표준 키 저장소 유형으로도 지원됩니다.

62
Bruno

"키 저장소 탐색기"를 사용해보십시오.

브루노에 동의합니다. Keytool은 Java 키 저장소를 다룰 때 최고의 도구이지만, 하나의 멋진 무료 도구가 있습니다 : Keystore Explorer

나는 그것을 많이 사용하고 다른 것을 필요로하지 않았습니다.

23
Tiho

누군가가 JCEKS 유형 키 저장소에서 개인 키를 얻으려고 여기에서 자신을 발견하면 다른 답변에 설명 된 keytool 및 openssl 명령이 작동하지 않는다는 것을 알았습니다. 키를 얻으려면 아래 Java 클래스를 사용해야했습니다.

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();
    }
}

용법:

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

개인 키 이동을 허용하는 형식은 PKCS # 12입니다. 이 형식은 필요에 따라 PKI 인증서 및 관련 키 저장소가 발전함에 따라 나중에 나왔습니다. 개인 키에 액세스하고 전송하여 생성 된 신뢰 체인 문제를 고려하면 초기 키에 포함되지 않았지만 운영상의 요구로 인해 압력이 발생한 이유를 알 수 있습니다. 이것이 도전의 핵심 이유입니다.

Java 키 저장소는 PKCS # 12 형식의 초기 사용자 중 하나 였지만 수입업자는 수출업자가 아닙니다. Java 키 저장소의 보안 설계는 여전히 개인 키 내보내기를 표준 기능으로 지원하지 않습니다. 이 사실에도 좋은 보안 이유가 있습니다. 즉, 개인 루틴은 다음과 같이 작성되었습니다. http://www.startux.de/index.php/Java/44-dealing-with-Java-keystoresyvComment44

가능한 경우 OpenSSL에서 새 키 저장소를 작성하고 Java 키 저장소에서 개인 키를 가져 오려고 시도하는 대신 새 키를 작성하는 것이 좋습니다. Java 키 저장소를 열고 개인 키를 추출하면 설계된 보안 기능을 넘어서게됩니다. PKCS # 12 내보내기 기능은 오랫동안 사용되어 왔지만 여전히 Java에서는 지원되지 않습니다. 내 생각은 아주 좋은 암호학상의 이유이기 때문에 절대적으로 필요한 경우가 아니라면 그 단계를 밟는 데 도움이 될 것입니다.

2
zedman9991