Trust Store vs Key Store - สร้างด้วย keytool


249

ฉันเข้าใจว่าที่เก็บคีย์มักจะถือกุญแจส่วนตัว / สาธารณะและที่เก็บที่เชื่อถือได้จะเป็นกุญแจสาธารณะเท่านั้น (และแสดงถึงรายการของบุคคลที่เชื่อถือได้ที่คุณต้องการสื่อสารด้วย) นั่นเป็นข้อสันนิษฐานแรกของฉันดังนั้นถ้ามันไม่ถูกต้องฉันอาจจะยังไม่เริ่มดี ...

ฉันสนใจแม้ว่าจะเข้าใจวิธี / เมื่อคุณแยกแยะร้านค้าเมื่อใช้ keytool

ดังนั้นฉันได้สร้างที่เก็บคีย์โดยใช้แล้ว

keytool -import -alias bob -file bob.crt -keystore keystore.ks

ซึ่งสร้างไฟล์ keystore.ks ของฉัน ฉันตอบyesคำถามฉันเชื่อใจใน bob ได้หรือไม่ แต่ถ้าฉันสร้างไฟล์ที่เก็บคีย์หรือไฟล์ truststore ฉันสามารถตั้งค่าแอปพลิเคชันของฉันให้ใช้ไฟล์ได้เช่นกัน

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

และด้วยการSystem.setProperty( "javax.net.debug", "ssl")ตั้งค่าฉันสามารถดูใบรับรองภายใต้การรับรองที่เชื่อถือได้ (แต่ไม่อยู่ในส่วนที่เก็บคีย์) ใบรับรองเฉพาะที่ฉันนำเข้ามีเพียงกุญแจสาธารณะและฉันตั้งใจจะใช้เพื่อส่งข้อมูลผ่านการเชื่อมต่อ SSL ไปยัง Bob (แต่อาจจะดีที่สุดสำหรับคำถามอื่น!)

พอยน์เตอร์หรือคำชี้แจงใด ๆ ที่จะได้รับการชื่นชมมาก เอาต์พุตของ keytool เหมือนกันทุกสิ่งที่คุณนำเข้าและแบบแผนเพียงอย่างเดียวที่บอกว่าอันหนึ่งเป็นที่เก็บคีย์และอีกอันหนึ่งเป็นที่เก็บความเชื่อถือ ความสัมพันธ์เมื่อใช้ SSL ฯลฯ คืออะไร?


ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดย "ใบรับรองเฉพาะที่ฉันนำเข้ามีเพียงคีย์สาธารณะ": มันเป็นเพียงกุญแจสาธารณะ (เช่นไม่ใช่ใบรับรอง) หรือใบรับรองที่ไม่ใช่ CA?
บรูโน่

อืมไม่แน่ใจ ฉันส่งออกจากเบราว์เซอร์เป็นไฟล์ PEM มันช่วยได้ไหม
Toby

หากส่งออกจากเบราว์เซอร์ก็อาจเป็นใบรับรอง มันเป็นใบรับรองเซิร์ฟเวอร์ (ที่มี CN หรือ subjectAltName ตรงกับชื่อของเซิร์ฟเวอร์) หรือไม่ มันเป็นใบรับรอง CA (ดูภายใต้ข้อ จำกัด พื้นฐานคุณควรจะเห็นสิ่งนี้โดยใช้เบราว์เซอร์ของคุณ)
บรูโน่

2
tl; dr:ร้านค้าที่เชื่อถือได้ประกอบด้วยใบรับรองสาธารณะ, เชื่อถือได้, รูท (CA) ในขณะที่ร้านค้าเอกลักษณ์ / คีย์นั้นมีร้านค้าส่วนตัว ไฟล์ฉลาด แต่พวกเขาเหมือนกัน
แอนดรู

คำตอบ:


346

คำศัพท์นั้นค่อนข้างสับสนเล็กน้อย แต่ทั้งคู่javax.net.ssl.keyStoreและjavax.net.ssl.trustStoreใช้เพื่อระบุที่เก็บคีย์ที่จะใช้สำหรับวัตถุประสงค์ที่แตกต่างกันสองประการ Keystores มีรูปแบบที่หลากหลายและไม่จำเป็นต้องใช้ไฟล์ (ดูคำถามนี้ ) และkeytoolเป็นเพียงเครื่องมือในการดำเนินการต่างๆในรูปแบบ (นำเข้า / ส่งออก / รายการ / ... )

