Làm cách nào để nhập đúng chứng chỉ tự gán vào kho khóa Java có sẵn cho tất cả các ứng dụng Java theo mặc định?


144

Tôi muốn nhập chứng chỉ tự ký vào Java để bất kỳ ứng dụng Java nào cố gắng thiết lập kết nối SSL sẽ tin tưởng chứng chỉ này.

Cho đến nay, tôi đã nhập được vào

keytool -import -trustcacerts -noprompt -storepass changeit -alias $REMHOST -file $REMHOST.pem
keytool -import -trustcacerts -noprompt -keystore cacerts -storepass changeit -alias $REMHOST -file $REMHOST.pem

Tuy nhiên, khi tôi cố chạy HTTPSClient.classtôi vẫn nhận được:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: xây dựng đường dẫn PKIX không thành công: sun.security.provider.certpath.SunCertPathBuilderException: không thể tìm thấy đường dẫn chứng nhận hợp lệ đến mục tiêu được yêu cầu

Tôi không nhất thiết phải dựa vào mã đó. Những thứ như Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider())là hoàn toàn không cần thiết trong phần đầu tiên. Thứ hai không làm bất kỳ xác minh chứng nhận. Hãy thử với một đồng bằng URLConnectionđể bắt đầu với. Bạn có chắc bạn đã sửa đổi cacertstrong lib/securitycài đặt JRE của bạn? Bạn đã thử trustmanagertùy chọn gỡ lỗi chưa?
Bruno

Câu trả lời:


225

Trên Windows cách dễ nhất là sử dụng portecle chương trình .

  1. Tải về và cài đặt portecle.
  2. Trước tiên hãy chắc chắn 100% rằng bạn biết JRE hoặc JDK nào đang được sử dụng để chạy chương trình của bạn. Trên Windows 7 64 bit, có thể có khá nhiều JRE. Process Explorer có thể giúp bạn điều này hoặc bạn có thể sử dụng:System.out.println(System.getProperty("java.home"));
  3. Sao chép tệp JAVA_HOME \ lib \ security \ cacerts sang thư mục khác.
  4. Trong Portecle, nhấp vào Tệp> Mở tệp kho khóa
  5. Chọn tập tin cacerts
  6. Nhập mật khẩu này: thay đổi
  7. Nhấp vào Công cụ> Nhập Chứng chỉ tin cậy
  8. Duyệt tìm tập tin mycert ve.pem
  9. Nhấp vào Nhập
  10. Nhấn OK để cảnh báo về đường dẫn tin cậy.
  11. Nhấn OK khi nó hiển thị chi tiết về chứng chỉ.
  12. Nhấp vào Có để chấp nhận chứng chỉ là đáng tin cậy.
  13. Khi nó yêu cầu bí danh, nhấp OK và nhấp OK lần nữa khi thông báo đã nhập chứng chỉ.
  14. Nhấp vào để lưu. Đừng quên điều này hoặc thay đổi bị loại bỏ.
  15. Sao chép các tập tin trở lại nơi bạn tìm thấy nó.

Trên Linux:

Bạn có thể tải xuống chứng chỉ SSL từ một máy chủ web đã sử dụng nó như thế này:

$ echo -n | openssl s_client -connect www.example.com:443 | \
   sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/examplecert.crt

Tùy chọn xác minh thông tin chứng chỉ:

$ openssl x509 -in /tmp/examplecert.crt -text

Nhập chứng chỉ vào kho khóa Java:

$ keytool -import -trustcacerts -keystore /opt/java/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias mycert -file /tmp/examplecert.crt

1
Ý tưởng chính từ đây không phải là portecle mà là nhập chứng chỉ vào kho khóa bên phải.
Alfabravo

