ข้อผิดพลาด Java Keytool หลังจากนำเข้าใบรับรอง“ ข้อผิดพลาด keytool: java.io.FileNotFoundException & Access Denied”


131

ฉันกำลังพยายามเชื่อมต่อ Java Web API ผ่าน HTTPS อย่างไรก็ตามมีข้อยกเว้นเกิดขึ้น:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException

ฉันทำตามขั้นตอนเหล่านี้ซึ่งฉันได้เรียนรู้จากบทเรียนออนไลน์ keytool และใบรับรอง SSL:

  1. ฉันคัดลอก URL HTTPS ลงในเบราว์เซอร์ดาวน์โหลดใบรับรอง SSL และติดตั้งในเบราว์เซอร์โดยใช้ Internet Explorer

  2. ส่งออกใบรับรองไปยังเส้นทางบนคอมพิวเตอร์ของฉันใบรับรองถูกบันทึกเป็น .cer

  3. ใช้ตัวเลือกการนำเข้าของ keytool คำสั่งด้านล่างดำเนินการโดยไม่มีข้อผิดพลาดใด ๆ

    keytool -import -alias downloadedCertAlias -keystore C:\path\to\my\keystore\cacerts.file -file C:\path\of\exportedCert.cer
  4. ฉันได้รับแจ้งให้ใส่รหัสผ่านที่พรอมต์คำสั่งซึ่งฉันป้อนแล้วฉันได้รับการรับรองความถูกต้อง

  5. cmdหน้าต่างพิมพ์ข้อมูลใบรับรองบางและลายเซ็นและผมได้รับแจ้งมีคำถาม:

    เชื่อถือใบรับรองนี้ไหม

    ฉันตอบว่าใช่

  6. พร้อมต์ cmd ปรากฏขึ้น

    เพิ่มใบรับรองในที่เก็บคีย์แล้ว

    อย่างไรก็ตามหลังจากข้อความนั้นมีข้อยกเว้นอื่นปรากฏขึ้น:

    keytool error: java.io.FileNotFoundException: C:\Program files\...\cacerts <Access Denied>

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

(javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException)

คุณสามารถโพสต์keytoolคำสั่งที่แน่นอนที่คุณได้ดำเนินการและเป็นผลลัพธ์ได้หรือไม่? ปัญหาที่ชัดเจนบางประการที่นี่คือ-keystoreข้อโต้แย้งที่พิมพ์ผิดและข้อเท็จจริงที่ว่า keytool ไม่พบที่เก็บคีย์เพื่อนำเข้าคีย์
Alex

ฉันตั้งใจจะเขียน: keytool -import -alias downloadCertAlias ​​-keystore C: \ path \ to \ my \ keystore \ cacerts.file -file C: \ path \ of \ exportCert.cer ฉันยังพูดถึงคำสั่งที่ดำเนินการโดยไม่มีข้อผิดพลาดดังนั้นเห็นได้ชัดว่า นี่เป็นเพียงการสะกดผิดในคำถามของฉัน !!! ขอบคุณอย่างไรก็ตาม
cyber101

คำตอบ:


270

สิ่งนี้อาจเกิดขึ้นได้หากคุณไม่ได้เรียกใช้พรอมต์คำสั่งในโหมดผู้ดูแลระบบ หากคุณใช้ windows 7 คุณสามารถไปที่ run พิมพ์ cmd แล้วกด Ctrl + Shift + enter เพื่อเปิดพรอมต์คำสั่งในโหมดผู้ดูแลระบบ หากไม่เป็นเช่นนั้นคุณสามารถไปที่ start -> all programs -> accessories -> คลิกขวา command prompt แล้วคลิก 'run as administrator'


10
สำหรับผู้ใช้ Mac sudo แบบธรรมดาจะแก้ไขปัญหานี้ได้
truthful_ness

14
การทำงานในฐานะผู้ดูแลระบบไม่ใช่วิธีแก้ปัญหาที่ถูกต้อง บริษัท ส่วนใหญ่กำลังปิดกั้นการเข้าถึงของผู้ดูแลระบบ ดีกว่าที่จะแก้ไขสาเหตุว่าทำไมการเข้าถึงจึงถูกปฏิเสธแทนที่จะยกระดับความเหนือกว่า
skword

พิมพ์ cmd และกด Ctrl + Shift + ป้อนและเพิ่มใบรับรอง successfully- มันทำงานให้ฉัน
หมดหนทาง

ขอบคุณ Control-shift CMD เป็นวิธีเดียวที่ฉันสามารถเปลี่ยนที่เก็บ cacerts ได้
Malcolm Boekhoff

@Afshar ขอบคุณมากที่ฉันดิ้นรนกับเรื่องนี้มานานมาก
Rajan Chauhan

22

ฉันมีปัญหาเดียวกันใน Windows และสามารถแก้ไขได้โดยเรียกใช้ cmd.exe ในฐานะผู้ดูแลระบบ (คลิกขวาในเมนูเริ่มจากนั้นคลิก "Run as administrator)


20

ฉันประสบปัญหาเดียวกันขณะนำเข้าใบรับรองในที่เก็บคีย์ภายใน เมื่อใดก็ตามที่ฉันออกคำสั่ง keytool ฉันได้รับข้อผิดพลาดต่อไปนี้

ใบรับรองถูกเพิ่มในข้อผิดพลาด keytool keystore: java.io.FileNotFoundException: C: \ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security (การเข้าถึงถูกปฏิเสธ)

วิธีแก้ปัญหาต่อไปนี้ทำงานให้ฉัน

1) ตรวจสอบให้แน่ใจว่าคุณกำลังเรียกใช้พรอมต์คำสั่งใน Rus เป็นโหมดผู้ดูแลระบบ

