ที่เก็บกุญแจ PKCS11 ออกแบบมาสำหรับโมดูลจัดเก็บฮาร์ดแวร์ (HSM) มันเป็นส่วนติดต่อสำหรับการสื่อสารกับ HSMs มันไม่ได้จัดเก็บกุญแจใดๆ แต่ให้ชุดคลาสสำหรับการสื่อสารกับ HSM ที่อยู่เบื้องหลัง กุญแจและใบรับรองจริงจะถูกจัดเก็บไว้ใน HSMs
เหตุผลในการจัดเก็บกุญแจและวัสดุต่างๆ คือเพื่อความปลอดภัยและประสิทธิภาพ เนื่องจากกุญแจอยู่ใน HSMs จึงปลอดภัยจากการถูกขโมย การดำเนินการเข้ารหัส/ถอดรหัสทั้งหมดจะดำเนินการบน HSMs ด้วย ซึ่งจะเพิ่มความเร็วในการประมวลผล มักใช้ในแอปพลิเคชันที่ต้องการความเร็วสูงและความปลอดภัยเป็นพิเศษ
มีอุปกรณ์ฮาร์ดแวร์ที่แตกต่างกันซึ่งสามารถใช้ในการจัดเก็บกุญแจและใบรับรอง เช่น nCipher และ Luna SA จาก SafeNet สิ่งเหล่านี้เป็นความท้าทายอย่างมากในการออกแบบที่เก็บกุญแจ Java PKCS11 เพราะต้องสื่อสารกับอุปกรณ์ฮาร์ดแวร์ที่แตกต่างกันที่มีโครงสร้างแตกต่างกัน
โดยปกติในการสื่อสารกับอุปกรณ์ฮาร์ดแวร์ จะต้องมีการกำหนดค่าบางอย่างและต้องสร้างผู้ให้บริการ PKCS11 พิเศษและเพิ่มลงในรายการผู้ให้บริการ กระบวนการสร้างผู้ให้บริการอาจเกี่ยวข้องกับการเข้าสู่ระบบอุปกรณ์ฮาร์ดแวร์ เมื่อสร้างผู้ให้บริการแล้ว สามารถโหลดที่เก็บกุญแจฮาร์ดแวร์ได้
ในการสร้างผู้ให้บริการ PKCS11 คุณสามารถเพิ่มผู้ให้บริการลงในไฟล์ java.security แบบคงที่หรือใช้คลาส Provider แบบไดนามิกใน Java
ในการสร้างผู้ให้บริการแบบคงที่ ให้เพิ่มบรรทัดด้านล่างใน java.security ที่อยู่ที่ $JRE_HOME/lib/security/java.security
security.provider.N=sun.security.pkcs11.SunPKCS11 /opt/bar/cfg/pkcs11.cfg
ที่นี่ N หมายถึงดัชนีที่คุณต้องการวางผู้ให้บริการ pkcs11.cfg คือไฟล์กำหนดค่าที่กำหนดว่าส่วนติดต่อ Java PKCS11 สามารถรับหรือส่งอะไรไปยัง HSMs สำหรับไฟล์กำหนดค่าโดยละเอียด โปรดปรึกษาผู้จำหน่าย HSM
ในการสร้างผู้ให้บริการแบบไดนามิก ให้เพิ่มโค้ดด้านล่างในแอปพลิเคชันของคุณก่อนสร้างอินสแตนซ์ที่เก็บกุญแจฮาร์ดแวร์
String configName = "/opt/bar/cfg/pkcs11.cfg"; Provider p = new sun.security.pkcs11.SunPKCS11(configName); Security.addProvider(p);
สำหรับรายละเอียดเกี่ยวกับการสร้างผู้ให้บริการ PKCS11 โปรดอ่าน เอกสารของ Oracle
เมื่อผู้ให้บริการพร้อมแล้ว เริ่มสร้างอินสแตนซ์ KeyStore เนื่องจากเป็นที่เก็บกุญแจฮาร์ดแวร์ ดังนั้นเมื่อเรียก KeyStore.load() สตรีมอินพุตควรเป็น null
ด้านล่างนี้คือโค้ดสแนปช็อตสำหรับการสร้างและโหลดที่เก็บกุญแจฮาร์ดแวร์:
KeyStore ks = KeyStore.getInstance("PKCS11", p); //p คือผู้ให้บริการที่สร้างไว้ข้างต้น ks.load(null, password);
เมื่อโหลดที่เก็บกุญแจแล้ว คุณสามารถเริ่มสร้างกุญแจ (ลับและส่วนตัว) และใบรับรองบน HSMs ได้ รายละเอียดเกี่ยวกับวิธีการสร้างนั้นคล้ายกับ PKCS12 ดังนั้นโปรดดู ที่เก็บกุญแจ PKCS12 สำหรับรายละเอียด
ข้อยกเว้นอย่างหนึ่งคือไม่จำเป็นต้องเรียก KeyStore.store() เพื่อบันทึกที่เก็บกุญแจ ที่เก็บกุญแจจะบันทึกโดยอัตโนมัติเมื่อเรียกใช้ KeyStore.setKeyEntry() หรือ KeyStore.setXXX() อื่นๆ
It seems this is a typo. :)
One exception is that there is no need to call KeyStore.store() to save the keystore, the keystore will automatically save when KeyStore.setKeyEntry() is invoked or other KeyStore.setXXX(0 is invoked.