java SSL และที่เก็บคีย์ใบรับรอง


165

โปรแกรม java ของฉันรู้ได้อย่างไรว่าที่เก็บคีย์ของฉันมีใบรับรองอยู่ที่ไหน หรือฉันจะบอกโปรแกรม Java ของฉันว่าจะหาที่เก็บคีย์ได้อย่างไร

หลังจากระบุที่เก็บคีย์ในบางวิธีแล้วจะระบุใบรับรองเพื่อใช้สำหรับการพิสูจน์ตัวตนเซิร์ฟเวอร์กับไคลเอ็นต์ได้อย่างไร?


ดีกว่าคือหลีกเลี่ยงการใช้การตั้งค่า System.setProperty (วิธีการด้านล่าง) ดู: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/วิธีการสร้าง KeyManagerFactory สำหรับ SSLContext
Marek- A-

คำตอบ:


111
System.setProperty("javax.net.ssl.trustStore", path_to_your_jks_file);

4
ใครรู้วิธีการอ้างอิงในกล่อง windows? System.setProperty ("javax.net.ssl.trustStore", "C: \\ โปรแกรมไฟล์ (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ ความปลอดภัย \\ cacerts"); ไม่ทำงานสำหรับฉัน :(
simgineer

4
บน Windows ชื่อพา ธ ที่ระบุต้องใช้ฟอร์เวิร์ดสแลช /, แทนที่แบ็กสแลช, \
Droidman

มันใช้งานได้หรือไม่ ฉันใช้รหัสเดียวกันกับที่ไฟล์ 'jks' ของฉันมีใบรับรอง CA แต่ฉันยังคงได้รับjavax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: ข้อผิดพลาดการขนส่ง: ข้อผิดพลาด 403:ข้อผิดพลาดที่ต้องห้ามเมื่อฉันเรียกรหัสลูกค้าผ่าน SOAP ที่สร้างสตับ ความคิดใด ๆ
james2611nov

1
นอกจากนี้ยังมีคุณสมบัติระบบรหัสผ่าน (javax.net.ssl.trustStorePassword) อาจถูกส่งผ่านเป็นอาร์กิวเมนต์ JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword อ้างอิงdocs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov: หากคุณได้รับข้อผิดพลาด HTTP 403 (หรือการตอบสนอง HTTP อื่น ๆ ) เรียกปลายทาง HTTPS นั่นหมายความว่าคุณประสบความสำเร็จในการตั้งค่า TLS: การโต้ตอบ HTTP เกิดขึ้นเพียงครั้งเดียวที่ตั้งค่าช่อง TLS (( มิฉะนั้นจะไม่สามารถป้องกันได้) ใช่แล้วคำตอบนี้เหมาะกับคุณ :-)
ruakh

295

ตั้งค่าคุณสมบัติ SSL ที่ระดับ JVM ผ่านคุณสมบัติระบบ หมายความว่าคุณสามารถตั้งค่าพวกเขาเมื่อคุณเรียกใช้โปรแกรม (java -D .... ) หรือคุณสามารถตั้งค่าพวกเขาในรหัสโดยทำ System.setProperty

คีย์เฉพาะที่คุณต้องตั้งค่าอยู่ด้านล่าง:

javax.net.ssl.keyStore - ตำแหน่งของไฟล์ Javaที่มีใบรับรองของตัวเองและไพรเวตคีย์ บน Windows ชื่อพา ธ ที่ระบุต้องใช้เครื่องหมายทับซ้าย / ในตำแหน่งแบ็กสแลช

javax.net.ssl.keyStorePassword - รหัสผ่านเพื่อเข้าถึงไพรเวตคีย์จากไฟล์ keystore ที่ระบุโดย javax.net.ssl.keyStore รหัสผ่านนี้ใช้สองครั้ง: เพื่อปลดล็อกไฟล์ keystore (รหัสผ่านร้านค้า) และเพื่อถอดรหัสคีย์ส่วนตัวที่เก็บไว้ใน keystore (รหัสผ่านคีย์)

javax.net.ssl.trustStore - ตำแหน่งของไฟล์ Java keoreoreที่มีการรวบรวมใบรับรอง CA ที่ไว้วางใจได้โดยกระบวนการแอ็พพลิเคชันนี้ (trust store) บน Windows ชื่อพา ธ ที่ระบุต้องใช้ฟอร์เวิร์ดสแลช/แทนแบ็กสแลช\ในสถานที่ของเครื่องหมาย,

หากไม่ได้ระบุตำแหน่ง trust store โดยใช้คุณสมบัตินี้การประยุกต์ใช้ SunJSSE จะค้นหาและใช้ไฟล์ keystore ในตำแหน่งต่อไปนี้ (ตามลำดับ):

  1. $JAVA_HOME/lib/security/jssecacerts
  2. $JAVA_HOME/lib/security/cacerts

javax.net.ssl.trustStorePassword - รหัสผ่านเพื่อปลดล็อกไฟล์ที่เก็บคีย์ (รหัสผ่านร้านค้า) ที่ระบุโดย javax.net.ssl.trustStoreตามที่ระบุไว้

javax.net.ssl.trustStoreType - (ทางเลือก) สำหรับรูปแบบไฟล์ที่เก็บคีย์ Java คุณสมบัตินี้มีค่า jks (หรือ JKS) โดยปกติคุณไม่ได้ระบุคุณสมบัตินี้เนื่องจากค่าเริ่มต้นของมันคือ jks อยู่แล้ว

javax.net.debug - หากต้องการเปิดการบันทึกสำหรับเลเยอร์ SSL / TLS ให้ตั้งค่าคุณสมบัตินี้เป็น ssl


17
มันจะเหมาะสมกว่าที่จะเชื่อมโยงไปยังเอกสารที่อ้างถึงนี้ ฉันเดาว่ามันคือ: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno

4
เอกสารอย่างเป็นทางการควรเป็นคู่มืออ้างอิง JSSE: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/…
aleung

4
JDK7 docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/…มีความเหมาะสมมากกว่าในขณะนี้
Rick-777

11
สำหรับทุกคนที่อาจต้องการแก้ไขที่เก็บระบบเชื่อถือรหัสผ่านเริ่มต้นคือ "changeit": community.oracle.com/thread/1540678?start=0&tstart=0
cwc

+1 สำหรับ prop ของ javax.net.ssl.trustStorePassword ฉันกำลังมองไปรอบ ๆ ในขณะนี้และนี่เป็นครั้งแรกที่กล่าวถึงมัน
jgreen

22

เพียงแค่คำเตือน หากคุณพยายามเปิดที่เก็บคีย์ JKS ที่มีอยู่ใน Java 9 เป็นต้นไปคุณต้องตรวจสอบให้แน่ใจว่าคุณพูดถึงคุณสมบัติต่อไปนี้พร้อมด้วยค่าเป็น "JKS":

javax.net.ssl.keyStoreType
javax.net.ssl.trustStoreType

สาเหตุที่ชนิด keystore ดีฟอลต์ตามที่กำหนดไว้ในไฟล์ java.security ถูกเปลี่ยนเป็น pkcs12 จาก jks จาก Java 9 เป็นต้นไป


11

ก่อนอื่นมีที่เก็บคีย์สองแบบ

รายบุคคลและทั่วไป

แอปพลิเคชันจะใช้อันที่ระบุในการเริ่มต้นหรือเริ่มต้นของระบบ

มันจะเป็นโฟลเดอร์อื่นถ้า JRE หรือ JDK กำลังทำงานอยู่หรือถ้าคุณตรวจสอบส่วนบุคคลหรือโฟลเดอร์ "global"

พวกเขาถูกเข้ารหัสด้วย

ในระยะสั้นเส้นทางจะเป็นดังนี้:

$JAVA_HOME/lib/security/cacerts สำหรับ "นายพลคนหนึ่ง" ที่มี CA ทั้งหมดสำหรับเจ้าหน้าที่และมีความสำคัญมาก


ประเภทคือ 'keystore' และ 'truststore' โปรดอย่าประดิษฐ์คำศัพท์ที่ซ้ำซ้อน
มาร์ควิสแห่ง Lorne

9

คุณยังสามารถพูดถึงเส้นทางที่รันไทม์โดยใช้-Dคุณสมบัติดังต่อไปนี้

-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks

ในแอปพลิเคชันประกาย apache ของฉันฉันใช้เพื่อให้เส้นทางของ certs และ keystore โดยใช้--confตัวเลือกและextraJavaoptionsในการส่งประกายดังต่อไปนี้

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.