วิธีอิมพอร์ตใบรับรองที่ลงนามเองอย่างถูกต้องไปยังที่เก็บคีย์ Java ที่พร้อมใช้งานสำหรับแอ็พพลิเคชัน Java ทั้งหมดโดยดีฟอลต์?


144

ฉันต้องการนำเข้าใบรับรองที่ลงนามด้วยตนเองลงใน Java ดังนั้นแอปพลิเคชัน Java ใด ๆ ที่จะพยายามสร้างการเชื่อมต่อ SSL จะเชื่อถือใบรับรองนี้

จนถึงตอนนี้ฉันพยายามที่จะนำเข้ามัน

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

ถึงกระนั้นเมื่อฉันพยายามที่จะเรียกใช้HTTPSClient.classฉันยังคงได้รับ:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: การสร้างเส้นทาง PKIX ล้มเหลว: sun.security.provider.certpath.SunCertPathBuilderException: ไม่สามารถค้นหาเส้นทางการรับรองที่ถูกต้องไปยังเป้าหมายที่ร้องขอ

ฉันไม่จำเป็นต้องพึ่งพารหัสนั้น สิ่งที่ต้องการSecurity.addProvider(new com.sun.net.ssl.internal.ssl.Provider())ไม่จำเป็นอย่างสมบูรณ์ในส่วนแรก ที่สองไม่ทำการตรวจสอบรับรองใด ๆ ลองใช้แบบธรรมดาURLConnectionเพื่อเริ่มต้นด้วย คุณแน่ใจหรือว่าคุณได้ทำการแก้ไขcacertsในlib/securityการติดตั้ง JRE ของคุณ? คุณลองtrustmanagerตัวเลือกการแก้ไขข้อบกพร่องแล้วหรือยัง
บรูโน่

คำตอบ:


225

ใน Windowsวิธีที่ง่ายที่สุดคือการใช้โปรแกรมportecle

  1. ดาวน์โหลดและติดตั้ง portecle
  2. ก่อนอื่นให้แน่ใจ 100% ว่าคุณรู้ว่า JRE หรือ JDK กำลังใช้งานโปรแกรมใดอยู่ ใน Windows 7 64 บิตอาจมี JREs ไม่กี่ตัว Process Explorer สามารถช่วยคุณในเรื่องนี้หรือคุณสามารถใช้:System.out.println(System.getProperty("java.home"));
  3. คัดลอกไฟล์ JAVA_HOME \ lib \ security \ cacerts ไปยังโฟลเดอร์อื่น
  4. ใน Portecle คลิก File> Open Keystore File
  5. เลือกไฟล์ cacerts
  6. ป้อนรหัสผ่านนี้: changeit
  7. คลิกเครื่องมือ> อิมพอร์ตใบรับรองที่เชื่อถือได้
  8. เรียกดูไฟล์ mycertificate.pem
  9. คลิกนำเข้า
  10. คลิกตกลงสำหรับคำเตือนเกี่ยวกับเส้นทางที่เชื่อถือได้
  11. คลิกตกลงเมื่อมันแสดงรายละเอียดเกี่ยวกับใบรับรอง
  12. คลิกใช่เพื่อยอมรับใบรับรองว่าเชื่อถือได้
  13. เมื่อมีการขอให้นามแฝงคลิกตกลงและคลิกตกลงอีกครั้งเมื่อมันบอกว่ามันได้นำเข้าใบรับรอง
  14. คลิกบันทึก อย่าลืมสิ่งนี้หรือการเปลี่ยนแปลงจะถูกยกเลิก
  15. คัดลอกไฟล์ cacerts กลับไปยังตำแหน่งที่คุณพบ

บน Linux:

คุณสามารถดาวน์โหลดใบรับรอง SSL จากเว็บเซิร์ฟเวอร์ที่ใช้งานอยู่แล้วเช่นนี้:

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

เลือกที่จะตรวจสอบข้อมูลใบรับรอง:

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

อิมพอร์ตใบรับรองไปยังที่เก็บคีย์ Java cacerts:

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

1
แนวคิดหลักจากสิ่งนี้ไม่ใช่ portecle แต่การนำเข้าใบรับรองไปยังที่เก็บคีย์ที่ถูกต้อง
Alfabravo

สิ่งนี้ใช้ได้ แต่ java ของฉันอยู่ในตำแหน่งที่แตกต่าง ที่เก็บคีย์ของฉันตั้งอยู่ที่ / usr / lib / jvm / java-openjdk / jre / lib / security / cacerts ซึ่งฉันพบโดยการใช้งานps -ef | grep javaซึ่งบอกว่า java ของฉันถูกเรียกใช้จาก openjdk ตั้งอยู่ที่ / usr / lib / jvm / java-openjdk / bin / java นอกจากนี้ถ้าเป็นเช่นนี้สำหรับ webapp อย่าลืมรีสตาร์ท ขอบคุณสำหรับความช่วยเหลือ !!
Codezilla

7
ฉันไม่ได้ใช้ portecle แต่ผมพบว่าKeystore Explorer ที่ทำงานสวยดีสำหรับ Windows, Linux (และมันควรจะทำงานใน OSX เช่นกัน)
Xantix

