แก้ไข: -พยายามจัดรูปแบบคำถามและคำตอบที่ยอมรับได้ในแบบที่เป็นไปได้มากขึ้นที่บล็อกของฉัน
นี่คือปัญหาดั้งเดิม
ฉันได้รับข้อผิดพลาดนี้:
ข้อความรายละเอียด sun.security.validator.ValidatorException: การสร้างเส้นทาง PKIX ล้มเหลว:
sun.security.provider.certpath.SunCertPathBuilderException: ไม่สามารถค้นหาเส้นทางการรับรองที่ถูกต้องไปยังเป้าหมายที่ร้องขอสาเหตุ javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: การสร้างเส้นทาง PKIX ล้มเหลว: sun.security.provider.certpath.SunCertPathBuilderException: ไม่สามารถค้นหาเส้นทางการรับรองที่ถูกต้องไปยังเป้าหมายที่ร้องขอ
ฉันใช้ Tomcat 6 เป็นเว็บเซิร์ฟเวอร์ ฉันมี HTTPS เว็บแอปพลิเคชั่นสองตัวติดตั้งบน Tomcats ที่แตกต่างกันบนพอร์ตที่ต่างกัน แต่ในเครื่องเดียวกัน พูดและApp1(port 8443)
เชื่อมต่อกับ เมื่อเชื่อมต่อกับฉันได้รับข้อผิดพลาดดังกล่าว ฉันรู้ว่านี่เป็นข้อผิดพลาดที่พบบ่อยมากดังนั้นจึงพบกับโซลูชันมากมายในฟอรัมและไซต์ต่างๆ ฉันมีรายการด้านล่างในTomcats ทั้งสอง:App2(port 443)
App1
App2
App1
App2
server.xml
keystoreFile="c:/.keystore"
keystorePass="changeit"
ทุกไซต์บอกเหตุผลเดียวกันว่าใบรับรองที่กำหนดโดย app2 ไม่ได้อยู่ในร้านค้าที่เชื่อถือได้ของ app1 jvm สิ่งนี้ดูเหมือนจะเป็นจริงเช่นกันเมื่อฉันพยายามกด URL เดียวกันในเบราว์เซอร์ IE ใช้งานได้ (เมื่ออุ่นขึ้นมีปัญหากับใบรับรองความปลอดภัยของเว็บไซต์นี้ที่นี่ฉันพูดต่อไปที่เว็บไซต์นี้) แต่เมื่อไคลเอนต์จาวา URL เดียวกันถูกโจมตี (ในกรณีของฉัน) ฉันได้รับข้อผิดพลาด ดังนั้นเพื่อวางไว้ใน truststore ฉันลองทั้งสามตัวเลือก:
ตัวเลือกที่ 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
ตัวเลือก 2 การตั้งค่าด้านล่างในตัวแปรสภาพแวดล้อม
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
ตัวเลือก 3 การตั้งค่าด้านล่างในตัวแปรสภาพแวดล้อม
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
แต่ไม่มีอะไรทำงาน
สิ่งที่ทำงานล่าสุด คือการเรียกใช้วิธีการ Java ที่แนะนำในวิธีการจัดการใบรับรอง SSL ที่ไม่ถูกต้องกับ Apache HttpClient โดย Pascal Thivent คือการใช้งานโปรแกรม InstallCert
แต่วิธีนี้ใช้ได้สำหรับการตั้งค่า devbox แต่ฉันไม่สามารถใช้งานได้ในสภาพแวดล้อมการผลิต
ฉันกำลังสงสัยว่าทำไมสามวิธีดังกล่าวข้างต้นไม่ได้ทำงานเมื่อผมได้กล่าวถึงค่าเดียวกันในserver.xml
ของapp2
เซิร์ฟเวอร์เดียวกันค่าใน truststore โดยการตั้งค่า
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
ใน app1
โปรแกรม
สำหรับข้อมูลเพิ่มเติมนี่คือวิธีที่ฉันทำการเชื่อมต่อ:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
ในเซิร์ฟเวอร์ RHEL ของฉันปัญหาก็หายไป หวังว่าจะช่วยใครซักคน