Trust Store vs Key Store - tạo bằng keytool


249

Tôi hiểu rằng kho khóa thường sẽ giữ khóa riêng / công khai và cửa hàng ủy thác chỉ có khóa công khai (và đại diện cho danh sách các bên đáng tin cậy mà bạn dự định liên lạc). Chà, đó là giả định đầu tiên của tôi, vì vậy nếu điều đó không đúng, có lẽ tôi đã không bắt đầu rất tốt ...

Tôi đã quan tâm mặc dù hiểu cách / khi bạn phân biệt các cửa hàng khi sử dụng keytool.

Vì vậy, cho đến nay tôi đã tạo một kho khóa bằng cách sử dụng

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

tạo tập tin keystore.ks của tôi. Tôi trả lời yescho câu hỏi tôi có tin tưởng bob không nhưng tôi không rõ liệu điều này có tạo ra tệp kho khóa hay tệp tin Truststore không? Tôi có thể thiết lập ứng dụng của mình để sử dụng tệp.

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

và với System.setProperty( "javax.net.debug", "ssl")bộ, tôi có thể xem chứng chỉ theo các chứng chỉ tin cậy (nhưng không phải trong phần kho khóa). Chứng chỉ cụ thể mà tôi đang nhập chỉ có một khóa công khai và tôi dự định sử dụng nó để gửi nội dung qua kết nối SSL tới Bob (nhưng có lẽ đó là cách tốt nhất để lại cho một câu hỏi khác!).

Bất kỳ con trỏ hoặc làm rõ sẽ được nhiều đánh giá cao. Đầu ra của keytool có giống với bất cứ thứ gì bạn nhập không và quy ước chỉ nói rằng một là kho lưu trữ khóa và cái kia là một cửa hàng tin cậy? Mối quan hệ khi sử dụng SSL là gì?


Tôi không chắc ý của bạn là "Chứng chỉ cụ thể mà tôi đang nhập chỉ có khóa chung": đó chỉ là khóa chung (tức không phải là chứng chỉ) hay chứng chỉ không phải CA?
Bruno

hmmm, không chắc chắn Tôi đã xuất từ ​​trình duyệt của mình dưới dạng tệp PEM. cái đó có giúp ích không?
Toby

Nếu nó được xuất từ ​​trình duyệt, nó có thể là một chứng chỉ. Đây có phải là chứng chỉ máy chủ (với CN hoặc objectAltName khớp với tên của máy chủ) không? Đây có phải là chứng chỉ CA không (xem phần Ràng buộc cơ bản, bạn sẽ có thể thấy điều này bằng trình duyệt của mình).
Bruno

2
tl; dr: các cửa hàng tin cậy chứa các certs công cộng, đáng tin cậy, root (CA), trong khi các cửa hàng nhận dạng / khóa chứa các certs riêng, danh tính; tập tin khôn ngoan, tuy nhiên, chúng là như nhau.
Andrew

Câu trả lời:


346

Thuật ngữ này thực sự hơi khó hiểu, nhưng cả hai javax.net.ssl.keyStorejavax.net.ssl.trustStoređược sử dụng để chỉ định sử dụng kho khóa nào, cho hai mục đích khác nhau. Các kho khóa có nhiều định dạng khác nhau và thậm chí không nhất thiết phải là tệp (xem câu hỏi này ) và keytoolchỉ là một công cụ để thực hiện các hoạt động khác nhau trên chúng (nhập / xuất / danh sách / ...).

Các tham số javax.net.ssl.keyStorejavax.net.ssl.trustStoretham số là các tham số mặc định được sử dụng để xây dựng KeyManagers và TrustManagers (tương ứng), sau đó được sử dụng để xây dựng một SSLContextcơ bản chứa các cài đặt SSL / TLS để sử dụng khi thực hiện kết nối SSL / TLS thông qua một SSLSocketFactoryhoặc một SSLEngine. Các thuộc tính hệ thống này chỉ là nơi các giá trị mặc định xuất phát, sau đó được sử dụng bởi SSLContext.getDefault()chính nó SSLSocketFactory.getDefault(). (Tất cả điều này có thể được tùy chỉnh thông qua API ở một số nơi, nếu bạn không muốn sử dụng các giá trị mặc định và các giá trị cụ thể SSLContextđó cho một mục đích nhất định.)

Sự khác biệt giữa KeyManagerTrustManager(và do đó giữa javax.net.ssl.keyStorejavax.net.ssl.trustStore) như sau (trích từ hướng dẫn tham khảo JSSE ):

TrustManager: Xác định xem thông tin xác thực từ xa (và do đó kết nối) có đáng tin cậy hay không.

KeyManager: Xác định thông tin xác thực nào sẽ gửi đến máy chủ từ xa.

(Các tham số khác có sẵn và giá trị mặc định của chúng được mô tả trong hướng dẫn tham chiếu JSSE . Lưu ý rằng mặc dù có một giá trị mặc định cho cửa hàng ủy thác, nhưng không có giá trị nào cho kho lưu trữ khóa.)

