ฉันจะทราบได้อย่างไรว่า JVM ของฉันใช้ที่เก็บคีย์ใด


125

ฉันต้องการนำเข้าใบรับรองไปยังที่เก็บคีย์ JVM ของฉัน ฉันใช้สิ่งต่อไปนี้:

keytool -import -alias daldap -file somecert.cer

ดังนั้นฉันอาจต้องเปลี่ยนคำเรียกของฉันเป็น:

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit

1
คุณต้องนำเข้าใบรับรองไปยัง JVM truststoreของคุณเว้นแต่จะเป็น CSR ที่ลงนามซึ่งในกรณีนี้คุณควรนำเข้าในที่เก็บคีย์ของคุณเองและคุณต้องรู้อยู่แล้วว่าอยู่ที่ไหนมิฉะนั้นคุณจะไม่สามารถสร้าง คู่กุญแจหรือ CSR
Marquis of Lorne

คำตอบ:


129

ที่เก็บคีย์ของคุณจะอยู่ในJAVA_HOME---> JRE -->lib---> security--> cacertsไฟล์. คุณต้องตรวจสอบว่า JAVA_HOME ของคุณได้รับการกำหนดค่าไว้ที่ใดซึ่งอาจเป็นหนึ่งในสถานที่เหล่านี้

  1. คอมพิวเตอร์ ---> ขั้นสูง -> ตัวแปรสภาพแวดล้อม ---> JAVA_HOME

  2. ไฟล์แบตช์เริ่มต้นเซิร์ฟเวอร์ของคุณ

ในคำสั่ง import -keystore cacerts ของคุณ (ให้เส้นทางแบบเต็มไปยัง JRE ด้านบนที่นี่แทนที่จะพูดเฉพาะ cacerts)


6
/ Library / Java / Home / lib / security / cacerts บน Mac OS X 10.9
Sam Barnum

9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" หมายเหตุ "s" ในตอนท้ายสำหรับผู้อ่านในอนาคตเท่านั้น
Keir Nellyer

4
ดังนั้นหากฉันติดตั้ง Java เวอร์ชันใหม่และ JAVA_HOME กำลังชี้ไปที่ไดเร็กทอรีใหม่ฉันจะมีปัญหาเกี่ยวกับใบรับรองหรือไม่?
Kirill Yunussov

1
@KirillYunussov: หากคุณติดตั้งใบรับรองใด ๆ ลงใน JRE เก่าคุณจะต้องนำเข้าใบรับรองเดียวกันไปยัง JRE ใหม่ด้วย
kosa

4
นี่คือตำแหน่งร้านค้าที่เชื่อถือได้มากกว่าที่ตั้งร้านค้าหลักที่ฉันคิด
user2001850

36

ที่ตั้ง Keystore

คำสั่ง keytool แต่ละคำสั่งมี-keystoreตัวเลือกสำหรับระบุชื่อและตำแหน่งของไฟล์ที่เก็บคีย์ถาวรสำหรับที่เก็บคีย์ที่จัดการโดย keytool โดยค่าเริ่มต้นที่เก็บคีย์จะถูกเก็บไว้ในไฟล์ที่มีชื่อ.keystoreในโฮมไดเร็กทอรีของผู้ใช้ตามที่กำหนดโดยคุณสมบัติระบบ "user.home" กำหนดชื่อผู้ใช้ uName ค่าคุณสมบัติ "user.home" จะมีค่าเริ่มต้นเป็น

C:\Users\uName on Windows 7 systems
C:\Winnt\Profiles\uName on multi-user Windows NT systems
C:\Windows\Profiles\uName on multi-user Windows 95 systems
C:\Windows on single-user Windows 95 systems

ดังนั้นหากชื่อผู้ใช้คือ "cathy" ค่าเริ่มต้น "user.home" จะเป็น

C:\Users\cathy on Windows 7 systems
C:\Winnt\Profiles\cathy on multi-user Windows NT systems
C:\Windows\Profiles\cathy on multi-user Windows 95 systems

http://docs.oracle.com/javase/1.5/docs/tooldocs/windows/keytool.html


1
ฉันกำลังค้นหา~/.keystoreไฟล์ลึกลับนี้อยู่! หากฉันปิด-keystoreพารามิเตอร์ไว้ฉันไม่สามารถทราบได้ว่าkeytoolการกำหนดเป้าหมายที่เก็บคีย์เริ่มต้นใด ฉันเอาแต่มองหาที่cacertsอื่นบนเครื่อง ฉันไม่ได้คาดหวังว่า keytool จะสร้าง~/.keystoreในโฮมไดเร็กทอรีหรือตั้งชื่อ.keystoreแทนcacerts. คุณได้กรอกข้อมูลในช่องว่างที่ชาว Java ควรทำเอกสาร! ขอบคุณ!
George Pantazes

