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