Làm cách nào để kiểm tra tên chứng chỉ và bí danh trong các tệp kho khóa?


410

Tôi có một loạt các tệp .keystore và cần tìm một tệp có CN và bí danh cụ thể. Có cách nào để làm điều đó với keytool, jarsigner hoặc một số công cụ khác không? Tôi đã tìm thấy một cách để kiểm tra xem kho khóa cụ thể đã được sử dụng để ký một apk cụ thể hay chưa, nhưng tôi cũng cần lấy bí danh và tên chứng chỉ trong mỗi tệp.

Câu trả lời:


720

Bạn có thể chạy lệnh sau để liệt kê nội dung của tệp kho khóa của bạn (và tên bí danh):

keytool -v -list -keystore .keystore

Nếu bạn đang tìm kiếm một bí danh cụ thể, bạn cũng có thể chỉ định nó trong lệnh:

keytool -list -keystore .keystore -alias foo

Nếu không tìm thấy bí danh, nó sẽ hiển thị một ngoại lệ:

lỗi keytool: java.lang.Exception: Bí danh không tồn tại


1
Xin chào, tôi có thể hiển thị mật khẩu bí danh chính Nếu tôi biết tên bí danh chính và có chứng chỉ kho khóa và mật khẩu kho khóa
Prateek

11
@prateek Bạn không thể. Sẽ không có nhiều điểm trong việc có kho khóa hoặc mật khẩu khóa nếu bạn chỉ có thể hiển thị sau đó bằng công cụ dòng lệnh.
Hầu tước Lorne

2
Bạn có thể chạy lệnh sau để liệt kê nội dung của tệp kho khóa của mình: keytool -list -keystore .keystore Phần trên không cung cấp tên của bí danh
Manmohan Soni

1
@ManmohanSoni Tôi đã cập nhật nó để bao gồm đối số -v tiết lộ bí danh
Steven Mark Ford

10
Tôi nghĩ rằng /path/to/keystorethay vì .keystoresẽ rõ ràng hơn cho người đọc. Dù sao đó là câu trả lời đúng!
Andrea

261

Để có được tất cả các chi tiết, tôi đã phải thêm tùy chọn -v vào câu trả lời của romaintaz:

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

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

1
keytool -v -list -keystore cacerts
Ankur Srivastava

2
"Nếu -vtùy chọn được chỉ định, thì chứng chỉ được in ở định dạng có thể đọc được , với thông tin bổ sung như chủ sở hữu, tổ chức phát hành, số sê-ri và bất kỳ tiện ích mở rộng nào." (xem: Tham khảo công cụ Java SE, lệnh Hiển thị dữ liệu, tùy chọn
Eido95

64

Bạn có thể chạy từ mã 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();
            }
    }

Lớp chứng chỉ chứa tất cả thông tin về kho khóa.

CẬP NHẬT-KHÓA RIÊNG TƯ

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

@prateek Hy vọng đây là những gì bạn đang tìm kiếm!


nhập java.io.File; nhập java.io.FileInputStream; nhập java.io.FileNotFoundException; nhập java.io.IOException; nhập java.security.cert.Certert; nhập java.security.KeyStore; nhập java.security.KeyStoreException; nhập java.security.NoSuchAlerskymException; nhập java.util.Enumutions;
ban-geengineering

1
@Renjith xin chào Mã này hiển thị mọi thứ trừ mật khẩu được liên kết với bí danh, Làm thế nào tôi có thể hiển thị nó. Xin hãy giúp tôi
Prateek

@Renjith java.security.UnrecoverableKeyExceptionđây là ngoại lệ được ném khi tôi thử mã này thực tế tôi muốn lấy lại mật khẩu bí danh
Prateek

2
bạn nên sử dụng đoạn mã bên trong vòng lặp while đã nói ở trên
Renjith

1
Tôi không có lớp Base64Encoder. Bạn có thể vui lòng cho tôi biết tập tin jar nào không? hoặc nó là một tập tin .java?
Jack


17

Trong một môi trường giống như bash, bạn có thể sử dụng:

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

Lệnh này bao gồm 3 phần. Như đã nêu ở trên, phần 1 sẽ liệt kê tất cả các chứng chỉ tin cậy với tất cả các chi tiết và đó là lý do tại sao phần 2 chỉ lọc thông tin bí danh trong số các chi tiết đó. Và cuối cùng trong phần 3, bạn có thể tìm kiếm một bí danh cụ thể (hoặc một phần của nó). Các -i bật chế độ không nhạy cảm trường hợp. Do đó, lệnh đã cho sẽ mang lại tất cả các bí danh có chứa mẫu 'foo', fe foo, 123_FOO, fooBar, v.v. Để biết thêm thông tin man grep.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.