Về cơ bản, kho khóa javax.net.ssl.keyStorecó nghĩa là chứa các khóa và chứng chỉ riêng của bạn, trong khi đó javax.net.ssl.trustStorecó nghĩa là chứa các chứng chỉ CA mà bạn sẵn sàng tin tưởng khi một bên từ xa xuất trình chứng chỉ của nó. Trong một số trường hợp, chúng có thể là một và cùng một cửa hàng, mặc dù thông thường tốt hơn là sử dụng các cửa hàng riêng biệt (đặc biệt là khi chúng dựa trên tệp).


cảm ơn đã trả lời, nó làm sáng tỏ mọi thứ một chút. Mặc dù vậy, tôi vẫn bối rối khi sử dụng, tôi có thể sử dụng khóa pk12 pr / pub (xxx.p12) làm kho khóa (thông qua -D) và tạo kết nối SSL (đáng tin cậy) mà không cần đề cập đến kho ủy thác qua - Đ ... ồ tốt.
Toby

57
Bạn không cần chỉ định một cửa hàng tin cậy, bởi vì có một giá trị mặc định cho nó (được gói cùng với JRE), thường là trong $JAVA_HOME/lib/security/cacerts(xem liên kết hướng dẫn tham khảo JSSE thứ 2 tôi đã gửi). Giống như các trình duyệt, nó chứa một bộ chứng chỉ CA đáng tin cậy mặc định. Nói chung, khách hàng sẽ luôn sử dụng cửa hàng tin cậy để kiểm tra chứng chỉ máy chủ nhưng kho khóa sẽ chỉ được sử dụng nếu máy chủ yêu cầu chứng chỉ ứng dụng khách và máy chủ sẽ luôn sử dụng kho khóa cho khóa + cert của riêng họ nhưng kho tin cậy sẽ chỉ được sử dụng nếu khách hàng gửi chứng chỉ ứng dụng khách.
Bruno

2
Cảm ơn thông tin hữu ích. Trong Weblogic, có "cửa hàng khóa nhận dạng" lưu trữ chứng chỉ SSL của máy chủ và sau đó có "cửa hàng khóa tin cậy" lưu trữ chứng chỉ SSL mà máy chủ tin tưởng, vì vậy tôi có đúng không nếu tôi nói rằng "khóa nhận dạng -store "không là gì ngoài" kho khóa "và" Trust-key-store "không là gì ngoài" cửa hàng tin cậy "?
hagrawal

@Bruno cũng nên lưu ý rằng khi có "jssecacerts", "cacerts" bị bỏ qua?
kommradHomer

61

Để giải thích theo cách sử dụng chung / mục đích hoặc cách cư sĩ:

TrustStore : Như tên gọi, nó thường được sử dụng để lưu trữ các chứng chỉ của các thực thể đáng tin cậy. Một quy trình có thể duy trì một kho chứng chỉ của tất cả các bên đáng tin cậy mà nó tin tưởng.

keyStore : Được sử dụng để lưu trữ các khóa máy chủ (cả công khai và riêng tư) cùng với chứng chỉ đã ký.

Trong quá trình bắt tay SSL,

  1. Một khách hàng cố gắng truy cập https: //

  2. Và do đó, Máy chủ phản hồi bằng cách cung cấp chứng chỉ SSL (được lưu trữ trong kho khóa của nó)

  3. Bây giờ, khách hàng nhận được chứng chỉ SSL và xác minh thông qua trustStore (tức là TrustStore của khách hàng đã có bộ chứng chỉ được xác định trước mà nó tin tưởng.). Nó giống như: Tôi có thể tin tưởng máy chủ này? Đây có phải là cùng một máy chủ mà tôi đang cố gắng nói chuyện không? Không có người trung gian tấn công?

  4. Khi khách hàng xác minh rằng họ đang nói chuyện với máy chủ mà họ tin tưởng, thì giao tiếp SSL có thể xảy ra qua khóa bí mật chung.

Lưu ý: Tôi không nói ở đây bất cứ điều gì về xác thực ứng dụng khách ở phía máy chủ. Nếu một máy chủ cũng muốn thực hiện xác thực ứng dụng khách, thì máy chủ cũng duy trì một TrustStore để xác minh ứng dụng khách.


25

Không có sự khác biệt giữa các tệp keystore và truststore. Cả hai đều là các tệp ở định dạng tệp JKS độc quyền. Điểm khác biệt nằm ở cách sử dụng: Theo hiểu biết tốt nhất của tôi, Java sẽ chỉ sử dụng cửa hàng được thuộc tính -Djavax.net.ssl.trustStorehệ thống tham chiếu để tìm kiếm chứng chỉ để tin cậy khi tạo kết nối SSL. Tương tự cho các phím và -Djavax.net.ssl.keyStore. Nhưng trên lý thuyết, sử dụng một và cùng một tệp cho tin cậy và kho khóa là tốt.


