ประเภทที่เก็บคีย์: จะใช้อันไหนดี?


115

จากการดูไฟล์java.securityของฉันJREฉันเห็นว่าประเภทที่เก็บคีย์ที่จะใช้โดยค่าเริ่มต้นถูกตั้งค่าเป็นJKS. ที่นี่มีรายการประเภทที่เก็บคีย์ที่สามารถใช้ได้

มีประเภทที่เก็บคีย์ที่แนะนำหรือไม่? อะไรคือข้อดี / ข้อเสียของที่เก็บคีย์ประเภทต่างๆ


4
เนื่องจาก Java 9 PKCS12 เป็นประเภทที่เก็บคีย์เริ่มต้น การเปลี่ยนแปลงนี้เป็นไปตามเป้าหมายของ JEP 229: "ปรับปรุงความปลอดภัย PKCS12 นำเสนออัลกอริทึมการเข้ารหัสที่แข็งแกร่งกว่า JKS" ดูข้อมูลเพิ่มเติมได้ที่ "JEP 229: Create PKCS12 Keystores by Default", openjdk.java.net/jeps/229 ; เข้าถึงล่าสุดเมื่อวันที่ 2 กุมภาพันธ์ 2018
buzz3791

คำตอบ:


142

มีหลายประเภทมากกว่าที่ระบุไว้ในรายการชื่อมาตรฐานที่คุณเชื่อมโยง ท่านสามารถหาข้อมูลเพิ่มเติมในเอกสารผู้ให้บริการการเข้ารหัสลับ สิ่งที่พบบ่อยที่สุดคือ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 โดยตรง

7
@husayt ใบรับรอง PEM ไม่ได้รับการสนับสนุนโดยตรงเป็นประเภทที่เก็บคีย์ (ฉันคิดว่าอาจมีคนเขียนKeyStoreการนำไปใช้กับเอฟเฟกต์นั้น) อย่างไรก็ตามคุณสามารถโหลดได้ทันทีในอินสแตนซ์ที่เก็บคีย์ (โดยทั่วไปคือ JKS เป็นประเภทเริ่มต้น) ในหน่วยความจำโดยใช้ a CertificateFactory(ดังที่แสดงในคำตอบนี้ )
Bruno

ฉันคิดว่าJKSมันเปลี่ยนเป็นJCEKS
ครึ่งบกครึ่งน้ำ

5
ที่เก็บคีย์ JKS ไม่สามารถเก็บคีย์ลับได้ สำหรับกรณีการใช้งานนี้ JCEKS มีความเหมาะสม อาจเป็นมูลค่าการกล่าวถึงในคำตอบของคุณ
Duncan Jones

1
ตกลง. ใน Java 8 ฉันสามารถสร้างที่เก็บคีย์ PKCS # 12 ด้วยใบรับรองเดียวโดยไม่มีปัญหาใด ๆ โปรดทราบว่าสำหรับรายการใบรับรอง P12 นั้นเชื่อถือได้โดยปริยาย หากคุณต้องการใบรับรองที่ไม่น่าเชื่อถือคุณอาจต้องเปลี่ยนกลับไปใช้โครงการที่มีร้านค้าหลักหลายแห่ง
Maarten Bodewes

2
ตกลงอย่างน้อยสำหรับ Java 8 PKCS # 12 ที่เก็บคีย์ยังไม่สามารถจัดเก็บรายการคีย์ลับได้ คุณจะได้รับข้อยกเว้นของตัวชี้ค่าว่างเมื่อจัดเก็บที่เก็บคีย์ดังกล่าว (เอ่อ) อาจเป็นเพราะไม่พบใบรับรองที่เกี่ยวข้อง ดูเหมือนจะมีใครบางคนข้ามคำสอนของ Joshua เกี่ยวกับ Fail Fast Code
Maarten Bodewes

22

นี่คือโพสต์ที่แนะนำประเภทต่างๆของที่เก็บคีย์ใน 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 เมื่อคุณโหลดที่เก็บคีย์คุณไม่จำเป็นต้องสร้างผู้ให้บริการเฉพาะที่มีการกำหนดค่าเฉพาะ ที่เก็บคีย์นี้สามารถจัดเก็บคีย์ส่วนตัวคีย์ลับและใบรับรองได้ เมื่อโหลดที่เก็บคีย์รายการจะถูกดึงมาจากที่เก็บคีย์แล้วแปลงเป็นรายการซอฟต์แวร์


@ peci1 ฉันวางแผนที่จะเขียนบทช่วยสอนเกี่ยวกับวิธีใช้ที่เก็บคีย์เหล่านี้ จนถึงตอนนี้ฉันเขียนโพสต์สำหรับ JKS ไปหนึ่งโพสต์แล้วโปรดดูที่pixelstech.net/article/…
PixelsTech

@PixelsTech ฉันพบอันนี้แล้วและสงสัยว่าส่วนที่เหลืออยู่ที่ไหน :) ดังนั้นฉันจะคอยติดตาม;) ขอบคุณ
Martin Pecka

1
@ peci1 วันนี้ฉันพูดถึง JCEKS และ PKCS12 สำหรับ PKCS11 นั้นเกี่ยวข้องกับฮาร์ดแวร์และการกำหนดค่าเพิ่มเติมต้องใช้เวลาในการเขียนมากขึ้น pixelstech.net/article/…และpixelstech.net/article/…
PixelsTech

ว้าวเร็วปานสายฟ้าแลบ! ขอบคุณมาก ๆ.
Martin Pecka

5

หากคุณใช้ Java 8 หรือใหม่กว่าคุณควรเลือกอย่างแน่นอนPKCS12ค่าเริ่มต้นตั้งแต่ Java 9 ( JEP 229 )

ข้อดีเมื่อเทียบกับJKSและJCEKSคือ:

  • สามารถจัดเก็บคีย์ลับคีย์ส่วนตัวและใบรับรองได้
  • PKCS12เป็นรูปแบบมาตรฐานโปรแกรมและไลบรารีอื่นสามารถอ่านได้1
  • ปรับปรุงความปลอดภัย: JKSและJCEKSค่อนข้างไม่ปลอดภัย สิ่งนี้สามารถเห็นได้จากจำนวนเครื่องมือสำหรับการบังคับรหัสผ่านแบบเดรัจฉานประเภทที่เก็บคีย์เหล่านี้ซึ่งเป็นที่นิยมในหมู่นักพัฒนา Android 2, 3

1มีJDK-8202837ซึ่งได้รับการแก้ไขใน Java 11

2จำนวนการวนซ้ำสำหรับ PBE ที่ใช้โดยประเภทที่เก็บคีย์ทั้งหมด (รวมถึง PKCS12) เคยเป็นสัปดาห์ที่ค่อนข้าง ( CVE-2017-10356 ) อย่างไรก็ตามสิ่งนี้ได้รับการแก้ไขแล้วใน 9.0.1, 8u151, 7u161 และ 6u171

3สำหรับการอ่านเพิ่มเติม:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.