Làm cách nào để nhập chứng chỉ .cer vào kho khóa java?


226

Trong quá trình phát triển ứng dụng khách dịch vụ web Java, tôi gặp phải một vấn đề. Xác thực cho dịch vụ web đang sử dụng chứng chỉ ứng dụng khách, tên người dùng và mật khẩu. Chứng chỉ ứng dụng khách tôi nhận được từ công ty đằng sau dịch vụ web có .cerđịnh dạng. Khi tôi kiểm tra tệp bằng trình soạn thảo văn bản, nó có các nội dung sau:

-----BEGIN CERTIFICATE-----
[Some base64 encoded data]
-----END CERTIFICATE-----

Tôi có thể nhập tệp này dưới dạng chứng chỉ trong Internet Explorer (mà không phải nhập mật khẩu!) Và sử dụng tệp đó để xác thực với dịch vụ web.

Tôi đã có thể nhập chứng chỉ này vào kho lưu trữ khóa bằng cách tước dòng đầu tiên và dòng cuối cùng, chuyển đổi sang dòng mới unix và chạy giải mã cơ sở64. Tệp kết quả có thể được nhập vào kho khóa (sử dụng keytoollệnh). Khi tôi liệt kê các mục trong kho khóa, mục này thuộc loại trustedCertEntry. Do loại mục nhập này (?), Tôi không thể sử dụng chứng chỉ này để xác thực với dịch vụ web. Tôi bắt đầu nghĩ rằng chứng chỉ được cung cấp là chứng chỉ công cộng đang được sử dụng để xác thực ...

Một cách giải quyết mà tôi đã tìm thấy là nhập chứng chỉ trong IE và xuất nó dưới dạng .pfxtệp. Tập tin này có thể được tải dưới dạng kho khóa và có thể được sử dụng để xác thực với dịch vụ web. Tuy nhiên tôi không thể mong đợi khách hàng của mình thực hiện các bước này mỗi khi họ nhận được chứng chỉ mới. Vì vậy, tôi muốn tải .certệp trực tiếp vào Java. Có suy nghĩ gì không?

Thông tin bổ sung: công ty đằng sau dịch vụ web nói với tôi rằng nên yêu cầu chứng chỉ (sử dụng IE & trang web) từ PC và người dùng sẽ nhập chứng chỉ sau.

Câu trả lời:


317
  • Nếu bạn muốn xác thực bạn cần khóa riêng - không có tùy chọn nào khác.
  • Chứng chỉ là khóa công khai có các thuộc tính bổ sung (như tên công ty, quốc gia, ...) được ký bởi một số cơ quan Chứng nhận đảm bảo rằng các thuộc tính đính kèm là đúng.
  • .CERtập tin là chứng chỉ và không có khóa riêng. Khóa riêng được cung cấp với một .PFX keystoretập tin bình thường. Nếu bạn thực sự xác thực là vì bạn đã nhập khóa riêng.
  • Bạn thường có thể nhập .CERchứng chỉ mà không gặp vấn đề gì với

    keytool -importcert -file certificate.cer -keystore keystore.jks -alias "Alias" 

3
Hóa ra khóa riêng đang được tạo bởi một plugin cho IE. Giải pháp duy nhất bây giờ là nhập chứng chỉ trong IE và xuất tệp .pfx.
Jan-Pieter

5
Các tập tin .CER có khóa công khai. Họ không có khóa riêng. Đề nghị chỉnh sửa ..
KyleM

6
-Alias ​​làm gì ở đây?
nhảy

