Different types of keystore in Java -- BKS

English 简体中文 繁体中文 ภาษาไทย Tiếng Việt
Summary

BKS is a keystore format from the BouncyCastle cryptographic library, serving as an alternative to Oracle's JKS for Java applications. Developers can use BKS to securely store various cryptographic assets, including secret keys, private keys alongside their certificate chains, and individual X.509 certificates for trust stores. The process involves installing the BouncyCastle provider, then creating, loading, storing, and deleting entries using standard KeyStore API calls with the "BKS" type. Operations like storing private keys require an associated certificate chain, while certificates can be stored independently. BouncyCastle also provides other keystore implementations like BouncyCastle (UBER) and PKCS12, each with specific encryption and password handling characteristics.

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

  COMMENTS

0

No comment for this article.