Nhập chuỗi chứng chỉ PEM và khóa vào Kho khóa Java


29

Có rất nhiều tài nguyên về chủ đề này, nhưng không có tài liệu nào tôi tìm thấy trong đó bao gồm trường hợp hơi đặc biệt này.

Tôi có 4 tập tin;

  • privatekey.pem
  • cert.pem
  • trung gian_rapidssl.pem
  • ca_geotrust_global.pem

Và tôi muốn nhập chúng vào một kho khóa mới.

Một số trang web đề xuất sử dụng định dạng DER và nhập từng cái một, nhưng điều này không thành công vì khóa không được nhận dạng.

Một trang web khác đã đề xuất một lớp "ImportKey" đặc biệt để chạy để nhập và điều này hoạt động cho đến khi tôi thấy rằng chuỗi bị hỏng. Tức là độ dài chuỗi trên chứng chỉ là 1, bỏ qua trung gian và ca.

Một số trang web đề xuất PKCS7, nhưng tôi thậm chí không thể có được chuỗi từ đó. Những người khác đề xuất định dạng PKCS12, nhưng theo như các thử nghiệm của tôi thì thất bại cũng như lấy toàn bộ chuỗi.

Bất kỳ lời khuyên hoặc gợi ý đều được chào đón.

Câu trả lời:


26

Điều này có thể không hoàn hảo, nhưng tôi đã có một số lưu ý về việc sử dụng keytoolmà tôi đã sửa đổi cho kịch bản của bạn.

  1. Nhập chứng chỉ CA gốc hoặc trung gian vào kho khóa Java hiện có:

    keytool -import -trustcacerts -alias root -file ca_geotrust_global.pem -keystore yourkeystore.jks
    keytool -import -trustcacerts -alias root -file intermediate_rapidssl.pem -keystore yourkeystore.jks 
    
  2. Kết hợp chứng chỉ và khóa riêng vào một tệp trước khi nhập.

    cat certificate.pem privatekey.pem > combined.pem
    

    Điều này sẽ dẫn đến một tập tin giống như định dạng dưới đây.

    BEGIN GIẤY CHỨNG NHẬN
    ...
    KẾT THÚC
    BEGIN KHÓA RIÊNG RSA
    ...
    KẾT THÚC RSA KẾT THÚC

  3. Nhập chứng chỉ & khóa chính đã ký vào kho lưu trữ khóa Java hiện có:

    keytool -import -trustcacerts -alias yourdomain -file combined.pem -keystore yourkeystore.jks
    

2
Phiên bản nào của keytool cho phép bạn xâu chuỗi như thế này? Cú pháp này đưa ra "lỗi keytool: java.lang.Exception: Chứng chỉ chưa được nhập, bí danh <root> đã tồn tại" với cả -import và -importcert
ctpenrose

Khó nói, chính xác. Nhưng với năm / tháng, nó có khả năng là Java 6? (Không có ý tưởng phát hành nhỏ.) Bạn đang sử dụng phiên bản nào? Lỗi đọc giống như vấn đề có thể xảy ra với chính kho khóa. ( alias <root> already exists) Bạn có thể thử với một kho khóa mới, trống không?
Aaron Copley

1
Keytool sẽ không cho phép tôi nhập chứng chỉ bằng cách sử dụng bí danh 'root'. Nhưng tôi nghĩ đó là một lỗi đánh máy. Thật thú vị khi lưu ý rằng keytool tạo ra một chuỗi cho chính chứng chỉ của bạn khi nó tìm thấy chứng chỉ của người ký trong kho khóa (dưới bất kỳ bí danh nào). Công cụ Java "Portecle" tiện dụng để quản lý kho khóa java.
Houtman

Keytool không hoạt động như thế này và không cho phép bạn nhập bí danh nhiều lần như mô tả. (Và vâng, tôi đã thử). Xem câu trả lời của senajqerib dưới đây để biết một cái gì đó hoạt động đúng.
Steve Sether

1
Đó là một câu trả lời ba năm tuổi. Hoàn toàn có thể mọi thứ đã thay đổi, nhưng tôi đảm bảo với bạn rằng nó đã hoạt động (hoặc gần hoạt động như tôi đã chỉ ra rằng nó có thể không hoàn hảo) kể từ tháng 2 năm 2013. Xin vui lòng gửi một chỉnh sửa hoặc gắn cờ cho sự chú ý của người điều hành.
Aaron Copley

42

Ghép tất cả các tệp * .pem thành một tệp pem, như all.pem Sau đó tạo kho khóa ở định dạng p12 với khóa riêng + all.pem

openssl pkcs12 -export -inkey private.key -in all.pem -name test -out test.p12

Sau đó xuất p12 vào jks

keytool -importkeystore -srckeystore test.p12 -srcstoretype pkcs12 -destkeystore test.jks

Cảm ơn bạn. Đây là câu trả lời duy nhất đầy đủ và chính xác. Như bạn đã đề xuất, việc ghép các certs vào một tập tin sẽ dễ dàng hơn nhiều.
Steve Sether

Điều này làm việc như một điều trị cho tôi !! Tôi đã sử dụng các hướng dẫn này để chuyển đổi một chuỗi các khóa được sử dụng trong kho lưu trữ ví dụ chứng chỉ nodejs-tự ký tên để nói chuyện với máy chủ TLS dựa trên Java. Cảm ơn rất nhiều!
Galder Zamarreño

Đây là câu trả lời chính xác.
sfThomas

8

keytool không cung cấp cách nhập chứng chỉ + khóa riêng từ một tệp (kết hợp), như đề xuất ở trên. Nó chạy tốt, nhưng chỉ có chứng chỉ được nhập, trong khi khóa riêng bị bỏ qua. Bạn có thể kiểm tra nó bằng cách keytool -list -v -keystore yourkeystore.jks- loại mục nhập tên miền của bạn là TrustedCertEntry, không phải PrivateKeyEntry.

Vì vậy, để giải quyết vấn đề ban đầu, trước tiên, bạn nên tạo kho khóa PKCS # 12 bằng cách sử dụng openssl (hoặc công cụ tương tự), sau đó nhập kho khóa với keytool -importkeystore.

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.