Different types of keystore in Java -- BKS

  Pi Ke        2016-07-03 03:00:18       33,455        0          English  简体中文  繁体中文  ภาษาไทย  Tiếng Việt 

BKS เป็นรูปแบบที่เก็บคีย์ที่จัดเตรียมโดยผู้ให้บริการไลบรารีการเข้ารหัสลับ Java ภายนอกยอดนิยม -- BouncyCastle มันเป็นที่เก็บคีย์ที่คล้ายกับ JKS ที่จัดเตรียมโดย Oracle JDK 

ก่อนเริ่มใช้ BKS ผู้ให้บริการ BouncyCastle ต้องถูกดาวน์โหลดและติดตั้ง ในการดาวน์โหลดผู้ให้บริการ โปรดไปที่ หน้าดาวน์โหลด BouncyCastle สามารถติดตั้งผู้ให้บริการได้โดยการเพิ่มรายการในไฟล์ java.security

security.provider.N=org.bouncycastle.jce.provider.BouncyCastleProvider

N หมายถึงดัชนีผู้ให้บริการในรายการผู้ให้บริการ

การสร้างที่เก็บคีย์ BKS

ในการสร้างที่เก็บคีย์ BKS คุณเพียงแค่สร้างอินสแตนซ์ KeyStore ของ "BKS" และโหลดสตรีมอินพุต null และรหัสผ่าน null

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(null, null);

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

การจัดเก็บคีย์ลับ

แตกต่างจาก JKS คีย์ลับสามารถจัดเก็บในที่เก็บคีย์ BKS ได้ ก่อนจัดเก็บคีย์ อาจจำเป็นต้องใช้ ไฟล์นโยบายที่ไม่ถูกจำกัด

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
Key key = keyGenerator.generateKey();

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

keyStore.setKeyEntry("aeskey", key, "password".toCharArray(), null);

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

การจัดเก็บคีย์ส่วนตัว

แทนที่จะเป็นคีย์ลับ คีย์ส่วนตัวสามารถจัดเก็บใน BKS ได้เช่นกัน จำเป็นต้องจัดเก็บห่วงโซ่ใบรับรองที่เกี่ยวข้องในเวลาเดียวกัน มิฉะนั้นจะเกิดข้อยกเว้น

CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
gen.generate(1024);
 
Key key=gen.getPrivateKey();
X509Certificate cert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600);
 
X509Certificate[] chain = new X509Certificate[1];
chain[0]=cert;

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

keyStore.setKeyEntry("rsakey", key, "password".toCharArray(), chain);

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

การจัดเก็บใบรับรอง

บางครั้งเมื่อต้องการที่เก็บความน่าเชื่อถือ ไม่จำเป็นต้องจัดเก็บคีย์ในที่เก็บคีย์ เพียงแค่ใบรับรองเท่านั้นก็เพียงพอแล้ว BKS รองรับการจัดเก็บใบรับรองโดยไม่ต้องใช้คีย์ส่วนตัวที่เกี่ยวข้อง

 CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
 gen.generate(1024);
     
 X509Certificate cert=gen.getSelfCertificate(new X500Name("CN=SINGLE_CERTIFICATE"), (long)365*24*3600);
 
 KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
 keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

 keyStore.setCertificateEntry("rsacert", cert);

 keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

หมายเหตุ ในการจัดเก็บใบรับรอง ไม่จำเป็นต้องใช้รหัสผ่าน เนื่องจากใบรับรองโดยปกติไม่จำเป็นต้องได้รับการปกป้อง

การโหลดคีย์

เมื่อโหลดคีย์จากที่เก็บคีย์ จำเป็นต้องระบุเฉพาะชื่อเล่นของรายการคีย์เท่านั้น ถ้าเป็นคีย์ส่วนตัว คุณอาจต้องการใช้ชื่อเล่นเดียวกันเพื่อโหลดห่วงโซ่ใบรับรอง

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

Key key = keyStore.getKey("rsakey", "password".toCharArray());

Certificate[] chain = (Certificate[]) keyStore.getCertificateChain("rsakey");
for(java.security.cert.Certificate cert:chain){
    System.out.println(cert.toString());
}

ผลลัพธ์อาจมีลักษณะเช่นนี้

  [0]         Version: 3
         SerialNumber: 1676692330
             IssuerDN: CN=ROOT
           Start Date: Sun Jul 03 15:29:46 CST 2016
           Final Date: Mon Jul 03 15:29:46 CST 2017
            SubjectDN: CN=ROOT
           Public Key: RSA Public Key
            modulus: 813dd8db5d26940347116b4986eb7bc89fa423c9d9374a422f2951c9a258458175d97ac586a94da851885453e368e249e1c3b14751a80e8d3ec4dc6be19bfd968fa59209f7d032215946e4ad9b0e261d488a35af250e8dbcb9d0fa5c0c309a2be8fe9535950b9b4c6cdca25f9c2e50ed2786bcbce6b2971c80edef9691ae5d63
    public exponent: 10001

  Signature Algorithm: SHA1WITHRSA
            Signature: 00362e9e84c5dd02ed6cf589625257abe55d3c5c
                       fdde5cee362222147b5870b89909e3008567e29b
                       9b4b5c72342219d167dd058b7d1c59ca4696db4e
                       28ee791989e731fba86ebb1b2caedce98af2a5e7
                       44a026cc01d9b4b65e0a65b19a684b1b99b71afe
                       4d27412e852d977a2855e9f011918ac528555469
                       aeb8406756185b44