javax.net.ssl.keyStoreและjavax.net.ssl.trustStoreพารามิเตอร์ค่าเริ่มต้นที่ใช้ในการสร้างKeyManagerและTrustManagers (ตามลำดับ) แล้วนำมาใช้ในการสร้างSSLContextซึ่งเป็นหลักมี SSL / TLS เพื่อตั้งค่าการใช้งานเมื่อมีการเชื่อมต่อ SSL ผ่าน / TLS หรือSSLSocketFactory SSLEngineคุณสมบัติของระบบเหล่านี้เป็นเพียงค่าเริ่มต้นซึ่งจะถูกใช้โดยSSLContext.getDefault()ตัวมันเองที่ใช้โดยSSLSocketFactory.getDefault()ตัวอย่างเช่น (ทั้งหมดนี้สามารถกำหนดเองได้ผ่าน API ในหลาย ๆ ที่หากคุณไม่ต้องการใช้ค่าเริ่มต้นและค่าเฉพาะนั้นSSLContextเพื่อจุดประสงค์ที่กำหนด)

ความแตกต่างระหว่างKeyManagerและTrustManager(และระหว่างjavax.net.ssl.keyStoreและjavax.net.ssl.trustStore) มีดังนี้ (อ้างอิงจากคู่มืออ้างอิง JSSE ):

TrustManager: กำหนดว่าข้อมูลรับรองการตรวจสอบระยะไกล (และการเชื่อมต่อ) ควรเชื่อถือได้หรือไม่

KeyManager: กำหนดข้อมูลรับรองการตรวจสอบสิทธิ์ที่จะส่งไปยังโฮสต์ระยะไกล

(มีพารามิเตอร์อื่นพร้อมใช้งานและมีการอธิบายค่าเริ่มต้นในคู่มืออ้างอิง JSSEโปรดทราบว่าในขณะที่มีค่าเริ่มต้นสำหรับที่เก็บที่เชื่อถือได้ไม่มีที่เก็บสำหรับที่เก็บคีย์)

โดยพื้นฐานแล้วที่เก็บคีย์ในjavax.net.ssl.keyStoreนั้นมีไว้เพื่อให้มีคีย์ส่วนตัวและใบรับรองของคุณในขณะที่javax.net.ssl.trustStoreมีไว้เพื่อให้มีใบรับรอง CA ที่คุณเต็มใจเชื่อถือเมื่อบุคคลที่อยู่ห่างไกลแสดงใบรับรอง ในบางกรณีพวกเขาสามารถเป็นหนึ่งและร้านค้าเดียวกันแม้ว่ามันมักจะดีกว่าการใช้ร้านค้าที่แตกต่างกัน (โดยเฉพาะอย่างยิ่งเมื่อพวกเขาตามไฟล์)


ขอบคุณสำหรับคำตอบมันล้างสิ่งเล็กน้อย ฉันยังสับสนอยู่เมื่อถึงการใช้งานฉันสามารถใช้ pk12 pri / pub key (xxx.p12) เป็น keystore (ผ่าน -D) และสร้างการเชื่อมต่อ SSL (เชื่อถือได้) โดยไม่ต้องพูดถึง truststore ผ่านทาง - ง ... ดี
Toby

57
คุณไม่จำเป็นต้องระบุ truststore เนื่องจากมีค่าเริ่มต้น (รวมอยู่ใน JRE) โดยปกติจะอยู่ใน$JAVA_HOME/lib/security/cacerts(ดูลิงก์คู่มืออ้างอิง JSSE ที่ 2 ที่ฉันส่งไป) เช่นเดียวกับเบราว์เซอร์ประกอบด้วยชุดใบรับรอง CA ที่เชื่อถือได้เริ่มต้น โดยทั่วไปไคลเอนต์จะใช้ truststore เพื่อตรวจสอบใบรับรองเซิร์ฟเวอร์เสมอ แต่ที่เก็บคีย์จะถูกใช้เฉพาะเมื่อเซิร์ฟเวอร์ร้องขอใบรับรองไคลเอ็นต์และเซิร์ฟเวอร์จะใช้ที่เก็บคีย์สำหรับคีย์ + ใบรับรองของตนเองเสมอ แต่ truststore จะเป็นเพียง ใช้หากลูกค้าส่งใบรับรองลูกค้า
Bruno

2
ขอบคุณสำหรับข้อมูลที่เป็นประโยชน์ ใน Weblogic มี "identity-key-store" ซึ่งเก็บใบรับรอง SSL ของเซิร์ฟเวอร์จากนั้นมี "trust-key-store" ซึ่งเก็บใบรับรอง SSL ที่เซิร์ฟเวอร์เชื่อถือได้ดังนั้นฉันจะแก้ไขให้ถูกต้องหากฉันพูดว่า "identity-key - store "ไม่มีอะไรนอกจาก" keystore "และ" trust-key-store "นั้นเป็นอะไรนอกจาก" truststore "
hagrawal