26

Mac OS X 10.12 พร้อม Java 1.8:

$ JAVA_HOME / JRE / lib / การรักษาความปลอดภัย

cd $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

จากนั้นมันอยู่ใน:

./jre/lib/security

ฉันมีที่เก็บคีย์ cacerts อยู่ที่นั่น

ในการระบุสิ่งนี้เป็นตัวเลือก VM:

-Djavax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit

ฉันไม่ได้บอกว่านี่เป็นวิธีที่ถูกต้อง (ทำไม java ถึงไม่รู้ว่าจะดูใน JAVA_HOME?) แต่นี่คือสิ่งที่ฉันต้องทำเพื่อให้มันใช้งานได้


16

คุณสามารถพบได้ในไดเรกทอรี "Home" ของคุณ:

ใน Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

บน Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore

4
ฉันไม่มีไดเรกทอรีนี้บน windows
simgineer

1
ฉันทำ -keygen โดยไม่ได้ระบุที่เก็บคีย์โดยคาดหวังว่ามันจะสร้างขึ้นมาในไดเร็กทอรีปัจจุบัน แต่มันสร้างขึ้นในบ้านของฉันตามที่คุณพูด ~ / .keystore หาไม่เจอมานานแล้ว! :-) ขอบคุณ
Eurospoofer

ให้ฉันเพิ่มว่าภายใต้ cygwin เส้นทางของ windows ถูกใช้เนื่องจากคุณสมบัติ java user.homeเท่ากับ$HOMEDRIVE$HOMEPATHกำหนดโดย windows และไม่ได้$HOMEกำหนดโดย cygwin ที่ไหนHOMEDRIVE=C:และHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042

13

สิ่งนี้ใช้ได้กับฉัน:

#! / bin / ทุบตี

CACERTS = $ (readlink -e $ (dirname $ (readlink -e $ (ซึ่ง keytool))) /../ lib / security / cacerts)= $ ( readlink - e $ ( dirname $ ( readlink - e $ ( ซึ่ง keytool ))) /../ lib / security / cacerts )

ถ้า keytool -list -keystore $ CACERTS -storepass changeit> / dev / null; แล้วก็ถ้าkeytool - list - keystore $ CACERTS - storepass changeit > / dev / null ; แล้วก็  
    echo $ CACERTS
อื่นอื่น
    echo 'ไม่พบไฟล์ cacerts' > & 2'ไม่พบไฟล์ cacerts' > & 2 
    ทางออก 11
FiFi

สำหรับ Linux เท่านั้น Solaris ของฉันไม่มีลิงก์สำหรับอ่าน ในที่สุดฉันก็ใช้ Perl-Script นี้:

#! / usr / bin / env perl
ใช้อย่างเข้มงวดใช้อย่างเข้มงวด;
ใช้คำเตือนใช้คำเตือน;
ใช้ Cwd qw (realpath);ใช้Cwd qw ( realpath ); 
$ _ = realpath ((grep {-x && -f} map {"$ _ / keytool"} แยก (':', $ ENV {PATH})) [0]);= realpath (( grep {- x && - f } map { "$ _ / keytool" } แยก( ':' , $ ENV { PATH })) [ 0 ]); 
die "ไม่พบ keytool" เว้นแต่จะกำหนด $ _;die "ไม่พบ keytool" เว้นแต่จะกำหนด $ _ ;  
$ keytool ของฉัน = $ _;$ keytool ของฉัน= $ _ ;
พิมพ์ "Using '$ keytool'. \ n";พิมพ์"Using '$ keytool'. \ n" ; 
S / keytool $ //;/ keytool $ / /;
$ _ = realpath ($ _. '../lib/security/cacerts');lib / ความปลอดภัย/ cacerts ');
die "ไม่พบ cacerts" เว้นแต่ -f $ _;
$ cacerts ของฉัน = $ _;
พิมพ์ "นำเข้าสู่ '$ cacerts' \ n";$ cacerts '. \ n ";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "ไม่สามารถอ่าน key container" เว้นแต่ $? == 0;
ออกหาก $ ARGV [0] eq '-d';- ';
foreach (@ARGV) {
    ใบรับรอง $ ของฉัน = $ _;
    s /\.[^.]+$//;
    $ นามแฝงของฉัน = $ _;
    พิมพ์ "การนำเข้า '$ cert' เป็น '$ alias' \ n";$ cert 'เป็น' $ alias '. \ n ";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    เตือน "ไม่สามารถนำเข้าใบรับรอง: $?" เว้นแต่ $? == 0;
}