การโหลดใบรับรอง

คล้ายกับการโหลดคีย์ จำเป็นต้องใช้ชื่อเล่นสำหรับใบรับรองที่จะโหลด

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

Certificate cert = (Certificate) keyStore.getCertificate("rsakey");
System.out.println(cert.toString());

ผลลัพธ์อาจมีลักษณะเช่นนี้

  [0]         Version: 3
         SerialNumber: 1676692330
             IssuerDN: CN=ROOT
           Start Date: Sun Jul 03 15:29:46 CST 2016
           Final Date: Mon Jul 03 15:29:46 CST 2017
            SubjectDN: CN=ROOT
           Public Key: RSA Public Key
            modulus: 813dd8db5d26940347116b4986eb7bc89fa423c9d9374a422f2951c9a258458175d97ac586a94da851885453e368e249e1c3b14751a80e8d3ec4dc6be19bfd968fa59209f7d032215946e4ad9b0e261d488a35af250e8dbcb9d0fa5c0c309a2be8fe9535950b9b4c6cdca25f9c2e50ed2786bcbce6b2971c80edef9691ae5d63
    public exponent: 10001

  Signature Algorithm: SHA1WITHRSA
            Signature: 00362e9e84c5dd02ed6cf589625257abe55d3c5c
                       fdde5cee362222147b5870b89909e3008567e29b
                       9b4b5c72342219d167dd058b7d1c59ca4696db4e
                       28ee791989e731fba86ebb1b2caedce98af2a5e7
                       44a026cc01d9b4b65e0a65b19a684b1b99b71afe
                       4d27412e852d977a2855e9f011918ac528555469
                       aeb8406756185b44

การลบรายการ

เป็นงานง่ายในการลบรายการในที่เก็บคีย์ รายการอาจเป็นคีย์ลับ คีย์ส่วนตัว และใบรับรอง ชื่อเล่นเป็นสิ่งเดียวที่จำเป็นต้องระบุ

KeyStore keyStore = KeyStore.getInstance("BKS", "BC");
keyStore.load(new FileInputStream("mytestkeys.bks"), "password".toCharArray());

keyStore.deleteEntry("aeskey");

keyStore.store(new FileOutputStream("mytestkeys.bks"), "password".toCharArray());

เพื่อให้การลบมีผล จำเป็นต้องจัดเก็บที่เก็บคีย์อีกครั้ง มิฉะนั้น รายการจะไม่ถูกจัดเก็บจริง ๆ

นอกจาก BKS แล้ว BouncyCastle ยังมีการใช้งานที่เก็บคีย์อีกสองแบบ: BouncyCastle และ PKCS12

Keystore.BouncyCastle หรือ Keystore.UBER จะทำงานกับ keytool ได้ก็ต่อเมื่อมีการระบุรหัสผ่านในบรรทัดคำสั่ง เนื่องจากที่เก็บคีย์ทั้งหมดถูกเข้ารหัสด้วย PBE โดยใช้ SHA1 และ Twofish.PBEWithSHAAndTwofish-CBC สิ่งนี้ทำให้ที่เก็บคีย์ทั้งหมดทนทานต่อการดัดแปลงและการตรวจสอบ และบังคับให้มีการตรวจสอบ keytool ที่จัดเตรียมโดย Sun JDK จะพยายามโหลดที่เก็บคีย์แม้ว่าจะไม่ได้ระบุรหัสผ่าน ซึ่งเป็นไปไม่ได้สำหรับเวอร์ชันนี้ 

PKCS12 มีสถานการณ์ที่แตกต่างออกไปเล็กน้อยจากที่เก็บคีย์ปกติ รหัสผ่านที่เก็บคีย์เป็นรหัสผ่านเดียวที่ใช้สำหรับจัดเก็บคีย์ในปัจจุบัน มิฉะนั้นจะรองรับฟังก์ชันการทำงานทั้งหมดที่จำเป็นสำหรับการใช้งานกับ keytool ในบางสถานการณ์ ไลบรารีอื่น ๆ มักคาดหวังว่าจะจัดการกับใบรับรอง Sun ถ้าเป็นเช่นนั้น ให้ใช้ PKCS12-DEF และใบรับรองที่สร้างโดยที่เก็บคีย์จะถูกสร้างโดยใช้ผู้ให้บริการเริ่มต้น 

JAVA  KEYSTORE  BOUNCYCASTLE  BKS 

       

  RELATED


  0 COMMENT


No comment for this article.



  RANDOM FUN

How developer thinks