2008-11-25 6 views

Trả lời

233

Kho lưu trữ khóa chứa khóa cá nhân và chứng chỉ có khóa công khai tương ứng.

Cửa hàng tin cậy chứa chứng chỉ từ các bên khác mà bạn mong muốn liên lạc hoặc từ Tổ chức phát hành chứng chỉ mà bạn tin tưởng để xác định các bên khác.

+10

Mặc dù điều này nên đúng trong thực tế, họ có thể (và thường là) một trong cùng một. Bạn thực sự có thể nhập khóa cá nhân và chứng chỉ công khai vào "truststore" của [java home]/jre/lib/security/cacerts. Tiện ích keytool không phân biệt hai cụm từ, chỉ trong các loại cửa hàng (tức là - JKS so với PKCS12). Đối với vấn đề đó, Java làm điều tương tự trong mã nguồn. Bạn tạo một java.security.KeyStore và sử dụng trình quản lý tin cậy để quản lý các chứng chỉ trong đó, nhưng không có lớp TrustStore. –

+4

Java không có 'TrustStore' * cho mỗi lần *. Hoặc tôi không thể tìm thấy nó trong các tài liệu java (ví dụ, 'java.security.TrustStore'). Khi chúng ta muốn tin cậy một Certificate Authority, nó được tin cậy thông qua một 'KeyStore' (và' KeyStore' được truyền vào 'TrustManagerFactory'). – jww

+5

