วิธีตรวจสอบชื่อใบรับรองและนามแฝงในไฟล์ที่เก็บคีย์?


410

ฉันมีไฟล์. keystore จำนวนมากและต้องการค้นหาไฟล์ที่มี CN และนามแฝงเฉพาะ มีวิธีทำกับ keytool, jarsigner หรือเครื่องมืออื่น ๆ หรือไม่? ฉันพบวิธีตรวจสอบว่าที่เก็บคีย์เฉพาะถูกใช้เพื่อลงนาม apk เฉพาะหรือไม่ แต่ฉันจำเป็นต้องได้รับนามแฝงและชื่อใบรับรองในแต่ละไฟล์ด้วย

คำตอบ:


720

คุณสามารถรันคำสั่งต่อไปนี้เพื่อแสดงรายการเนื้อหาของไฟล์ keystore ของคุณ (และชื่อนามแฝง):

keytool -v -list -keystore .keystore

หากคุณกำลังมองหานามแฝงที่เฉพาะเจาะจงคุณสามารถระบุได้ในคำสั่ง:

keytool -list -keystore .keystore -alias foo

หากไม่พบนามแฝงมันจะแสดงข้อยกเว้น:

ข้อผิดพลาด keytool: java.lang.Exception: นามแฝงไม่มีอยู่


1
สวัสดีฉันสามารถแสดงรหัสผ่านนามแฝงของคีย์ได้หรือไม่หากฉันรู้ชื่อนามแฝงของคีย์และมีใบรับรองที่เก็บคีย์และรหัสผ่านของที่เก็บคีย์
Prateek

11
@prateek คุณทำไม่ได้ จะมีจุดไม่มากในการมีที่เก็บคีย์หรือรหัสผ่านที่สำคัญถ้าคุณสามารถแสดงแล้วด้วยเครื่องมือบรรทัดคำสั่ง
มาร์ควิสแห่ง Lorne

2
คุณสามารถรันคำสั่งต่อไปนี้เพื่อแสดงรายการเนื้อหาของไฟล์ keystore ของคุณ: keytool -list -keystore .keystore commond ด้านบนไม่ได้ให้ชื่อนามแฝง
Manmohan Soni

1
@ManmohanSoni ฉันได้อัปเดตให้รวมอาร์กิวเมนต์ -v ซึ่งแสดงชื่อแทน
Steven Mark Ford

10
ฉันคิดว่า/path/to/keystoreแทนที่จะ.keystoreอ่านให้ชัดเจนกว่านี้ อย่างไรก็ตามมันเป็นคำตอบที่ถูกต้อง!
Andrea

261

เพื่อให้ได้รายละเอียดทั้งหมดฉันต้องเพิ่มตัวเลือก -v ในคำตอบ romaintaz:

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, คำสั่งแสดงข้อมูล, ตัวเลือกรายการ )
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; นำเข้า java.io.FileInputStream; นำเข้า java.io.FileNotFoundException; นำเข้า java.io.IOException; import java.security.cert.Certificate; นำเข้า java.security.KeyStore; นำเข้า java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; นำเข้า java.util.Enumeration;
บ้านจีโอเอ็นจิเนียริ่ง

1
@Renjith สวัสดีรหัสนี้จะแสดงทุกอย่างยกเว้นรหัสผ่านที่เกี่ยวข้องกับนามแฝงฉันจะแสดงมันได้อย่างไร โปรดช่วยฉันด้วย
Prateek

@Renjith java.security.UnrecoverableKeyExceptionนี่เป็นข้อยกเว้นที่เกิดขึ้นเมื่อฉันลองใช้รหัสนี้จริง ๆ แล้วฉันต้องการที่จะดึงรหัสผ่านนามแฝง
Prateek

2
คุณควรใช้ข้อมูลโค้ดข้างต้นในขณะที่วน
Renjith

1
ฉันไม่มีคลาส Base64Encoder คุณช่วยเล่าให้ฉันฟังว่าไฟล์ jar ใดมีบ้าง หรือเป็นไฟล์. java
แจ็ค


17

ในสภาพแวดล้อมที่เหมือนทุบตีคุณสามารถใช้:

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

คำสั่งนี้ประกอบด้วย 3 ส่วน ตามที่ระบุไว้ข้างต้นส่วนที่1จะแสดงรายการใบรับรองที่เชื่อถือได้พร้อมรายละเอียดทั้งหมดและนั่นคือสาเหตุที่ส่วนที่2มาเพื่อกรองเฉพาะข้อมูลนามแฝงในรายละเอียดเหล่านั้น และสุดท้ายในส่วนที่ 3คุณสามารถค้นหานามแฝงที่เฉพาะเจาะจง (หรือส่วนหนึ่งของมัน) -iเปลี่ยนโหมดในกรณีตาย ดังนั้นคำสั่งที่กำหนดจะให้ผลผลิตนามแฝงทั้งหมดที่มีรูปแบบ 'foo' fe ฟู 123_FOO, foobar ฯลฯ man grepสำหรับข้อมูลเพิ่มเติม


12

นี่จะแสดงรายการใบรับรองทั้งหมด:

keytool -list -keystore "$JAVA_HOME/jre/lib/security/cacerts"

สิ่งนี้จะแสดงรายการใบรับรองที่เก็บไว้ในที่เก็บที่เชื่อถือได้ของ JDK ซึ่งคล้ายกัน แต่มีจุดประสงค์ที่แตกต่างจากที่เก็บคีย์ (ซึ่งถูกถามเกี่ยวกับ) มีความแตกต่างที่ดีอยู่ที่นี่: http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore
David Levy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.