문제

키 저장소에서 개인 키를 나열하고 내보내려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

주요 저장소에 모든 별칭을 나열하기 위해 원래 예제 저장소에서 코드의 일부.

    // Load input stream into keystore
    keystore.load(is, password.toCharArray());

    // List the aliases
    Enumeration aliases = keystore.aliases();
    for (; aliases.hasMoreElements(); ) {
        String alias = (String)aliases.nextElement();

        // Does alias refer to a private key?
        boolean b = keystore.isKeyEntry(alias);

        // Does alias refer to a trusted certificate?
        b = keystore.isCertificateEntry(alias);
    }

개인 키의 내보내기가 시작되었습니다 선 포럼 몇 달 전에 U : TuringCompleter DUMPPRIVETEKEY 클래스를 만들어 앱에 스티치했습니다.

import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
import sun.misc.BASE64Encoder;

public class DumpPrivateKey {
     /**
     * Provides the missing functionality of keytool
     * that Apache needs for SSLCertificateKeyFile.
     *
     * @param args  <ul>
     *              <li> [0] Keystore filename.
     *              <li> [1] Keystore password.
     *              <li> [2] alias
     *              </ul>
     */
    static public void main(String[] args)
    throws Exception {
        if(args.length < 3) {
          throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias, <key password: default same tha
n keystore");
        }
        final String keystoreName = args[0];
        final String keystorePassword = args[1];
        final String alias = args[2];
        final String keyPassword = getKeyPassword(args,keystorePassword);
        KeyStore ks = KeyStore.getInstance("jks");
        ks.load(new FileInputStream(keystoreName), keystorePassword.toCharArray());
        Key key = ks.getKey(alias, keyPassword.toCharArray());
        String b64 = new BASE64Encoder().encode(key.getEncoded());
        System.out.println("-----BEGIN PRIVATE KEY-----");
        System.out.println(b64);
        System.out.println("-----END PRIVATE KEY-----");
    }
    private static String getKeyPassword(final String[] args, final String keystorePassword)
    {
       String keyPassword = keystorePassword; // default case
       if(args.length == 4) {
         keyPassword = args[3];
       }
       return keyPassword;
    }
}

참고 : 이것은 Sun 패키지를 사용합니다. "나쁜 것".
다운로드 할 수있는 경우 아파치 커먼즈 코드, 다음은 경고없이 컴파일하는 버전입니다.

javac -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey.java

동일한 결과를 제공합니다.

import java.io.FileInputStream;
import java.security.Key;
import java.security.KeyStore;
//import sun.misc.BASE64Encoder;
import org.apache.commons.codec.binary.Base64;

