키 저장소 파일에서 인증서 이름 및 별명을 확인하는 방법은 무엇입니까?


410

많은 .keystore 파일이 있으며 특정 CN 및 별명을 가진 파일을 찾아야합니다. keytool, jarsigner 또는 다른 도구를 사용하여 수행 할 수 있습니까? 특정 키 저장소가 특정 APK에 서명하는 데 사용되었는지 확인하는 방법을 찾았지만 각 파일에서 별명 및 인증서 이름을 가져와야합니다.

답변:


720

다음 명령을 실행하여 키 저장소 파일의 컨텐츠 (및 별명)를 나열 할 수 있습니다.

keytool -v -list -keystore .keystore

특정 별명을 찾으려면 다음 명령에서 별명을 지정할 수도 있습니다.

keytool -list -keystore .keystore -alias foo

별명이 없으면 예외를 표시합니다.

키 도구 오류 : java.lang.Exception : 별명이 없습니다.


1
키 별칭 이름을 알고 키 저장소 인증서와 키 저장소 암호를 가지고 있다면
Prateek

11
@prateek 당신은 할 수 없습니다. 명령 줄 도구를 사용하여 키 스토어 또는 키 암호를 표시 할 수 있다면 키 스토어 또는 키 암호를 갖는 데 별다른 의미가 없습니다.
Lorne의 후작

2
다음 명령을 실행하여 키 저장소 파일의 내용을 나열 할 수 있습니다. keytool -list -keystore .keystore 위의 명령은 별명의 이름을 제공하지 않습니다.
Manmohan Soni

1
@ManmohanSoni 필자는 별칭을 나타내는 -v 인수를 포함하도록 업데이트했습니다.
Steven Mark Ford

10
독자들에게는 그 /path/to/keystore대신에 .keystore더 분명 하다고 생각합니다 . 어쨌든 정답입니다!
Andrea

261

모든 세부 정보를 얻으려면 romaintaz 답변에 -v 옵션을 추가해야했습니다.

keytool -v -list -keystore <FileName>.keystore

4
keytool -v -list -keystore <FileName> .jks
piyush singh

1
keytool -v -list -keystore cacerts
Ankur Srivastava

2
" -v옵션이 지정되면 소유자, 발급자, 일련 번호 및 확장명과 같은 추가 정보와 함께 인증서를 사람이 읽을 수있는 형식으로 인쇄 합니다." ( Java SE 도구 참조, 데이터 표시 명령, -list 옵션 참조 )
Eido95

64

Java 코드에서 실행할 수 있습니다.

try {

        File file = new File(keystore location);
        InputStream is = new FileInputStream(file);
        KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
        String password = "password";
        keystore.load(is, password.toCharArray());


        Enumeration<String> enumeration = keystore.aliases();
        while(enumeration.hasMoreElements()) {
            String alias = enumeration.nextElement();
            System.out.println("alias name: " + alias);
            Certificate certificate = keystore.getCertificate(alias);
            System.out.println(certificate.toString());

        }

    } catch (java.security.cert.CertificateException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if(null != is)
            try {
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }

인증서 클래스는 키 저장소에 대한 모든 정보를 보유합니다.

업데이트-개인 키 확보

Key key = keyStore.getKey(alias, password.toCharArray());
String encodedKey = new Base64Encoder().encode(key.getEncoded());
System.out.println("key ? " + encodedKey);

@ prateek 이것이 당신이 찾고있는 것입니다 바랍니다!


java.io.File 가져 오기; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; 수입 java.security.cert.Certificate; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; 수입 java.util.Enumeration;
금지

1
@Renjith hello이 코드는 별칭과 관련된 암호를 제외하고 모든 것을 표시합니다. 어떻게 표시합니까? 도와주세요
Prateek

@Renjith java.security.UnrecoverableKeyException이 코드를 실제로 시도 할 때 발생하는 예외입니다. 실제로 별칭 암호를 검색하려고합니다
Prateek

2
앞에서 언급 한 while 루프 안에서 코드 스 니펫을 사용해야합니다
Renjith

1
Base64Encoder 클래스가 없었습니다. 어떤 jar 파일이 있는지 알려주세요. 아니면 .java 파일입니까?
Jack


17

bash와 같은 환경에서 다음을 사용할 수 있습니다.

keytool -list -v -keystore cacerts.jks | grep 'Alias name:' | grep -i foo

이 명령은 세 부분으로 구성됩니다. 위에서 언급했듯이 첫 번째 부분에는 모든 신뢰할 수있는 인증서가 모든 세부 정보와 함께 나열되므로 두 번째 부분은 해당 세부 정보 중 별칭 정보 만 필터링합니다. 마지막으로 세 번째 부분에서는 특정 별칭 (또는 그 일부)을 검색 할 수 있습니다. -i 회전에 대소 문자를 구분 모드. 따라서 주어진 명령은 패턴 'foo', fe foo, 123_FOO, fooBar 등을 포함하는 모든 별칭을 생성합니다 man grep. 자세한 내용은 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.