Điều này đã làm việc, nhưng java của tôi đã ở một địa điểm khác. Kho khóa của tôi được đặt tại / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts mà tôi tìm thấy bằng cách chạy ps -ef | grep javacho tôi biết java của tôi đang chạy từ openjdk nằm ở / usr / lib / jvm / java-openjdk / thùng / java. Ngoài ra, nếu điều này nếu cho một ứng dụng web hãy nhớ khởi động lại. Cảm ơn đã giúp đỡ!!
Codezilla

7
Tôi chưa sử dụng portecle, nhưng tôi thấy Keystore Explorer hoạt động khá tốt cho Windows, Linux, (và nó cũng hoạt động trên OSX)
Xantix 7/8/2015

Thực sự rất hữu ích. 2 điều rất quan trọng được nhấn mạnh ở đây. Một là về nhập khẩu trong kho khóa bên phải. Và một điều nữa là đảm bảo khởi động lại trong trường hợp máy chủ web.
sdm

6
Vào năm 2019, chúng tôi thậm chí có thể nhận được chứng chỉ SSL miễn phí bằng cách sử dụng các dịch vụ như Mã hóa cho phép
Ferrybig

41
    D:\Java\jdk1.5.0_10\bin\keytool -import -file "D:\Certificates\SDS services\Dev\dev-sdsservices-was8.infavig.com.cer" -keystore "D:\Java\jdk1.5.0_10\jre\lib\security\cacerts" -alias "sds certificate"

12
Bạn sẽ được nhắc nhập mật khẩu lưu trữ khóa, mặc định là "thay đổi"
Gilbert Arenas Dagger

34

Cuối cùng tôi đã viết một tập lệnh nhỏ có thêm chứng chỉ vào các kho khóa, vì vậy nó dễ sử dụng hơn nhiều.

Bạn có thể nhận phiên bản mới nhất từ https://github.com/ssbarnea/keytool-trust

#!/bin/bash
# version 1.0
# https://github.com/ssbarnea/keytool-trust
REMHOST=$1
REMPORT=${2:-443}

KEYSTORE_PASS=changeit
KEYTOOL="sudo keytool"

# /etc/java-6-sun/security/cacerts

for CACERTS in  /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts \
    /usr/lib/jvm/java-7-oracle/jre/lib/security/cacerts \
    "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/lib/security/cacerts" \
    "/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib/security/cacerts"
do

if [ -e "$CACERTS" ]
then
    echo --- Adding certs to $CACERTS

# FYI: the default keystore is located in ~/.keystore

if [ -z "$REMHOST" ]
    then
    echo "ERROR: Please specify the server name to import the certificatin from, eventually followed by the port number, if other than 443."
    exit 1
    fi

set -e

rm -f $REMHOST:$REMPORT.pem

if openssl s_client -connect $REMHOST:$REMPORT 1>/tmp/keytool_stdout 2>/tmp/output </dev/null
        then
        :
        else
        cat /tmp/keytool_stdout
        cat /tmp/output
        exit 1
        fi

if sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' </tmp/keytool_stdout > /tmp/$REMHOST:$REMPORT.pem
        then
        :
        else
        echo "ERROR: Unable to extract the certificate from $REMHOST:$REMPORT ($?)"
        cat /tmp/output
        fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT >/dev/null
    then
    echo "Key of $REMHOST already found, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

if $KEYTOOL -list -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -keystore "$CACERTS" >/dev/null
    then
    echo "Key of $REMHOST already found in cacerts, skipping it."
    else
    $KEYTOOL -import -trustcacerts -noprompt -keystore "$CACERTS" -storepass ${KEYSTORE_PASS} -alias $REMHOST:$REMPORT -file /tmp/$REMHOST:$REMPORT.pem
    fi

fi

done

