java SSL và kho khóa chứng chỉ


165

Làm thế nào để chương trình java của tôi biết nơi kho khóa của tôi chứa chứng chỉ? Hoặc cách khác là làm thế nào để tôi nói với chương trình java của tôi nơi tìm kho khóa?

Sau khi chỉ định kho khóa theo một cách nào đó, làm thế nào để chỉ định chứng chỉ sẽ sử dụng để xác thực máy chủ với máy khách?


tốt hơn hết là tránh sử dụng cài đặt System.setProperty (các cách tiếp cận bên dưới), xem: docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/ trộm , cách xây dựng KeyManagerFactory cho SSLContext
Marek- A-

Câu trả lời:


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

4
Bất cứ ai biết làm thế nào để tham khảo này trên một hộp cửa sổ? System.setProperty ("javax.net.ssl.trustStore", "C: \\ Tệp chương trình (x86) \\ Java \\ jdk1.7.0_21 \\ jre \\ lib \\ security \\ cacerts"); không làm việc cho tôi :(
simgineer 17/07/13

4
Trên Windows, tên đường dẫn được chỉ định phải sử dụng dấu gạch chéo về phía trước, /, thay cho dấu gạch chéo ngược, \.
Droidman 4/03/2015

Đã làm việc này? Tôi đã sử dụng cùng một mã trong đó tệp 'jks' của tôi chứa Chứng chỉ CA. Nhưng tôi vẫn nhận được javax.xml.ws.WebServiceException: org.apache.axis2.AxisFault: Lỗi vận chuyển: 403 Lỗi: Lỗi bị cấm khi tôi gọi mã máy khách thông qua các sơ khai được tạo SOAP. Có ý kiến ​​gì không?
james2611nov

1
Ngoài ra còn có một thuộc tính hệ thống mật khẩu (javax.net.ssl.trustStorePassword). Cũng có thể được thông qua như các đối số JVM -Djavax.net.ssl.trustStore = clientTrustStore.key -Djavax.net.ssl.trustStorePassword = customPassword Tham khảo docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslclient.html
Kingsly

@ james2611nov: Nếu bạn gặp lỗi HTTP 403 (hoặc bất kỳ phản hồi HTTP nào khác) đang gọi điểm cuối HTTPS, thì điều đó có nghĩa là bạn đã vượt qua thiết lập TLS thành công: các tương tác HTTP chỉ diễn ra khi kênh TLS được thiết lập ( khác họ không thể được bảo vệ). Vì vậy - có, câu trả lời này rõ ràng có hiệu quả với bạn. :-)
ruakh

295

Các thuộc tính SSL được đặt ở mức JVM thông qua các thuộc tính hệ thống. Có nghĩa là bạn có thể đặt chúng khi bạn chạy chương trình (java -D ....) Hoặc bạn có thể đặt chúng trong mã bằng cách thực hiện System.setProperty.

Các phím cụ thể bạn phải đặt bên dưới:

javax.net.ssl.keyStore - Vị trí của tệp kho khóa Java chứa chứng chỉ và khóa riêng của quy trình ứng dụng. Trên Windows, tên đường dẫn được chỉ định phải sử dụng dấu gạch chéo về phía trước, /, thay cho dấu gạch chéo ngược.

javax.net.ssl.keyStorePassword - Mật khẩu để truy cập khóa riêng từ tệp kho khóa được chỉ định bởi javax.net.ssl.keyStore. Mật khẩu này được sử dụng hai lần: Để mở khóa tệp kho khóa (mật khẩu lưu trữ) và Để giải mã khóa riêng được lưu trong kho khóa (mật khẩu khóa).

javax.net.ssl.trustStore - Vị trí của tệp kho khóa Java chứa bộ sưu tập chứng chỉ CA được tin cậy bởi quy trình ứng dụng này (cửa hàng tin cậy). Trên Windows, tên đường dẫn được chỉ định phải sử dụng dấu gạch chéo về phía trước /, thay cho dấu gạch chéo ngược , \.

Nếu vị trí cửa hàng ủy thác không được chỉ định sử dụng thuộc tính này, thì việc triển khai SunJSSE tìm kiếm và sử dụng tệp kho khóa ở các vị trí sau (theo thứ tự):

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

javax.net.ssl.trustStorePassword - Mật khẩu để mở khóa tệp kho khóa (mật khẩu lưu trữ) được chỉ định bởi javax.net.ssl.trustStore.

javax.net.ssl.trustStoreType - (Tùy chọn) Đối với định dạng tệp kho khóa Java, thuộc tính này có giá trị jks (hoặc JKS). Bạn thường không chỉ định thuộc tính này, vì giá trị mặc định của nó là jks.

javax.net.debug - Để bật đăng nhập cho lớp SSL / TLS, hãy đặt thuộc tính này thành ssl.


17
Nó sẽ thích hợp hơn để liên kết đến tài liệu mà từ đó trích dẫn này. Tôi đoán đây là: fusesource.com/docs/broker/5.3/security/SSL-SysProps.html
Bruno

4
Tài liệu chính thức phải là Hướng dẫn tham khảo của JSSE: docs.oracle.com/javase/6/docs/technotes/guides/security/jsse/ trộm
aleung


11
Đối với bất kỳ ai muốn chỉnh sửa cửa hàng ủy thác hệ thống, mật khẩu mặc định là "changeit": Community.oracle.com/thread/1540678?start=0&tstart=0
cwc

+1 cho prop prop javax.net.ssl.trustStorePassword. Tôi đã tìm kiếm xung quanh một lúc và đây là lần đầu tiên đề cập đến nó.
ngày

22

Chỉ cần một lời cảnh cáo. Nếu bạn đang cố mở một kho khóa JKS hiện có trong Java 9 trở đi, bạn cần đảm bảo rằng bạn cũng đề cập đến các thuộc tính sau với giá trị là "JKS":

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

Lý do là loại kho lưu trữ khóa mặc định theo quy định trong tệp java.security đã được thay đổi thành pkcs12 từ jks từ Java 9 trở đi.


11

Trước hết, có hai loại bàn phím.

Cá nhânchung

Ứng dụng sẽ sử dụng ứng dụng được chỉ định khi khởi động hoặc mặc định của hệ thống.

Nó sẽ là một thư mục khác nếu JRE hoặc JDK đang chạy hoặc nếu bạn kiểm tra thư mục cá nhân hoặc "toàn cầu".

Chúng cũng được mã hóa

Nói tóm lại, đường dẫn sẽ như sau:

$JAVA_HOME/lib/security/cacerts đối với "người chung", người có tất cả CA cho Chính quyền và khá quan trọng.


Các loại là 'kho khóa' và 'cửa hàng tin cậy'. Xin đừng phát minh ra thuật ngữ dư thừa.
Hầu tước Lorne

9

bạn cũng có thể đề cập đến đường dẫn trong thời gian chạy bằng -Dcác thuộc tính như dưới đây

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

Trong ứng dụng tia lửa apache của tôi, tôi đã sử dụng để cung cấp đường dẫn của certs và kho khóa bằng cách sử dụng --conftùy chọn và extraJavaoptionsgửi tia lửa như dưới đây

--conf 'spark.driver.extraJavaOptions= 
-Djavax.net.ssl.trustStore=/home/user/SSL/my-cacerts 
-Djavax.net.ssl.keyStore=/home/user/SSL/server_keystore.jks' 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.