@Bruno เราควรทราบว่าเมื่อมี "jssecacerts" "cacerts" จะถูกละเว้น?
kommradHomer

61

หากต้องการอธิบายโดยใช้ usecase / purpose หรือคนธรรมดา:

truststore : ตามชื่อบ่งชี้โดยปกติจะใช้เพื่อเก็บใบรับรองของเอนทิตีที่เชื่อถือได้ กระบวนการสามารถเก็บใบรับรองของทุกฝ่ายที่เชื่อถือได้ซึ่งไว้วางใจ

keyStore : ใช้เพื่อจัดเก็บคีย์เซิร์ฟเวอร์ (ทั้งสาธารณะและส่วนตัว) พร้อมกับใบรับรองที่ลงนามแล้ว

ระหว่างการจับมือ SSL

  1. ลูกค้าพยายามเข้าถึง https: //

  2. และเซิร์ฟเวอร์ตอบสนองโดยการให้ใบรับรอง SSL (ซึ่งเก็บไว้ในที่เก็บของมัน)

  3. ตอนนี้ไคลเอนต์ได้รับใบรับรอง SSL และตรวจสอบผ่าน trustStore (เช่น trustStore ของลูกค้ามีชุดใบรับรองที่กำหนดไว้ล่วงหน้าที่ไว้วางใจแล้ว) มันเหมือน: ฉันสามารถเชื่อถือเซิร์ฟเวอร์นี้ได้หรือไม่ นี่เป็นเซิร์ฟเวอร์เดียวกันกับที่ฉันพยายามคุยหรือไม่ ไม่มีคนกลางโจมตี?

  4. เมื่อลูกค้าตรวจสอบแล้วว่ากำลังพูดคุยกับเซิร์ฟเวอร์ที่เชื่อถือได้การสื่อสาร SSL สามารถเกิดขึ้นได้ในคีย์ลับที่แชร์

หมายเหตุ: ฉันไม่ได้พูดถึงที่นี่เกี่ยวกับการตรวจสอบสิทธิ์ลูกค้าทางฝั่งเซิร์ฟเวอร์ หากเซิร์ฟเวอร์ต้องการทำการรับรองความถูกต้องของลูกค้าด้วยเช่นกันเซิร์ฟเวอร์จะดูแล trustStore เพื่อตรวจสอบลูกค้า


25

ไม่มีความแตกต่างระหว่างไฟล์ keystore และ truststore ทั้งสองเป็นไฟล์ในรูปแบบไฟล์ JKS ที่เป็นกรรมสิทธิ์ ความแตกต่างคือการใช้งาน: เพื่อความรู้ที่ดีที่สุดของฉัน Java จะใช้ร้านค้าที่อ้างอิง-Djavax.net.ssl.trustStoreคุณสมบัติของระบบเพื่อค้นหาใบรับรองที่เชื่อถือได้เมื่อสร้างการเชื่อมต่อ SSL -Djavax.net.ssl.keyStoreเหมือนกันสำหรับคีย์และ แต่ในทางทฤษฎีแล้วมันดีที่จะใช้ไฟล์เดียวและไฟล์เดียวกันสำหรับ trust- และ keystores


4
คุณสามารถใช้ keystore ชนิดต่าง ๆ (เช่น PKCS12) โดยการตั้งค่าjavax.net.ssl.keyStoreTypeและjavax.net.ssl.trustStoreTypeคุณสมบัติของระบบ
Donal Fellows

1
@ donal: นอกจากนี้ดี คุณรู้หรือไม่ว่ามีรายการคอนเทนเนอร์ที่รองรับทั้งหมดหรือไม่? ฉันรู้เพียง PKCS12 และ JKS (อดีตเป็นผลมาจากการทดลองและข้อผิดพลาด ... )
musiKk

2
รูปแบบที่เก็บคีย์แตกต่างกันไปขึ้นอยู่กับผู้ให้บริการที่มีอยู่ (ดูรายการนี้สำหรับผู้ที่รวมกับ Oracle JRE โดยค่าเริ่มต้น) นอกจากนี้ยังมีการอภิปรายในคำถามนี้ ผู้ให้บริการอื่น ๆ (เช่น BouncyCastle) สามารถใช้กับรูปแบบอื่นได้
บรูโน่

21

