จากการดูไฟล์java.security
ของฉันJRE
ฉันเห็นว่าประเภทที่เก็บคีย์ที่จะใช้โดยค่าเริ่มต้นถูกตั้งค่าเป็นJKS
. ที่นี่มีรายการประเภทที่เก็บคีย์ที่สามารถใช้ได้
มีประเภทที่เก็บคีย์ที่แนะนำหรือไม่? อะไรคือข้อดี / ข้อเสียของที่เก็บคีย์ประเภทต่างๆ
จากการดูไฟล์java.security
ของฉันJRE
ฉันเห็นว่าประเภทที่เก็บคีย์ที่จะใช้โดยค่าเริ่มต้นถูกตั้งค่าเป็นJKS
. ที่นี่มีรายการประเภทที่เก็บคีย์ที่สามารถใช้ได้
มีประเภทที่เก็บคีย์ที่แนะนำหรือไม่? อะไรคือข้อดี / ข้อเสียของที่เก็บคีย์ประเภทต่างๆ
คำตอบ:
มีหลายประเภทมากกว่าที่ระบุไว้ในรายการชื่อมาตรฐานที่คุณเชื่อมโยง ท่านสามารถหาข้อมูลเพิ่มเติมในเอกสารผู้ให้บริการการเข้ารหัสลับ สิ่งที่พบบ่อยที่สุดคือJKS
(ค่าเริ่มต้น) และPKCS12
(สำหรับไฟล์ PKCS # 12 มักมีนามสกุล.p12
หรือบางครั้ง.pfx
)
JKS เป็นคนธรรมดาที่สุดถ้าคุณอยู่ในโลกของ Java PKCS # 12 ไม่ใช่เฉพาะ Java โดยเฉพาะอย่างยิ่งสะดวกในการใช้ใบรับรอง (พร้อมคีย์ส่วนตัว) ที่สำรองจากเบราว์เซอร์หรือมาจากเครื่องมือที่ใช้ OpenSSL ( keytool
ไม่สามารถแปลงที่เก็บคีย์และนำเข้าคีย์ส่วนตัวก่อน Java 6 ดังนั้นคุณต้องใช้เครื่องมืออื่น ๆ )
หากคุณมีไฟล์ PKCS # 12 อยู่แล้วมักจะง่ายกว่าที่จะใช้PKCS12
ประเภทโดยตรง เป็นไปได้ในการแปลงรูปแบบ แต่แทบไม่จำเป็นหากคุณสามารถเลือกประเภทที่เก็บคีย์ได้โดยตรง
ใน Java 7 PKCS12
ส่วนใหญ่มีประโยชน์ในฐานะที่เก็บคีย์แต่น้อยกว่าสำหรับtruststore (ดูความแตกต่างระหว่างที่เก็บคีย์และที่เก็บความไว้วางใจ ) เนื่องจากคุณไม่สามารถจัดเก็บรายการใบรับรองโดยไม่มีคีย์ส่วนตัว ในทางตรงกันข้ามJKS
ไม่ต้องการให้แต่ละรายการเป็นรายการคีย์ส่วนตัวดังนั้นคุณสามารถมีรายการที่มีใบรับรองเท่านั้นซึ่งมีประโยชน์สำหรับร้านค้าที่เชื่อถือได้ซึ่งคุณจัดเก็บรายการใบรับรองที่คุณเชื่อถือ (แต่คุณไม่มี คีย์ส่วนตัวสำหรับพวกเขา)
สิ่งนี้มีการเปลี่ยนแปลงใน Java 8 ดังนั้นตอนนี้คุณสามารถมีรายการใบรับรองอย่างเดียวในPKCS12
ร้านค้าได้เช่นกัน (รายละเอียดเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงเหล่านี้และแผนเพิ่มเติมสามารถพบได้ในJEP 229: สร้างที่เก็บคีย์ PKCS12 ตามค่าเริ่มต้น )
มีที่เก็บคีย์ประเภทอื่น ๆ อีกสองสามประเภทซึ่งอาจใช้ไม่บ่อย (ขึ้นอยู่กับบริบท) ได้แก่ :
PKCS11
สำหรับไลบรารี PKCS # 11 โดยทั่วไปสำหรับการเข้าถึงโทเค็นการเข้ารหัสฮาร์ดแวร์ แต่การใช้งานผู้ให้บริการ Sun ยังสนับสนุนร้านค้า NSS (จาก Mozilla) ด้วยสิ่งนี้BKS
โดยใช้ผู้ให้บริการ BouncyCastle (มักใช้สำหรับ Android)Windows-MY
/ Windows-ROOT
หากคุณต้องการเข้าถึงที่เก็บใบรับรองของ Windows โดยตรงKeychainStore
หากคุณต้องการใช้พวงกุญแจ OSX โดยตรงJKS
มันเปลี่ยนเป็นJCEKS
นี่คือโพสต์ที่แนะนำประเภทต่างๆของที่เก็บคีย์ใน Java และความแตกต่างระหว่างที่เก็บคีย์ประเภทต่างๆ http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java---- ภาพรวม
ด้านล่างนี้คือคำอธิบายของที่เก็บคีย์ต่างๆจากโพสต์:
JKS, Java Key Store คุณสามารถค้นหาไฟล์นี้ได้ที่ sun.security.provider.JavaKeyStore ที่เก็บคีย์นี้เป็นเฉพาะ Java โดยปกติจะมีส่วนขยายของ jks ที่เก็บคีย์ประเภทนี้สามารถมีคีย์ส่วนตัวและใบรับรองได้ แต่ไม่สามารถใช้เก็บคีย์ลับได้ เนื่องจากเป็นที่เก็บคีย์เฉพาะของ Java จึงไม่สามารถใช้ในภาษาโปรแกรมอื่นได้
JCEKS ที่เก็บกุญแจ JCE คุณสามารถค้นหาไฟล์นี้ได้ที่ com.sun.crypto.provider.JceKeyStore ที่เก็บคีย์นี้มีส่วนขยายของ jceks รายการที่สามารถใส่ในที่เก็บคีย์ JCEKS ได้แก่ คีย์ส่วนตัวคีย์ลับและใบรับรอง
PKCS12 เป็นประเภทที่เก็บคีย์มาตรฐานซึ่งสามารถใช้ได้ใน Java และภาษาอื่น ๆ คุณสามารถค้นหาการใช้งานที่เก็บคีย์นี้ได้ที่ sun.security.pkcs12.PKCS12KeyStore โดยปกติจะมีส่วนขยายของ p12 หรือ pfx คุณสามารถจัดเก็บคีย์ส่วนตัวคีย์ลับและใบรับรองประเภทนี้ได้
PKCS11 เป็นประเภทที่เก็บคีย์ฮาร์ดแวร์ เซิร์ฟเวอร์อินเทอร์เฟซสำหรับไลบรารี Java เพื่อเชื่อมต่อกับอุปกรณ์ที่เก็บคีย์ฮาร์ดแวร์เช่น Luna, nCipher คุณสามารถค้นหาการใช้งานนี้ได้ที่ sun.security.pkcs11.P11KeyStore เมื่อคุณโหลดที่เก็บคีย์คุณไม่จำเป็นต้องสร้างผู้ให้บริการเฉพาะที่มีการกำหนดค่าเฉพาะ ที่เก็บคีย์นี้สามารถจัดเก็บคีย์ส่วนตัวคีย์ลับและใบรับรองได้ เมื่อโหลดที่เก็บคีย์รายการจะถูกดึงมาจากที่เก็บคีย์แล้วแปลงเป็นรายการซอฟต์แวร์
หากคุณใช้ Java 8 หรือใหม่กว่าคุณควรเลือกอย่างแน่นอนPKCS12
ค่าเริ่มต้นตั้งแต่ Java 9 ( JEP 229 )
ข้อดีเมื่อเทียบกับJKS
และJCEKS
คือ:
PKCS12
เป็นรูปแบบมาตรฐานโปรแกรมและไลบรารีอื่นสามารถอ่านได้1JKS
และJCEKS
ค่อนข้างไม่ปลอดภัย สิ่งนี้สามารถเห็นได้จากจำนวนเครื่องมือสำหรับการบังคับรหัสผ่านแบบเดรัจฉานประเภทที่เก็บคีย์เหล่านี้ซึ่งเป็นที่นิยมในหมู่นักพัฒนา Android 2, 31มีJDK-8202837ซึ่งได้รับการแก้ไขใน Java 11
2จำนวนการวนซ้ำสำหรับ PBE ที่ใช้โดยประเภทที่เก็บคีย์ทั้งหมด (รวมถึง PKCS12) เคยเป็นสัปดาห์ที่ค่อนข้าง ( CVE-2017-10356 ) อย่างไรก็ตามสิ่งนี้ได้รับการแก้ไขแล้วใน 9.0.1, 8u151, 7u161 และ 6u171
3สำหรับการอ่านเพิ่มเติม: