Loại kho khóa: sử dụng cái nào?


115

Bằng cách xem xét tệp java.securitycủa tôi JRE, tôi thấy rằng loại kho khóa để sử dụng theo mặc định được đặt thành JKS. Tại đây , có danh sách các loại kho khóa có thể được sử dụng.

Có loại kho khóa được khuyến nghị không? Ưu / nhược điểm của các loại keystore khác nhau là gì?


4
Kể từ Java 9, PKCS12 là kiểu kho khóa mặc định. Thay đổi này là nhằm vào mục tiêu JEP 229: "Cải thiện bảo mật. PKCS12 cung cấp các thuật toán mật mã mạnh hơn JKS." Để biết thêm thông tin, hãy xem "JEP 229: Tạo Kho khóa PKCS12 theo Mặc định", openjdk.java.net/jeps/229 ; truy cập lần cuối vào ngày 2 tháng 2 năm 2018.
buzz3791

Câu trả lời:


142

Có nhiều loại hơn những gì được liệt kê trong danh sách tên chuẩn mà bạn đã liên kết. Bạn có thể tìm thêm trong tài liệu của nhà cung cấp mật mã . Phổ biến nhất chắc chắn là JKS(mặc định) và PKCS12(đối với tệp PKCS # 12, thường có phần mở rộng .p12hoặc đôi khi .pfx).

JKS là phổ biến nhất nếu bạn ở trong thế giới Java. PKCS # 12 không dành riêng cho Java, đặc biệt thuận tiện khi sử dụng chứng chỉ (với khóa riêng) được sao lưu từ trình duyệt hoặc đến từ các công cụ dựa trên OpenSSL ( keytoolkhông thể chuyển đổi kho khóa và nhập khóa riêng của nó trước Java 6 , vì vậy bạn phải sử dụng các công cụ khác).

Nếu bạn đã có tệp PKCS # 12, việc sử dụng PKCS12loại trực tiếp thường dễ dàng hơn . Có thể chuyển đổi định dạng, nhưng hiếm khi cần thiết nếu bạn có thể chọn loại kho khóa trực tiếp.

Trong Java 7, PKCS12chủ yếu hữu ích như một kho khóa nhưng ít hữu ích hơn cho một kho tin cậy (xem sự khác biệt giữa kho khóa và kho tin cậy ), vì bạn không thể lưu trữ các mục nhập chứng chỉ mà không có khóa riêng. Ngược lại, JKSkhông yêu cầu mỗi mục nhập là một mục nhập khóa riêng tư, vì vậy bạn có thể có các mục nhập chỉ chứa chứng chỉ, điều này hữu ích cho các cửa hàng tin cậy, nơi bạn lưu trữ danh sách chứng chỉ mà bạn tin cậy (nhưng bạn không có khóa riêng cho họ).

Điều này đã thay đổi trong Java 8, vì vậy bây giờ bạn cũng có thể có các mục nhập chỉ chứng chỉ trong PKCS12các cửa hàng. (Bạn có thể tìm thêm thông tin chi tiết về những thay đổi này và các kế hoạch khác trong JEP 229: Tạo Kho khóa PKCS12 theo Mặc định .)

Có một số loại kho khóa khác, có lẽ ít được sử dụng hơn (tùy thuộc vào ngữ cảnh), chúng bao gồm:

  • PKCS11, đối với các thư viện PKCS # 11, thường để truy cập mã thông báo mã hóa phần cứng, nhưng việc triển khai nhà cung cấp Sun cũng hỗ trợ các cửa hàng NSS (từ Mozilla) thông qua việc này.
  • BKS, bằng cách sử dụng nhà cung cấp BouncyCastle (thường được sử dụng cho Android).
  • Windows-MY/ Windows-ROOT, nếu bạn muốn truy cập trực tiếp vào kho chứng chỉ Windows.
  • KeychainStore, nếu bạn muốn sử dụng trực tiếp chuỗi khóa OSX.

7
@husayt, chứng chỉ PEM không được hỗ trợ trực tiếp như các loại kho khóa (tôi cho rằng người ta có thể viết một KeyStoretriển khai cho hiệu ứng đó). Tuy nhiên, bạn có thể tải chúng nhanh chóng vào một phiên bản kho khóa (thường là JKS, kiểu mặc định) trong bộ nhớ bằng cách sử dụng CertificateFactory(như được hiển thị trong câu trả lời này ).
Bruno

tôi nghĩ rằng JKSđã thay đổi đếnJCEKS
amphibient

5
Nghiêm trọng hơn, một kho khóa JKS không thể lưu trữ các khóa bí mật. Đối với trường hợp sử dụng này, JCEKS là thích hợp. Nó có thể được đề cập đến điều này trong câu trả lời của bạn.
Duncan Jones

1
Đồng ý. Trong Java 8, tôi có thể tạo kho khóa PKCS # 12 với một chứng chỉ duy nhất mà không gặp bất kỳ sự cố nào. Lưu ý rằng đối với các mục nhập chứng chỉ P12 được hoàn toàn tin cậy. Nếu bạn cần các chứng chỉ không đáng tin cậy, bạn có thể phải hoàn nguyên về sơ đồ có nhiều kho khóa.
Maarten Bodewes

2
OK ít nhất đối với Java 8 kho khóa PKCS # 12 vẫn không thể lưu trữ các mục nhập khóa bí mật . Bạn sẽ nhận được ngoại lệ con trỏ null khi lưu trữ một kho khóa như vậy (ugh), có thể vì nó không thể tìm thấy các chứng chỉ liên quan. Ai đó dường như đã bỏ qua những lời dạy của Joshua về mã nhanh thất bại.
Maarten Bodewes

22

Đây là một bài đăng giới thiệu các loại kho khóa khác nhau trong Java và sự khác biệt giữa các loại kho khóa khác nhau. http://www.pixelstech.net/article/1408345768-Dierence-types-of-keystore-in-Java----Overview

Dưới đây là mô tả của các kho khóa khác nhau từ bài đăng:

JKS, Kho khóa Java. Bạn có thể tìm thấy tệp này tại sun.security.provider.JavaKeyStore. Kho khóa này là dành riêng cho Java, nó thường có phần mở rộng là jks. Loại kho khóa này có thể chứa khóa cá nhân và chứng chỉ, nhưng nó không thể được sử dụng để lưu khóa bí mật. Vì nó là một kho khóa cụ thể của Java, nên nó không thể được sử dụng trong các ngôn ngữ lập trình khác.

JCEKS, kho khóa JCE. Bạn có thể tìm thấy tệp này tại com.sun.crypto.provider.JceKeyStore. Kho khóa này có một phần mở rộng của jceks. Các mục nhập có thể được đưa vào kho khóa JCEKS là khóa cá nhân, khóa bí mật và chứng chỉ.

PKCS12, đây là kiểu kho khóa tiêu chuẩn có thể được sử dụng trong Java và các ngôn ngữ khác. Bạn có thể tìm thấy triển khai kho khóa này tại sun.security.pkcs12.PKCS12KeyStore. Nó thường có phần mở rộng là p12 hoặc pfx. Bạn có thể lưu trữ khóa cá nhân, khóa bí mật và chứng chỉ trên loại này.

PKCS11, đây là loại kho khóa phần cứng. Nó cung cấp một giao diện cho thư viện Java để kết nối với các thiết bị lưu trữ khóa phần cứng như Luna, nCipher. Bạn có thể tìm thấy triển khai này tại sun.security.pkcs11.P11KeyStore. Khi bạn tải kho khóa, bạn không cần phải tạo một nhà cung cấp cụ thể với cấu hình cụ thể. Kho khóa này có thể lưu trữ khóa cá nhân, khóa bí mật và mật mã. Khi tải kho khóa, các mục nhập sẽ được truy xuất từ ​​kho khóa và sau đó chuyển thành mục nhập phần mềm.


@ peci1 Tôi đã dự định viết một số hướng dẫn về cách sử dụng các kho khóa này. Cho đến nay tôi đã viết một bài cho JKS, hãy tìm nó ở pixelstech.net/article/...
PixelsTech

@PixelsTech tôi đã tìm thấy cái này và đã tự hỏi đâu rồi phần còn lại của họ :) Vì vậy, tôi sẽ tiếp tục theo dõi;) Cảm ơn
Martin Pecka