Keystore ใช้เซิร์ฟเวอร์ในการจัดเก็บคีย์ส่วนตัวและ Truststore ถูกใช้โดยลูกค้าบุคคลที่สามเพื่อจัดเก็บกุญแจสาธารณะที่เซิร์ฟเวอร์จัดไว้ให้เพื่อการเข้าถึง ฉันทำสิ่งนั้นในแอปพลิเคชันการผลิตของฉัน ด้านล่างนี้เป็นขั้นตอนสำหรับการสร้างใบรับรอง java สำหรับการสื่อสาร SSL:

  1. สร้างใบรับรองโดยใช้คำสั่ง keygen ใน windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. รับรองใบรับรองด้วยตนเอง:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. ส่งออกใบรับรองไปยังโฟลเดอร์:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. นำเข้าใบรับรองไปยังไคลเอนต์ Truststore:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore


สวัสดีฉันมีสถานการณ์หนึ่งที่ฉันมีสองแอปพลิเคชันที่แตกต่างกันภายในคอนเทนเนอร์เดียวกัน (ทอมแคท) จากทั้งสองแอพพลิเคชั่นฉันต้องเรียกจุดปลายทางที่เหลือจากทั้งสองด้านไปยังแต่ละแอพ กดไลค์จาก A ถึง B และ B ถึง A (A และ B เป็นแอพพลิเคชั่นสองตัว) ฉันต้องใช้ truststore ในสถานการณ์นี้หรือไม่ ขณะที่ฉันใช้ไคลเอนต์ที่กำหนดเองซึ่งใช้ที่เก็บคีย์ กรุณาแนะนำ
Deepak

0

นี่คือขั้นตอนในการสร้าง Truststore ในเครื่องท้องถิ่นของคุณโดยใช้ Keytool ขั้นตอนในการสร้าง truststore สำหรับ URL ในเครื่องของคุณ

1) กด url ในเบราว์เซอร์โดยใช้ chrome

2) ตรวจสอบ"i"ไอคอนทางด้านซ้ายของ url ใน chrome และคลิก

3) ตรวจสอบตัวเลือกใบรับรองแล้วคลิกและกล่องโต้ตอบจะเปิดขึ้น

4) ตรวจสอบแท็บ "เส้นทางใบรับรอง"เพื่อดูจำนวนใบรับรองที่มีอยู่เพื่อสร้าง truststore

5) ไปที่"details" tab -> click"Copy to File" -> Give the path and the name for the certificateคุณต้องการสร้าง

6) ตรวจสอบหากมีใบรับรองผู้ปกครองและปฏิบัติตามจุด"5"

7) หลังจากใบรับรองทั้งหมดกำลังถูกสร้างพร้อมรับคำสั่งแบบเปิดและนำทางไปยังเส้นทางที่คุณสร้างใบรับรอง

8) ระบุคำสั่ง Keytool ด้านล่างเพื่อเพิ่มใบรับรองและสร้าง truststore

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) จัดเตรียมคำสั่ง keytool สำหรับใบรับรองทั้งหมดและเพิ่มลงในที่เก็บที่ไว้วางใจ

    keytool -list -v -keystore cacerts

-1

ที่เก็บคีย์เพียงเก็บคีย์ส่วนตัว wheras truststore เก็บคีย์สาธารณะ คุณจะต้องการสร้างใบรับรอง java สำหรับการสื่อสาร SSL คุณสามารถใช้คำสั่ง keygen ใน windows นี่อาจจะเป็นทางออกที่ง่ายที่สุด


truststore เก็บใบรับรองที่
มาร์ควิสแห่ง Lorne

-1

ในแง่ง่ายที่สุด:

Keystoreใช้เพื่อจัดเก็บข้อมูลรับรองของคุณ (เซิร์ฟเวอร์หรือไคลเอนต์) ในขณะที่truststoreใช้เพื่อจัดเก็บข้อมูลประจำตัวอื่น ๆ (Certificates from CA)

ต้องใช้ที่เก็บคีย์เมื่อคุณตั้งค่าฝั่งเซิร์ฟเวอร์บน SSL ใช้เพื่อเก็บใบรับรองข้อมูลประจำตัวของเซิร์ฟเวอร์เซิร์ฟเวอร์ใดที่จะนำเสนอให้กับไคลเอนต์ในการเชื่อมต่อในขณะที่การตั้งค่าร้านค้าที่เชื่อถือได้บนฝั่งไคลเอ็นต์ หากเบราว์เซอร์ของคุณเชื่อมต่อกับเว็บไซต์ใด ๆ ผ่าน SSL มันจะตรวจสอบใบรับรองที่นำเสนอโดยเซิร์ฟเวอร์กับ truststore

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