ฉันใช้ Java 6 และกำลังพยายามสร้างHttpsURLConnection
กับเซิร์ฟเวอร์ระยะไกลโดยใช้ใบรับรองไคลเอ็นต์
เซิร์ฟเวอร์กำลังใช้ใบรับรองหลักที่ลงนามด้วยตนเองและกำหนดให้แสดงใบรับรองไคลเอ็นต์ที่ป้องกันด้วยรหัสผ่าน ฉันได้เพิ่มใบรับรองรูทเซิร์ฟเวอร์และใบรับรองไคลเอ็นต์ไปยังที่เก็บคีย์จาวาเริ่มต้นซึ่งฉันพบใน/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/security/cacerts
(OSX 10.5) ชื่อของไฟล์ที่เก็บคีย์ดูเหมือนจะแนะนำว่าใบรับรองไคลเอ็นต์ไม่ควรอยู่ในนั้น?
อย่างไรก็ตามการเพิ่มใบรับรองหลักในร้านค้านี้ช่วยแก้ปัญหาที่น่าอับอาย javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed' problem.
อย่างไรก็ตามตอนนี้ฉันติดขัดเกี่ยวกับวิธีใช้ใบรับรองไคลเอ็นต์ ฉันได้ลองสองวิธีแล้วและไม่ทำให้ฉันไปไหนเลย
อันดับแรกและที่ต้องการลอง:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
URL url = new URL("https://somehost.dk:3049");
HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
conn.setSSLSocketFactory(sslsocketfactory);
InputStream inputstream = conn.getInputStream();
// The last line fails, and gives:
// javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
ฉันได้ลองข้ามคลาส HttpsURLConnection (ไม่เหมาะเพราะฉันต้องการคุย HTTP กับเซิร์ฟเวอร์) และทำสิ่งนี้แทน:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("somehost.dk", 3049);
InputStream inputstream = sslsocket.getInputStream();
// do anything with the inputstream results in:
// java.net.SocketTimeoutException: Read timed out
ฉันไม่แน่ใจด้วยซ้ำว่าใบรับรองไคลเอ็นต์เป็นปัญหาที่นี่