4
Bạn có thể sử dụng các loại kho khóa khác nhau (ví dụ: PKCS12) bằng cách đặt thuộc tính javax.net.ssl.keyStoreTypejavax.net.ssl.trustStoreTypehệ thống.
Donal Fellows

1
@Donal: Bổ sung tốt. Bạn có tình cờ biết nếu có một danh sách tất cả các container được hỗ trợ không? Tôi chỉ biết về PKCS12 và JKS (trước đây là kết quả của thử nghiệm và lỗi ...).
musiKk

2
các định dạng kho khóa khác nhau tùy thuộc vào các nhà cung cấp có sẵn (xem danh sách này cho những người được gói cùng với JRE của Oracle theo mặc định). Cũng có một cuộc thảo luận trong câu hỏi này . Các nhà cung cấp khác (ví dụ BouncyCastle) có thể được sử dụng cho các định dạng khác.
Bruno

21

Kho lưu trữ khóa được máy chủ sử dụng để lưu trữ khóa riêng và Truststore được sử dụng bởi khách hàng bên thứ ba để lưu trữ khóa công khai do máy chủ cung cấp để truy cập. Tôi đã làm điều đó trong ứng dụng sản xuất của tôi. Dưới đây là các bước để tạo chứng chỉ java cho giao tiếp SSL:

  1. Tạo chứng chỉ bằng lệnh keygen trong windows:

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

  1. Tự chứng nhận giấy chứng nhận:

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

  1. Xuất chứng chỉ vào thư mục:

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

  1. Nhập chứng chỉ vào máy khách Truststore:

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


Xin chào, tôi có một kịch bản trong đó tôi có hai ứng dụng khác nhau trong cùng một container (tomcat). Từ cả hai ứng dụng, tôi phải gọi các điểm cuối còn lại từ cả hai phía cho mỗi ứng dụng. Giống như, từ A đến B và B đến A (A và B là hai ứng dụng). Tôi có cần sử dụng cửa hàng tin cậy trong kịch bản này không? Như tôi đang sử dụng máy khách còn lại tùy chỉnh đang sử dụng kho khóa. Xin đề nghị.
Deepak

0

Đây là các bước để tạo Truststore trong máy cục bộ của bạn bằng Keytool. Các bước để tạo cửa hàng tin cậy cho một URL trong máy cục bộ của bạn.

1) Nhấn url trong trình duyệt bằng chrome

2) Kiểm tra "i" biểu tượng ở bên trái của url trong chrome và nhấp vào biểu tượng đó

3) Kiểm tra tùy chọn chứng chỉ và nhấp vào nó và hộp thoại sẽ mở ra

4) kiểm tra tab "đường dẫn chứng chỉ" để biết số lượng chứng chỉ có sẵn để tạo cửa hàng tin cậy

5) Đi "details" tab -> click"Copy to File" -> Give the path and the name for the certificatebạn muốn tạo.

6) Kiểm tra xem nó có chứng chỉ gốc hay không và theo điểm "5" .

7) Sau khi tất cả các chứng chỉ đang được tạo, hãy mở Command Prompt và điều hướng đến đường dẫn mà bạn đã tạo chứng chỉ.

8) cung cấp lệnh Keytool bên dưới để thêm chứng chỉ và tạo kho tin cậy.

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) Cung cấp lệnh keytool cho tất cả các chứng chỉ và thêm chúng vào cửa hàng ủy thác.

    keytool -list -v -keystore cacerts

-1

kho khóa chỉ đơn giản là lưu trữ khóa riêng, máy ảnh ủy thác lưu trữ khóa công khai. Bạn sẽ muốn tạo chứng chỉ java cho giao tiếp SSL. Bạn có thể sử dụng lệnh keygen trong windows, đây có lẽ sẽ là giải pháp dễ dàng nhất.


Một cửa hàng ủy thác lưu trữ chứng chỉ
Hầu tước Lorne

-1

Nói một cách đơn giản nhất:

Kho khóa được sử dụng để lưu trữ thông tin đăng nhập của bạn (máy chủ hoặc máy khách) trong khi Truststore được sử dụng để lưu trữ thông tin xác thực khác (Chứng chỉ từ CA).

Kho khóa là cần thiết khi bạn thiết lập phía máy chủ trên SSL, nó được sử dụng để lưu chứng chỉ nhận dạng của máy chủ, máy chủ nào sẽ hiển thị cho khách hàng trên kết nối trong khi thiết lập cửa hàng tin cậy ở phía máy khách phải có để kết nối hoạt động. Nếu trình duyệt của bạn kết nối với bất kỳ trang web nào qua SSL, nó sẽ xác minh chứng chỉ được cung cấp bởi máy chủ dựa trên cửa hàng tin cậy của nó.

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.