2) เปลี่ยนไดเร็กทอรีปัจจุบันของคุณเป็น% JAVA_HOME% \ jre \ lib \ security

3) จากนั้นออกคำสั่งด้านล่าง

keytool -import -alias "mycertificatedemo" -file "C: \ Users \ name \ Downloads \ abc.crt" -keystore cacerts

3) เปลี่ยนรหัสผ่าน

4) ป้อน y

5) คุณจะเห็นข้อความต่อไปนี้เกี่ยวกับ "Certificate was added to keystore" ที่ประสบความสำเร็จ

ตรวจสอบให้แน่ใจว่าคุณให้ค่าพารามิเตอร์" cacerts " ใน -keystore เท่านั้นเนื่องจากฉันให้เส้นทางแบบเต็มเช่น "C **: \ Program Files \ Java \ jdk1.8.0_151 \ jre \ lib \ security **"

หวังว่าจะได้ผล


1
เป็นที่กล่าวถึงที่นี่เป็นจริงในไดเรกทอรีรักษาความปลอดภัยและเพียงให้ "cacerts" ชื่อของใบรับรองแทนเส้นทางแบบเต็มเป็นสิ่งที่ทำงานสำหรับฉัน
riseTide

ฉันใช้ sudo -i เพื่อทำให้ตัวเองเป็น superuser ในขั้นตอนแรกบน Mac และทำตามขั้นตอนแล้วมันก็ใช้ได้ ฉันเปิดไฟล์ carets เป็นไฟล์ข้อความและพบใบรับรองของฉันโดยทำคำสั่ง f เพื่อค้นหาชื่อ (หรือสิ่งอื่นใดที่เกี่ยวข้องกับใบรับรอง)
Chigozie A.

13

ตรวจสอบสิทธิ์การเขียนบนที่เก็บคีย์


2
หากใครสามารถขยายได้เพียงตรวจสอบสิทธิ์จะไม่เปลี่ยนแปลงอะไร
user3071284

การตั้งค่าไดเรกทอรี tomcat เป็นแบบอ่านอย่างเดียวจะทำให้เกิดข้อยกเว้น
svarog

วิธีการตรวจสอบสิทธิ์ weite?
Ahmad Arslan

4

สำหรับผู้ใช้ Mac ตรวจสอบให้แน่ใจว่าได้ sudo และเมื่อได้รับแจ้งก่อนให้ป้อนรหัสผ่านผู้ดูแลระบบของคุณและตามด้วยรหัสผ่านที่เก็บคีย์ซึ่งโดยทั่วไปควรเป็น "changeit" เว้นแต่คุณจะเปลี่ยนจริง


2

หากคุณใช้ windows8:

  1. คลิกปุ่มเริ่ม
  2. ในกล่องค้นหาพิมพ์ command prompt
  3. จากผลที่ได้คลิกขวาและคลิกcommand prompt Run as administratorจากนั้นรันคำสั่ง keytool

2

คุณสามารถให้สิทธิ์ตัวเองในการแก้ไขปัญหานี้

คลิกขวาที่ cacerts> เลือกคุณสมบัติ> เลือกแท็บ Securit> อนุญาตการอนุญาตทั้งหมดกับชื่อกลุ่มและผู้ใช้ทั้งหมด

สิ่งนี้ได้ผลสำหรับฉัน


0

ฉันเรียกใช้พรอมต์คำสั่งในฐานะผู้ดูแลระบบ แต่มันไม่ได้ผลสำหรับฉันด้วยข้อผิดพลาดด้านล่าง

'keytool' is not recognized as an internal or external command,
 operable program or batch file.

หากเส้นทางไปยัง keytool ไม่ได้อยู่ใน System paths ของคุณคุณจะต้องใช้เส้นทางแบบเต็มเพื่อใช้ keytool ซึ่งก็คือ

C:\Program Files\Java\jre<version>\bin

ดังนั้นคำสั่งควรเป็นอย่างไร

"C:\Program Files\Java\jre<version>\bin\keytool.exe" -importcert -alias certificateFileAlias -file CertificateFileName.cer -keystore cacerts

ที่เหมาะกับฉัน


0

ฉันได้รับข้อผิดพลาดนี้เช่นกันแม้ว่าฉันจะเรียกใช้ cmd ในฐานะผู้ดูแลระบบ

สาเหตุที่แท้จริงคือไฟล์มาจาก VCS (การโค่นล้มการบังคับใช้ ฯลฯ ) และเมื่อฉันตรวจสอบคุณสมบัติของไฟล์นี้ "แอตทริบิวต์เป็นแบบอ่านอย่างเดียว )

ดังนั้นวิธีแก้ปัญหาคือ:

  • (1) ปิดใช้งานแอตทริบิวต์ 'อ่านอย่างเดียว'
  • (2) ตรวจสอบจาก VCS ปล่อยให้ไฟล์อยู่ภายใต้สถานะอ่านและเขียน


-2

คุณสามารถจัดเก็บดิสก์หรือเส้นทางอื่น ๆ (ไม่ใช่ C) EX: D \

C:\Program Files\Java\jre1.8.0_101\bin>keytool -genkey -alias server -keyalg RSA -keysize 2048 -keystore D:\myserver.jks -dname "CN=myserver,OU=IT-WebDev, O=TIACHOP, L=HCM, ST=0753, C=VN" && keytool -certreq -alias server -file D:\myserver.csr -keystore D:\myserver.jks

ใส่คำอธิบายภาพที่นี่

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