5
:( -> lỗi keytool: java.lang.Exception: Nhập không phải là chứng chỉ X.509
necromancer

1
@hop Một kho khóa java có thể có nhiều chứng chỉ, mỗi chứng chỉ có một bí danh khác nhau để nhận dạng nó. Bạn có thể sử dụng nó làm tài liệu tham khảo để xác định nó và / hoặc để lấy nó theo cách lập trình bằng tên bí danh.
lujop 15/2/2015

85

Nhập .certệp chứng chỉ được tải xuống từ trình duyệt (mở url và đào chi tiết) vào kho khóa của cacerts để java_home\jre\lib\securitylàm việc cho tôi, trái ngược với các mục đích để tạo và sử dụng kho khóa của riêng tôi.

  1. Đi đến của bạn java_home\jre\lib\security
  2. ( Windows ) Mở dòng lệnh quản trị viên ở đó bằng cách sử dụng cmdCTRL+ SHIFT+ENTER
  3. Chạy keytool để nhập chứng chỉ:
    • (Thay thế yourAliasNamepath\to\certificate.certương ứng)

 ..\..\bin\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias yourAliasName -file path\to\certificate.cer

Theo cách này, bạn không phải chỉ định bất kỳ tùy chọn JVM bổ sung nào và chứng chỉ phải được JRE công nhận.


đường dẫn \ đến \ cert. Nếu tập tin của tôi ở trên máy tính để bàn, làm thế nào tôi có thể đường dẫn nó? C: / người dùng / máy tính để bàn / hoặc ../../../../desktop/filename
Jesse

trên MacOS / Linux lệnh này hoạt động với sudo. Cảm ơn. nhưng thông số noprompt là gì? Tôi đã không sử dụng nó và vẫn thành công.
Evgeniy Mishustin

Lưu ý rằng khi sử dụng JDK để phát triển, đường dẫn chính xác là java_home\jdk_x.xx\jre\lib\security Đối với đường dẫn tuyệt đối sử dụng dấu gạch chéo ngược, ví dụ: "C:\myCert.crt"Dấu ngoặc kép là tùy chọn nếu đường dẫn không chứa khoảng trắng.
jp-jee

Cảm ơn một triệu lần.
vikingsteve

Câu hỏi: Điều gì về khóa riêng? Các cuộc thảo luận là về chứng chỉ khách hàng. Hiểu biết của tôi là người ta cần tạo CSR bằng khóa riêng, sau đó nhận chứng chỉ ứng dụng khách từ công ty trang web từ xa và sau đó khớp chứng chỉ ứng dụng khách với khóa riêng. Câu trả lời của bạn dường như không đề cập bất cứ điều gì về khóa riêng. Chỉ cần hỏi.
dùng2367418

51

Đây là mã tôi đã sử dụng để nhập các tệp .cer theo chương trình vào KeyStore mới.

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
//VERY IMPORTANT.  SOME OF THESE EXIST IN MORE THAN ONE PACKAGE!
import java.security.GeneralSecurityException;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;

//Put everything after here in your function.
KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(null);//Make an empty store
InputStream fis = /* insert your file path here */;
BufferedInputStream bis = new BufferedInputStream(fis);

CertificateFactory cf = CertificateFactory.getInstance("X.509");

while (bis.available() > 0) {
    Certificate cert = cf.generateCertificate(bis);
    trustStore.setCertificateEntry("fiddler"+bis.available(), cert);
}

20

Bạn không cần phải thực hiện bất kỳ thay đổi nào đối với chứng chỉ. Bạn có chắc là bạn đang chạy đúng lệnh nhập?

Các công việc sau đây cho tôi:

keytool -import -alias joe -file mycert.cer -keystore mycerts -storepass changeit

nơi mycert.cer chứa:

-----BEGIN CERTIFICATE-----
MIIFUTCCBDmgAwIBAgIHK4FgDiVqczANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
...
RLJKd+SjxhLMD2pznKxC/Ztkkcoxaw9u0zVPOPrUtsE/X68Vmv6AEHJ+lWnUaWlf
zLpfMEvelFPYH4NT9mV5wuQ1Pgurf/ydBhPizc0uOCvd6UddJS5rPfVWnuFkgQOk
WmD+yvuojwsL38LPbtrC8SZgPKT3grnLwKu18nm3UN2isuciKPF2spNEFnmCUWDc
MMicbud3twMSO6Zbm3lx6CToNFzP
-----END CERTIFICATE-----

2
Khi tôi cố gắng nhập chứng chỉ chưa sửa đổi vào kho khóa, tôi gặp lỗi "lỗi keytool: java.lang.Exception: Nhập không phải là chứng chỉ X.509". Sau khi sửa đổi chứng chỉ theo cách tôi đã mô tả trong bài đăng của mình, tôi có thể nhập chứng chỉ mà không gặp lỗi với lệnh tương tự như của bạn. Tuy nhiên, nó được nhập dưới dạng TrustedCertEntry và không được sử dụng khi truy cập dịch vụ web.
Jan-Pieter

Bạn có thể vui lòng thêm lệnh ngoại lệ cho câu hỏi? Bạn có chắc chắn rằng bạn đang chỉ định một bí danh trong lệnh nhập của bạn?
dogbane

Đừng quên chạy cmd với tư cách quản trị viên nếu bạn đang sử dụng Windows
SilentBob470

9

Một công cụ GUI nguồn mở có sẵn tại keystore-explorer.org

KeyStore Explorer

KeyStore Explorer là một thay thế GUI nguồn mở cho các tiện ích dòng lệnh Java và keytool và jarsigner. KeyStore Explorer trình bày chức năng của họ và hơn thế nữa, thông qua giao diện người dùng đồ họa trực quan.

Màn hình sau đây sẽ giúp (họ đến từ trang web chính thức)

Màn hình mặc định mà bạn nhận được bằng cách chạy lệnh:

shantha@shantha:~$./Downloads/kse-521/kse.sh

nhập mô tả hình ảnh ở đây

Và đi đến ExamineExamine a URLtùy chọn và sau đó cung cấp URL web mà bạn muốn nhập.

Cửa sổ kết quả sẽ như dưới đây nếu bạn cung cấp liên kết trang web google. nhập mô tả hình ảnh ở đây

Đây là một trong các trường hợp sử dụng và phần còn lại tùy thuộc vào người dùng (tất cả các khoản tín dụng vào keystore-explorer.org )


7

Chứng chỉ mà bạn đã có có thể là chứng chỉ của máy chủ hoặc chứng chỉ được sử dụng để ký chứng chỉ của máy chủ. Bạn sẽ cần nó để máy khách dịch vụ web của bạn có thể xác thực máy chủ.

Nhưng nếu thêm bạn cần thực hiện xác thực ứng dụng khách với SSL, thì bạn cần phải có chứng chỉ của riêng mình, để xác thực ứng dụng khách dịch vụ web của bạn. Đối với điều này, bạn cần phải tạo một yêu cầu chứng chỉ; quá trình này bao gồm việc tạo khóa riêng của bạn và khóa chung tương ứng và đính kèm khóa chung đó cùng với một số thông tin của bạn (email, tên, tên miền, v.v.) vào một tệp được gọi là yêu cầu chứng chỉ. Sau đó, bạn gửi yêu cầu chứng chỉ đó đến công ty đã yêu cầu bạn và họ sẽ tạo chứng chỉ của bạn, bằng cách ký khóa công khai của bạn bằng khóa riêng của họ và họ sẽ gửi lại cho bạn một tệp X509 với chứng chỉ của bạn, bạn có thể bây giờ thêm vào kho khóa của bạn và bạn sẽ sẵn sàng kết nối với dịch vụ web bằng SSL yêu cầu xác thực ứng dụng khách.

Để tạo yêu cầu chứng chỉ của bạn, hãy sử dụng "keytool -certreq -alias -file -keypass -keystore". Gửi tệp kết quả cho công ty sẽ ký nó.

Khi bạn lấy lại chứng chỉ của mình, hãy chạy "keytool -importcert -alias -keypass -keystore".

Bạn có thể cần phải sử dụng -storepass trong cả hai trường hợp nếu kho khóa được bảo vệ (đó là một ý tưởng tốt).


5

Đây là một tập lệnh mà tôi đã sử dụng để nhập một loạt các tệp crt trong thư mục hiện tại vào kho khóa java. Chỉ cần lưu nó vào cùng thư mục với chứng chỉ của bạn và chạy nó như vậy:

./import_all_certs.sh

import_all_certs.sh

KEYSTORE="$(/usr/libexec/java_home)/jre/lib/security/cacerts";

function running_as_root()
{
  if [ "$EUID" -ne 0 ]
    then echo "NO"
    exit
  fi

  echo "YES"
}

function import_certs_to_java_keystore
{
  for crt in *.crt; do 
    echo prepping $crt 
    keytool -import -file $crt -storepass changeit -noprompt --alias alias__${crt} -keystore $KEYSTORE
    echo 
  done
}

if [ "$(running_as_root)" == "YES" ]
then
  import_certs_to_java_keystore
else
  echo "This script needs to be run as root!"
fi

1

Đây là cách làm việc này đối với tôi:

  1. Lưu dưới dạng .txt dữ liệu chứng chỉ theo định dạng sau trong trình soạn thảo văn bản

    ----- CHỨNG NHẬN BEGIN ----- [dữ liệu được tuần tự hóa bởi microsoft] ----- CHỨNG NHẬN KẾT THÚC -----

  2. Mở trình duyệt chrome (bước này cũng có thể hoạt động với các trình duyệt khác) cài đặt> hiển thị cài đặt nâng cao> HTTPS / SSL> quản lý chứng chỉ Nhập .txt trong bước 1
  3. Chọn và xuất chứng chỉ đó ở định dạng được mã hóa Base-64. Lưu nó dưới dạng .cer
  4. Bây giờ bạn có thể sử dụng keytool hoặc Portecle để nhập nó vào kho khóa java của bạ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.