Different types of keystore in Java -- PKCS11

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

PKCS11 keystores provide an interface to Hardware Security Modules (HSMs), enabling secure storage and high-speed cryptographic operations by keeping keys on dedicated hardware. To integrate an HSM with Java, a specific PKCS11 provider must be configured and added to the Java security providers, either statically in the java.security file or dynamically via the Security class, using a configuration file to define the HSM connection. Once the provider is established, a KeyStore instance can be loaded with the "PKCS11" type and a null input stream, allowing applications to interact with the HSM. Notably, changes to the keystore, such as adding key entries, are automatically saved to the HSM without requiring an explicit KeyStore.store() call.

ที่เก็บกุญแจ 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() อื่นๆ

JAVA KEYSTORE PKCS11 HSM

  RELATED

  COMMENTS

2
lintao
Jan 15, 2015 at 1:36 am

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.

 

Pi Ke
Jan 15, 2015 at 6:03 am

Thank you very much. Have corrected it.