public class DumpPrivateKey {
     /**
     * Provides the missing functionality of keytool
     * that Apache needs for SSLCertificateKeyFile.
     *
     * @param args  <ul>
     *              <li> [0] Keystore filename.
     *              <li> [1] Keystore password.
     *              <li> [2] alias
     *              </ul>
     */
    static public void main(String[] args)
    throws Exception {
        if(args.length < 3) {
          throw new IllegalArgumentException("expected args: Keystore filename, Keystore password, alias, <key password: default same tha
n keystore");
        }
        final String keystoreName = args[0];
        final String keystorePassword = args[1];
        final String alias = args[2];
        final String keyPassword = getKeyPassword(args,keystorePassword);
        KeyStore ks = KeyStore.getInstance("jks");
        ks.load(new FileInputStream(keystoreName), keystorePassword.toCharArray());
        Key key = ks.getKey(alias, keyPassword.toCharArray());
        //String b64 = new BASE64Encoder().encode(key.getEncoded());
        String b64 = new String(Base64.encodeBase64(key.getEncoded(),true));
        System.out.println("-----BEGIN PRIVATE KEY-----");
        System.out.println(b64);
        System.out.println("-----END PRIVATE KEY-----");
    }
    private static String getKeyPassword(final String[] args, final String keystorePassword)
    {
       String keyPassword = keystorePassword; // default case
       if(args.length == 4) {
         keyPassword = args[3];
       }
       return keyPassword;
    }
}

당신은 그렇게 사용할 수 있습니다 :

java -classpath .:commons-codec-1.4/commons-codec-1.4.jar DumpPrivateKey $HOME/.keystore changeit tomcat

다른 팁

Java6 및 OpenSSL을 사용하여 키 저장소에서 개인 키를 추출할 수 있습니다.이는 모두 Java와 OpenSSL이 모두 PKCS#12 형식의 키 저장소를 지원한다는 사실에 달려 있습니다.추출을 수행하려면 먼저 keytool 표준 형식으로 변환합니다.당신을 확인하십시오 두 파일에 동일한 비밀번호를 사용하십시오(키 저장소 비밀번호가 아닌 개인 키 비밀번호). 그렇지 않으면 나중에 두 번째 단계에서 이상한 실패가 발생합니다.

keytool -importkeystore -srckeystore keystore.jks \
    -destkeystore intermediate.p12 -deststoretype PKCS12

다음으로 OpenSSL을 사용하여 PEM으로 추출을 수행합니다.

openssl pkcs12 -in intermediate.p12 -out extracted.pem -nodes

해당 PEM 파일을 충분히 쉽게 처리할 수 있어야 합니다.이는 암호화되지 않은 인코딩된 개인 키와 그 안에 인증서가 포함된 일반 텍스트입니다(매우 명확한 형식).

이 작업을 수행할 때 생성된 파일을 안전하게 유지하도록 주의하십시오.여기에는 비밀 자격 증명이 포함되어 있습니다.올바르게 보호하지 못하면 아무 것도 경고하지 않습니다. 이를 보호하는 가장 쉬운 방법은 사용자 이외의 누구에게도 액세스 권한이 없는 디렉터리에서 이 모든 작업을 수행하는 것입니다.그리고 절대로 명령줄이나 환경 변수에 비밀번호를 입력하지 마세요.다른 사용자가 잡기가 너무 쉽습니다.

프로그래밍 방식으로 수행 할 필요가 없지만 키를 관리하고 싶다면 지금 IBM의 무료 키맨 도구를 오랫동안 사용했습니다. 개인 키를 PFX 파일로 내보내는 데 매우 좋습니다 (그런 다음 OpenSSL을 사용하여 쉽게 조작하고, 추출하고, PWD를 변경하는 등을 쉽게 할 수 있습니다).

https://www.ibm.com/developerworks/mydeveloperworks/groups/service/html/communityview?communityuuid=6fb00498-f6ea-4f65-bf0c-adc5bd0c5fcc

KeyStore를 선택하고 개인 키 항목을 선택한 다음 파일-> PKCS12 파일로 저장하십시오 (*.pfx, 일반적으로). 그런 다음 다음과 같이 내용을 볼 수 있습니다.

$ OPENSSL PKCS12 -IN MYKEYFILE.PFX -INFO

다음은 Groovy의 위 코드의 짧은 버전입니다. 또한 내장 된 Base64 인코딩이 있습니다.

import java.security.Key
import java.security.KeyStore

if (args.length < 3)
        throw new IllegalArgumentException('Expected args: <Keystore file> <Keystore format> <Keystore password> <alias> <key password>')

def keystoreName = args[0]
def keystoreFormat = args[1]
def keystorePassword = args[2]
def alias = args[3]
def keyPassword = args[4]

def keystore = KeyStore.getInstance(keystoreFormat)
keystore.load(new FileInputStream(keystoreName), keystorePassword.toCharArray())
def key = keystore.getKey(alias, keyPassword.toCharArray())

println "-----BEGIN PRIVATE KEY-----"
println key.getEncoded().encodeBase64()
println "-----END PRIVATE KEY-----"

안드로이드 개발의 경우 Eclipse ADT에 생성 된 Keystore를 Signapk.jar에서 사용하는 공개 키 및 개인 키로 변환합니다.

개인 키 내보내기 :

keytool.exe -importkeystore -srcstoretype JKS -srckeystore my-release-key.keystore -deststoretype PKCS12 -destkeystore keys.pk12.der
openssl.exe pkcs12 -in keys.pk12.der -nodes -out private.rsa.pem

private.rsa.pem을 편집하고 "----- 시작 개인 키 -----"to "----- 끝 개인 키 -----"단락, 다음 : :

openssl.exe base64 -d -in private.rsa.pem -out private.rsa.der

공개 키 내보내기 :

keytool.exe -exportcert -keystore my-release-key.keystore -storepass <KEYSTORE_PASSWORD> -alias alias_name -file public.x509.der

사인 APK :

java -jar SignApk.jar public.x509.der private.rsa.der input.apk output.apk

이 질문은 Stackexchange 보안에 관한 것입니다. 제안 중 하나는 사용하는 것이 었습니다. Keystore Explorer

https://security.stackexchange.com/questions/3779/how-can-ipport-my-private-key-from-a-java-keytool-keystore

방금 시도한 후 정말 잘 작동하며 강력하게 추천합니다.

우선, 조심하세요! 귀하의 모든 보안은… er…에 달려 있습니다. 은둔 당신의 개인 키. KeyTool에는이 민감한 자료의 우발적 인 공개를 피하기 위해 주요 내보내기가 없으므로 수출 된 키를 보호하기 위해 자리 잡을 수있는 추가 보호 장치를 고려할 수 있습니다.

다음은 암호화되지 않은 PKCS #8 PrivateKeyInfo를 제공하는 간단한 코드입니다. OpenSSL에서 사용할 수 있습니다 ( -nocrypt 그것의 옵션 PKCS8 유틸리티):

KeyStore keys = ...
char[] password = ...
Enumeration<String> aliases = keys.aliases();
while (aliases.hasMoreElements()) {
  String alias = aliases.nextElement();
  if (!keys.isKeyEntry(alias))
    continue;
  Key key = keys.getKey(alias, password);
  if ((key instanceof PrivateKey) && "PKCS#8".equals(key.getFormat())) {
    /* Most PrivateKeys use this format, but check for safety. */
    try (FileOutputStream os = new FileOutputStream(alias + ".key")) {
      os.write(key.getEncoded());
      os.flush();
    }
  }
}

다른 형식이 필요한 경우 keyfactory를 사용하여 다른 유형의 키에 대한 투명한 키 사양을 얻을 수 있습니다. 예를 들어 RSA 개인 키의 개인 지수를 얻고 원하는 형식으로 출력 할 수 있습니다. 그것은 후속 질문에 좋은 주제를 만들 것입니다.

또 다른 훌륭한 도구는 Keystore Explorer입니다. http://keystore-explorer.sourceforge.net/

덜 기존하지만 논쟁의 여지가있는 또 다른 방법은 다음과 같습니다. jxplorer. 이 도구는 LDAP 디렉토리를 탐색하도록 설계되었지만 키 스토어 조작을위한 사용하기 쉬운 GUI가 있습니다. GUI의 이러한 기능 중 하나는 JKS 키 스토어에서 개인 키를 내보낼 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top