Điều đáng nói đến là mật khẩu 'KeyStore.load (InputStream là, char [])' ([docs] (http://docs.oracle.com/javase/7/docs/api/java/security/KeyStore.html # load% 28java.io.InputStream,% 20char []% 29)) có thể lấy một mật khẩu rỗng và sau đó nó sẽ cấp quyền truy cập vào các chứng chỉ công khai. Đó là, mã muốn duyệt một cửa hàng tin cậy không cần biết mật khẩu (vì những lý do rất tốt!) – xverges

70
  1. Kho lưu trữ khóa chứa khóa riêng tư. Bạn chỉ cần điều này nếu bạn là máy chủ hoặc nếu máy chủ yêu cầu xác thực ứng dụng khách.

  2. Một truststore chứa chứng chỉ CA để tin cậy. Nếu chứng chỉ của máy chủ của bạn được ký bởi một CA được công nhận, nhà cung cấp tin cậy mặc định sẽ được ủy thác với JRE (vì nó đã tin cậy CA đáng tin cậy), vì vậy bạn không cần phải xây dựng riêng của mình, hoặc để thêm bất cứ điều gì với một từ JRE.

Source

25

Bạn cũng có thể quan tâm đến viết lên từ Sun, như một phần của tài liệu JSSE tiêu chuẩn:

http://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#Stores

Thông thường, các cửa hàng tin tưởng được sử dụng để chỉ lưu trữ khóa công khai, cho mục đích xác minh, chẳng hạn như xác thực X.509. Đối với các mục đích quản lý, nó khá phổ biến đối với quản trị viên hoặc nhà phát triển chỉ đơn giản là ghép hai thành một cửa hàng duy nhất.

+1

Cung cấp 404 không may –

+0

@ChrisBeach - đã cập nhật liên kết đến đúng mật khẩu trên trang web Oracle. –

+0

Truststore được sử dụng để lưu trữ * chứng chỉ người ký đáng tin cậy. * – EJP

60

Trong một SSL Handshake mục đích trustStore là để xác minh thông tin và mục đích của keystore là cung cấp chứng chỉ.

keystore

keystore trong Java cửa hàng khóa bí mật và chứng chỉ tương ứng với khóa công khai của họ và yêu cầu nếu bạn là SSL Server hoặc SSL yêu cầu xác thực khách hàng.

TrustStore

cửa hàng TrustStore giấy chứng nhận từ bên thứ ba, ứng dụng Java của bạn giao tiếp hoặc giấy chứng nhận có chữ ký của CA (thẩm định chứng chỉ như Verisign, Thawte, GeoTrust hoặc GoDaddy) mà có thể được sử dụng để xác định bên thứ ba.

TrustManager

TrustManager sẽ xác định xem kết nối từ xa đáng tin cậy hay không ví dụ: cho dù đảng từ xa là nó tuyên bố người đến và đi KeyManager quyết định những thông tin xác thực nên được gửi đến máy chủ từ xa để xác thực trong SSL handshake.

Nếu bạn là một máy chủ SSL, bạn sẽ sử dụng khóa riêng trong thuật toán trao đổi khóa và gửi chứng chỉ tương ứng với khóa công khai của bạn cho khách hàng, chứng chỉ này được lấy từ keyStore. Về phía máy khách SSL, nếu được viết bằng Java, nó sẽ sử dụng các chứng chỉ được lưu trữ trong trustStore để xác minh danh tính của Máy chủ.Chứng chỉ SSL phổ biến nhất là .cer tệp được thêm vào keyStore hoặc trustStore bằng cách sử dụng bất kỳ tiện ích quản lý khóa nào, ví dụ: keytool.

Nguồn: http://javarevisited.blogspot.ch

+3

Câu trả lời này giải quyết mục đích của mỗi câu trả lời mà tôi cho là hoàn toàn nhất. –

+0

Điều này thực sự làm rõ rất nhiều thuật ngữ. –

9

Trong Java, sự khác biệt giữa một keystore và truststore là gì?

Đây là mô tả từ tài liệu Java tại Java Secure Socket Extension (JSSE) Reference Guide. Tôi không nghĩ rằng nó cho bạn biết bất cứ điều gì khác với những gì người khác đã nói. Nhưng nó cung cấp tài liệu tham khảo chính thức.

keystore/truststore

Một keystore là một cơ sở dữ liệu của các tài liệu quan trọng. Tài liệu chính được sử dụng cho nhiều mục đích khác nhau, bao gồm xác thực và toàn vẹn dữ liệu. Các loại khóa phím khác nhau có sẵn, bao gồm PKCS12 và JKS của Oracle.

Nói chung, thông tin kho khóa có thể được nhóm thành hai loại: mục nhập khóa và mục nhập chứng chỉ đáng tin cậy. Một mục nhập quan trọng bao gồm danh tính của một thực thể và khóa riêng của nó và có thể được sử dụng cho nhiều mục đích mã hóa khác nhau. Ngược lại, mục nhập chứng chỉ tin cậy chỉ chứa khóa công khai ngoài danh tính của đối tượng . Do đó, không thể sử dụng mục nhập chứng chỉ đáng tin cậy trong đó yêu cầu khóa riêng tư, chẳng hạn như trong javax.net.ssl.KeyManager. Trong việc triển khai JDK của JKS, một kho khóa có thể chứa cả các mục nhập khóa và các mục nhập chứng chỉ đáng tin cậy.

Cửa hàng ủy thác là kho khóa được sử dụng khi đưa ra quyết định về những gì cần tin tưởng. Nếu bạn nhận được dữ liệu từ một pháp nhân mà bạn đã tin tưởng và nếu bạn có thể xác minh rằng pháp nhân là một thực thể mà xác nhận quyền sở hữu, thì bạn có thể giả định rằng dữ liệu thực sự đến từ thực thể đó.

Chỉ nên thêm mục nhập vào một cửa hàng tin cậy nếu người dùng tin tưởng thực thể đó. Bằng cách tạo cặp khóa hoặc bằng cách nhập chứng chỉ , người dùng sẽ tin tưởng vào mục nhập đó. Bất kỳ mục nhập nào trong cửa hàng ủy thác đều được coi là một mục đáng tin cậy.

Có thể hữu ích khi có hai tệp kho khóa khác nhau: một tệp chỉ chứa các mục nhập chính của bạn và tệp còn lại chứa các mục nhập chứng chỉ tin cậy của bạn, bao gồm chứng chỉ CA. trước đây có chứa thông tin cá nhân, trong khi thông tin thứ hai thì không. Sử dụng hai tệp thay vì một tệp kho khóa duy nhất cung cấp sự tách biệt rõ ràng hơn của sự phân biệt hợp lý giữa chứng chỉ của riêng bạn (và khóa riêng tương ứng) và chứng chỉ của người khác. Để cung cấp thêm bảo vệ cho khóa riêng tư của bạn, hãy lưu trữ chúng trong kho khóa với quyền truy cập bị hạn chế và cung cấp chứng chỉ đáng tin cậy ở một kho khóa công khai hơn nếu cần.

3
  1. Đầu tiên và khác biệt lớn giữa trustStore và keystore được rằng trustStore được sử dụng bởi TrustManager để xác định xem kết nối từ xa nên được tin cậy, keystore được sử dụng từ KeyManager quyết định thông tin xác thực phải được gửi đến các máy chủ từ xa cho xác thực trong quá trình bắt tay SSL.

  2. Một điểm khác biệt là keyStore về mặt lý thuyết chứa khóa riêng chỉ cần thiết nếu bạn đang chạy máy chủ trong kết nối SSL hoặc bạn đã bật xác thực máy khách ở phía máy chủ và mặt khác trustStore lưu trữ khóa công khai hoặc chứng chỉ từ CA (Tổ chức phát hành chứng chỉ)) được sử dụng để tin tưởng từ xa hoặc kết nối SSL.

    Trong thực tế, bạn có thể lưu trữ trong cùng một tập tin cả hai phím riêng và công cộng, cho rằng các công cụ để quản lý các tập tin là như nhau (keytool), nên bạn có thể sử dụng một tập tin duy nhất cho cả hai mục đích , nhưng bạn có lẽ không được.

  3. Ít nhất trên Mac OSX, khóa mặc định của tôi là ${user.home}/.keystore và trustStore mặc định là /System/Library/Java/Support/CoreDeploy.bundle/Contents/Home/lib/security/cacerts.

    Nếu bạn muốn ghi đè chúng, bạn nên thêm thông số JVM -Djavax.net.ssl.keyStore /path/to/keyStore hoặc -Djavax.net.ssl.trustStore /path/to/trustStore. Bạn cũng có thể cần phải thiết lập lại mật khẩu keystore trong trường hợp java.security.UnrecoverableKeyException: Password must not be null, sử dụng tham số -Djavax.net.ssl.trustStorePassword=password hoặc -Djavax.net.ssl.trustStorePassword=password

Nguồn chi tiết:

http://javarevisited.blogspot.co.uk/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html