1
@ peci1 Tôi đã giới thiệu JCEKS và PKCS12 hôm nay. Đối với PKCS11, nó liên quan đến phần cứng và cấu hình bổ sung, cần thêm thời gian để soạn nó. pixelstech.net/article/…pixelstech.net/article/…
PixelsTech

Chà, đó là một tốc độ cực nhanh! Cảm ơn rất nhiều.
Martin Pecka

5

Nếu bạn đang sử dụng Java 8 hoặc mới hơn, bạn chắc chắn nên chọn PKCS12, mặc định kể từ Java 9 ( JEP 229 ).

Những lợi thế so với JKSJCEKSlà:

  • Khóa bí mật, khóa cá nhân và chứng chỉ có thể được lưu trữ
  • PKCS12là một định dạng tiêu chuẩn, nó có thể được đọc bởi các chương trình và thư viện khác 1
  • Cải thiện bảo mật: JKSJCEKSkhá không an toàn. Có thể thấy điều này qua số lượng các công cụ cưỡng bức mật khẩu của các loại kho khóa này, đặc biệt phổ biến đối với các nhà phát triển Android. 2, 3

1JDK-8202837 , đã được sửa trong Java 11

2 Số lần lặp lại cho PBE được sử dụng bởi tất cả các loại kho khóa (bao gồm cả PKCS12) đã từng là một tuần ( CVE-2017-10356 ), tuy nhiên điều này đã được sửa trong 9.0.1, 8u151, 7u161 và 6u171

3 Để đọc thêm:

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.