วิธีแก้: jno_key_entry

Sep 02 2020

ฉันมีไฟล์ต่อไปนี้ที่สร้างโดย Sectigo:

  1. XXX1.pem
  2. XXX1.key
  3. XXX1.csr
  4. XXX1.crt
  5. XXX1.ca

ฉันใช้ Zulu JDK 11.0.8 และ SpringBoot 2.2.0 บน windows สิ่งที่ฉันพยายามทำคือเปิดใช้ https ในแอป SpringBoot

นี่คือคุณสมบัติ ssl ในไฟล์คุณสมบัติ SpringBoot:

server.ssl.key-store-type=JKS
server.ssl.key-store=XX1.jks
server.ssl.key-store-password=password
server.ssl.key-alias=tomcat

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

keytool -import -alias tomcat -file XXX1.crt -keystore XX1.jks -storepass password

เมื่อเรียกใช้แอพฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1008) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.catalina.core.StandardService.addConnector(StandardService.java:227) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    ... 17 common frames omitted
Caused by: java.lang.IllegalArgumentException: jsse.alias_no_key_entry
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:218) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1124) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1210) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:586) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.catalina.connector.Connector.startInternal(Connector.java:1005) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    ... 19 common frames omitted
Caused by: java.io.IOException: jsse.alias_no_key_entry
    at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:328) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ~[tomcat-embed-core-9.0.27.jar:9.0.27]
    ... 25 common frames omitted

มีความคิดอะไรที่ฉันทำผิด?

ขอขอบคุณ

คำตอบ

1 dave_thompson_085 Sep 02 2020 at 08:00

TLDR: คุณต้องมีคีย์ส่วนตัว

แม้ว่าเรามักจะพูดกันอย่างหลวม ๆ เกี่ยวกับเซิร์ฟเวอร์ SSL / TLS ที่มีหรือใช้ 'ใบรับรอง' ในความเป็นจริงมันไม่ได้ต้องการแค่ใบรับรอง แต่ต้องใช้คีย์ส่วนตัวที่เกี่ยวข้อง (เสมอ) และใบรับรอง CA ระดับกลางที่เกี่ยวข้อง (โดยปกติ แต่อาจขึ้นอยู่กับ CA และ / หรือไคลเอนต์) keytool -importเป็นนามแฝง-importcertที่นำเข้าใบรับรองหรือเชนเท่านั้น สิ่งนี้อาจเพิ่มใบรับรอง / chain ให้กับprivateKeyEntry ที่มีมาก่อนหรือสร้าง trustCertEntry ในกรณีของคุณที่เก็บคีย์ของคุณยังไม่มีคีย์ส่วนตัวดังนั้น keytool จึงสร้าง trustCertEntry ซึ่งเป็นสาเหตุที่ Tomcat บ่นว่านามแฝงที่กำหนดค่าไว้คือ 'no_key_entry' นั่นคือเป็น TrustCertEntry ซึ่งไม่เพียงพอใช้ไม่ได้และไม่ถูกต้องไม่ใช่ a privateKeyEntry ตามความจำเป็นและจำเป็น

ค้นหา 'แปลง PEM เป็น Java keystore' หรือ 'แปลง PEM เป็น JKS' (และอาจจะ 'แปลง PEM เป็น PKCS12' ด้วย) และคุณจะพบคำถามหลายร้อยคำถามที่ถามในช่วงทศวรรษที่ผ่านมาโดยมีคำตอบที่แท้จริงสองแบบให้เลือกมากมาย :

  1. หากคุณมีหรือได้รับ OpenSSL ให้ใช้openssl pkcs12 -exportเพื่อรวมไฟล์รูปแบบใบรับรองคีย์ส่วนตัวและเชน (CA) ให้เป็นไฟล์รูปแบบ PKCS12 Modern Java (ตั้งแต่ปี 2017) สามารถใช้ PKCS12 โดยตรงเป็นที่เก็บคีย์ได้เสมอ บางครั้งเวอร์ชันที่เก่ากว่าสามารถทำได้ แต่บางครั้งคุณต้องแปลง PKCS12 เป็น JKS ด้วยkeytool -importkeystore(not -import[cert]) และคำตอบที่เก่ากว่านั้นแสดงถึงข้อกำหนดในอดีตนั้น หากจำเป็นคุณสามารถย้ายหรือคัดลอกไฟล์รูปแบบ PEM ไปยังเครื่องอื่นที่มีความปลอดภัยเพียงพอและมี OpenSSL จากนั้นย้ายหรือคัดลอก PKCS12 กลับ

    OpenSSL เป็นมาตรฐานสำหรับ Linux เกือบทั้งหมดและ Unixes อื่น ๆ อีกมากมาย แต่ไม่ใช่ Windows คุณสามารถดาวน์โหลดได้สำหรับ Windows จากหลายแหล่งที่ฉันพิจารณาhttp://slproweb.com/products/Win32OpenSSL.html การบำรุงรักษาที่ดีที่สุด

  2. ดาวน์โหลดและใช้KeyStore Explorer ที่