6

ตามที่ DimtryB กล่าวถึงโดยค่าเริ่มต้นที่เก็บคีย์จะอยู่ภายใต้ไดเร็กทอรีผู้ใช้ แต่ถ้าคุณพยายามอัปเดตcacertsไฟล์เพื่อให้ JVM สามารถเลือกคีย์ได้คุณจะต้องอัปเดตcacertsไฟล์ภายใต้jre/lib/security. คุณยังสามารถดูคีย์ได้โดยดำเนินการคำสั่งkeytool -list -keystore cacertsเพื่อดูว่ามีการเพิ่มใบรับรองของคุณหรือไม่


ยินดีที่ได้ทราบว่าคำสั่ง keytool จะเพิ่มlib/securityเส้นทางที่ถูกต้องโดยอัตโนมัติหากได้รับเฉพาะชื่อญาติ
สิ้นสุด

1
-importcertแต่นี้จะไม่ทำงาน คำสั่ง list แสดงใบรับรองทั้งระบบ แต่คำสั่ง import จะสร้างไฟล์ใหม่ในไดเร็กทอรีปัจจุบัน
เลิก

1
updatedb; locate cacertsช่วยในการค้นหาตำแหน่งการติดตั้งของไฟล์ cacerts
sjas

5

ใน Debian โดยใช้ openjdk เวอร์ชัน "1.8.0_212" ฉันพบ cacerts ที่นี่:

 /etc/ssl/certs/java/cacerts

แน่นอนว่าจะมีประโยชน์หากมีคำสั่งมาตรฐานที่จะพิมพ์เส้นทางนี้


2

สำหรับฉันโดยใช้อิมเมจ Docker OpenJDK 12 อย่างเป็นทางการตำแหน่งของที่เก็บคีย์ Java คือ:

/usr/java/openjdk-12/lib/security/cacerts

นั่นคือ Truststore ไม่ใช่ Keystore
Marquis of Lorne

2
อันดับแรก: หากคุณอ่านคำถามอย่างละเอียด (และความคิดเห็นของคุณเอง) ดูเหมือนว่า Truststore ซึ่งควรนำเข้าใบรับรอง ประการที่สองความแตกต่างระหว่าง Truststore และ Keystore นั้นค่อนข้างสับสน - และทั้งคู่ใช้คำว่า "Keystore" btw เนื่องจากใช้รูปแบบทั้งคู่ สาม: หากคุณดูคำสั่งนำเข้าkeytool -import -file example.crt -alias exampleCA -keystore truststore.jksคุณก็ใช้พารามิเตอร์ด้วย-keystore... IMHO ค่อนข้างไม่ชัดเจน และสุดท้าย แต่ไม่ท้ายสุด: ฉันกำลังค้นหาเกี่ยวกับปัญหานั้น - และพบว่าเป็นคำถามนั้น บางทีคนอื่นประสบการณ์เดียวกัน
jonashackt

นอกจากนี้คำตอบอื่น ๆ ทั้งหมดยังอ้างถึงสิ่งที่เรียกว่า "Truststore" ที่ JDK ใช้ในการตรวจสอบความถูกต้อง คุณได้ลงคะแนนคำตอบอื่น ๆ ทั้งหมดด้วยหรือไม่? ฉันได้รับการโหวตเพิ่มคะแนนแล้วดังนั้นคำตอบของฉันก็ช่วยได้แล้ว
jonashackt

0

เราพบปัญหานี้ใน Tomcat ที่ทำงานจากไดเร็กทอรี jre ซึ่ง (เกือบทั้งหมด) ถูกลบออกหลังจากการอัปเดต jre อัตโนมัติดังนั้น jre ที่ทำงานอยู่จะไม่พบ jre ... / lib / security / cacerts อีกต่อไปเนื่องจากไม่มีอยู่แล้ว

การรีสตาร์ท Tomcat (หลังจากเปลี่ยนการกำหนดค่าเพื่อเรียกใช้จากตำแหน่ง jre อื่น) แก้ไขปัญหาได้


0

นอกเหนือจากคำตอบทั้งหมดข้างต้น:

หากการอัพเดตไฟล์ cacerts ในไดเร็กทอรี JRE ไม่ได้ผลให้ลองอัปเดตใน JDK

C: \ Program Files \ Java \ jdk1.8.0_192 \ jre \ lib \ security

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