วิธีควบคุมขอบเขต SSLContext

ถ้าฉันใช้รหัสต่อไปนี้เพราะฉันต้องการ เช่น เปลี่ยนวิธีการตรวจสอบใบรับรอง

trm = ผู้จัดการความน่าเชื่อถือบางคน

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

จากนั้นจะเป็นการตั้งค่า SSLContext สำหรับการเชื่อมต่อ https ทั้งหมดที่จะเกิดขึ้นในอนาคตโดยไม่คำนึงถึงเธรดใด วิธีที่สะอาดที่สุดในการควบคุมขอบเขตคืออะไรเพื่อที่ฉันจะได้ตั้งค่าเฉพาะสำหรับการโทรที่ฉันต้องการเท่านั้น


person che javara    schedule 17.05.2011    source แหล่งที่มา


คำตอบ (1)


คุณสามารถตั้งค่าโรงงานซ็อกเก็ตบนวัตถุการเชื่อมต่อจริงที่คุณต้องการใช้ร้านค้าที่เชื่อถือได้นี้:

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(sc.getSocketFactory());

ทำอย่างนั้นแทนการเรียกใช้ setDefaultSSLSocketFactory

person laz    schedule 17.05.2011
comment
ขอบคุณที่ดูเหมือนว่ามันควรจะได้ผล แต่คุณรู้วิธีอื่นใดที่ไม่ต้องการให้คุณรับอินสแตนซ์ของ HttpsURLConnection หรือไม่ - person che javara; 17.05.2011
comment
คุณไม่ได้ใช้ HTTP ใช่หรือไม่? การเชื่อมต่อประเภทใดที่ใช้ซ็อกเก็ต SSL? - person laz; 17.05.2011
comment
@che javara คุณจะได้รับ HttpsURLConnection ทุกครั้งที่คุณใช้ HTTPS URL ใน Java มันไม่ใช่ขั้นตอนพิเศษ คำถามของคุณไม่สมเหตุสมผล - person user207421; 18.05.2011
comment
สมมติว่าฉันใช้เฟรมเวิร์กการส่งข้อความระดับสูงกว่าที่ใช้ http ใต้หน้าปก ดังนั้นฉันจึงไม่สามารถเข้าถึงโดยตรงเพื่อแก้ไขอินสแตนซ์ HttpsURLConnection - person che javara; 18.05.2011
comment
คุณจะต้องพึ่งพากลไกของเฟรมเวิร์กนั้นในการจัดหาโรงงานซ็อกเก็ตทางเลือก หากกรอบงานไม่เปิดเผยรายละเอียดเหล่านั้น คุณจะต้องอาศัยการตั้งค่าส่วนกลาง ในกรณีดังกล่าว คุณสามารถจัดเตรียมคลาสย่อย TrustManager ที่ดำเนินการเฉพาะลักษณะการทำงานที่แตกต่างกันบนโฮสต์ที่เลือก และถอยกลับไปเป็น TrustManager ดั้งเดิมสำหรับโฮสต์อื่นๆ ทั้งหมด - person laz; 18.05.2011
comment
คำตอบที่ยอดเยี่ยม Iaz ฉันกำลังโน้มตัวไปทางนั้น แต่ด้วยเหตุผลบางอย่างที่คิดว่ามีวิธีการระดับโลกที่ 'สะอาดกว่า' - person che javara; 18.05.2011