มีประโยชน์มากจริง ๆ 2 สิ่งสำคัญมากที่ไฮไลต์ที่นี่ หนึ่งในนั้นเกี่ยวกับการนำเข้าที่เก็บคีย์ที่ถูกต้อง และอีกอันหนึ่งคือตรวจสอบให้แน่ใจว่าได้รีสตาร์ทในกรณีที่เว็บเซิร์ฟเวอร์
sdm

6
ในปี 2019 เราสามารถรับใบรับรอง SSL ได้ฟรีโดยใช้บริการเช่น Lets เข้ารหัส
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
คุณจะได้รับพร้อมท์สำหรับรหัสผ่านที่เก็บคีย์ค่าเริ่มต้นคือ "changeit"
The Gilbert Arenas Dagger

34

ฉันลงเอยด้วยการเขียนสคริปต์ขนาดเล็กที่เพิ่มใบรับรองไปยังที่เก็บคีย์ดังนั้นจึงใช้งานได้ง่ายกว่ามาก

คุณสามารถรับเวอร์ชันล่าสุดได้จาก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

สิ่งนี้ใช้ได้สำหรับฉัน :)

sudo keytool -importcert -file filename.cer -alias randomaliasname -keystore $ JAVA_HOME / jre / lib / ความปลอดภัย / cacerts - เปลี่ยนแปลงผ่านทางร้านค้า 

4

หากคุณใช้ใบรับรองที่ลงนามโดย Certificate Authority ที่ไม่รวมอยู่ในไฟล์ Java cacerts โดยค่าเริ่มต้นคุณจะต้องดำเนินการกำหนดค่าต่อไปนี้สำหรับการเชื่อมต่อ HTTPS วิธีนำเข้าใบรับรองลงใน cacerts:

  1. เปิด Windows Explorer และไปที่ไฟล์ cacerts ซึ่งอยู่ในโฟลเดอร์ย่อย jre \ lib \ security ที่ติดตั้ง AXE Core Client ตำแหน่งเริ่มต้นคือ C: \ Program Files \ ACL Software \ AX Core Client \ jre \ lib \ security
  2. สร้างสำเนาสำรองของไฟล์ก่อนทำการเปลี่ยนแปลงใด ๆ
  3. ขึ้นอยู่กับใบรับรองที่คุณได้รับจากหน่วยงานออกใบรับรองที่คุณใช้คุณอาจต้องนำเข้าใบรับรองระดับกลางและ / หรือใบรับรองหลักลงในไฟล์ cacerts ใช้ไวยากรณ์ต่อไปนี้เพื่ออิมพอร์ตใบรับรอง: keytool -import -alias -keystore -trustcacerts -file
  4. หากคุณกำลังอิมพอร์ตใบรับรองทั้งสองชื่อแทนที่ระบุสำหรับแต่ละใบรับรองควรไม่ซ้ำกัน
  5. พิมพ์รหัสผ่านสำหรับที่เก็บคีย์ที่พร้อมต์“ รหัสผ่าน” และกด Enter รหัสผ่าน Java เริ่มต้นสำหรับไฟล์ cacerts คือ“ changeit” พิมพ์ 'y' ที่ "เชื่อถือใบรับรองนี้" พรอมต์และกด Enter

ใช้คำสั่งนี้: -> keytool -import -alias <alias> -keystore <cacerts_file> -trustcacerts -file <certificate_filename>
Bharat Darakh

1

คำสั่งง่าย ๆ 'keytool' สามารถใช้งานได้บน Windows และ / หรือกับ Cygwin

หากคุณกำลังใช้ Cygwinนี่คือคำสั่งที่แก้ไขซึ่งฉันใช้จากคำตอบ "S.Botha" ด้านล่าง:

  1. ตรวจสอบให้แน่ใจว่าคุณระบุ JRE ภายใน JDK ที่คุณจะใช้
  2. เริ่มต้นพรอมต์ / cygwin ในฐานะผู้ดูแลระบบ
  3. เข้าไปในไดเรกทอรี bin ของ JDK นั้นเช่น cd / cygdrive / c / Program \ Files / Java / jdk1.8.0_121 / jre / bin
  4. ดำเนินการคำสั่ง keytool จากภายในซึ่งคุณให้เส้นทางไปยัง Cert ใหม่ของคุณในตอนท้ายเช่น:

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

โปรดสังเกตว่าเพราะหากสิ่งนี้อยู่ภายใต้ Cygwin คุณกำลังกำหนดเส้นทางไปยังโปรแกรมที่ไม่ใช่ Cygwin ดังนั้นเส้นทางนั้นเป็นแบบ DOS และอยู่ในเครื่องหมายคำพูด


0

อาจต้องการลอง

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

ฉันคิดไม่ออกว่าใบรับรองของคุณตรงไหนถ้าคุณเพิ่งเขียนcacertsให้เต็มเส้นทาง


0

ติดตั้งใบรับรองใน java linux

/ opt / jdk (เวอร์ชั่น) / bin / keytool -import -alias aliasname -file certificate.cer -keystore cacerts - รหัสผ่านของ storestore


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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.