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 และใบรับรองที่สร้างโดยที่เก็บคีย์จะถูกสร้างโดยใช้ผู้ให้บริการเริ่มต้น