`` `


18

Điều này làm việc cho tôi. :)

sudo keytool -importcert -file filename.cer -alias Randomaliasname -keystore $ JAVA_HOME / jre / lib / security / cacerts -storepass changeit 

4

Nếu bạn đang sử dụng chứng chỉ được ký bởi Cơ quan cấp chứng chỉ không được bao gồm trong tệp trích dẫn Java theo mặc định, bạn cần hoàn tất cấu hình sau cho các kết nối HTTPS. Để nhập chứng chỉ vào cacerts:

  1. Mở Windows Explorer và điều hướng đến tệp cacerts, được đặt trong thư mục con jre \ lib \ security nơi AX Core Client được cài đặt. Vị trí mặc định là C: \ Chương trình tập tin \ Phần mềm ACL \ Máy khách lõi AX \ jre \ lib \ security
  2. Tạo một bản sao lưu của tập tin trước khi thực hiện bất kỳ thay đổi.
  3. Tùy thuộc vào chứng chỉ bạn nhận được từ Tổ chức phát hành chứng chỉ bạn đang sử dụng, bạn có thể cần nhập chứng chỉ trung gian và / hoặc chứng chỉ gốc vào tệp trích dẫn. Sử dụng cú pháp sau để nhập chứng chỉ: keytool -import -alias -keystore -trustcacerts -file
  4. Nếu bạn đang nhập cả hai chứng chỉ, bí danh được chỉ định cho mỗi chứng chỉ sẽ là duy nhất.
  5. Nhập mật khẩu cho kho khóa tại dấu nhắc mật khẩu của mật khẩu và nhấn Enter. Mật khẩu Java mặc định cho tệp cacerts là Thay đổi trực tuyến. Nhập 'y' tại Tin tưởng vào giấy chứng nhận này? nhắc nhở và nhấn Enter.

Sử dụng lệnh này: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <cert_filename>
Bharat Darakh

1

Lệnh đơn giản 'keytool' cũng hoạt động trên Windows và / hoặc với Cygwin.

NẾU bạn đang sử dụng Cygwin ở đây là lệnh đã sửa đổi mà tôi đã sử dụng từ cuối câu trả lời "S.Botha's":

  1. đảm bảo bạn xác định JRE bên trong JDK mà bạn sẽ sử dụng
  2. Bắt đầu lời nhắc / cygwin của bạn với tư cách quản trị viên
  3. đi vào bên trong thư mục bin của JDK đó, ví dụ cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. Thực hiện lệnh keytool từ bên trong nó, nơi bạn cung cấp đường dẫn đến Chứng chỉ mới của bạn ở cuối, như vậy:

    ./keytool.exe -import -trustcacerts -keystore ../lib/security/cacerts  -storepass changeit -noprompt -alias myownaliasformysystem -file "D:\Stuff\saved-certs\ca.cert"

Lưu ý, bởi vì nếu điều này nằm dưới Cygwin, bạn sẽ đưa ra một đường dẫn đến chương trình không phải là Cygwin, vì vậy đường dẫn này giống như DOS và được trích dẫn.


0

Có thể muốn thử

keytool -import -trustcacerts -noprompt -keystore <full path to cacerts> -storepass changeit -alias $REMHOST -file $REMHOST.pem

Tôi thực sự không biết nó đặt chứng chỉ của bạn ở đâu nếu bạn chỉ viết cacertschỉ cho nó một đường dẫn đầy đủ


0

cài đặt chứng chỉ trong java linux

/ opt / jdk (phiên bản) / bin / keytool -import -alias aliasname -file cert.cer -keystore cacerts -storepass password


0
fist get the certificate from the provider
create a file ends wirth .cer and pase the certificate

copy the text file or  past   it  somewhere you can access it 
then use the cmd prompt as an admin and cd to the bin of the jdk,
the cammand that will be used is the:  keytool 

change the  password of the keystore with :

keytool  -storepasswd -keystore "path of the key store from c\ and down"

the password is : changeit 
 then you will be asked to enter the new password twice 

then type the following :

keytool -importcert -file  "C:\Program Files\Java\jdk-13.0.2\lib\security\certificateFile.cer"   -alias chooseAname -keystore  "C:\Program Files\Java\jdk-13.0.2\lib\security\cacerts"
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.