נקודת הקצה SOCKS מביאה אותך לאתר. עמית ה-TLS בתוך החיבור הזה הוא האתר עצמו, לכן העבר את שם המארח של היעד למפעל השקעים המרובד:

String destination = "example.com";
int destinationPort = 443;
Proxy proxy = new Proxy(
    Proxy.Type.SOCKS,
    new InetSocketAddress("127.0.0.1", 1080)
);

try (Socket transport = new Socket(proxy)) {
    transport.connect(
        InetSocketAddress.createUnresolved(destination, destinationPort),
        5000
    );
    SSLSocketFactory factory =
        (SSLSocketFactory) SSLSocketFactory.getDefault();
    try (SSLSocket tls = (SSLSocket) factory.createSocket(
            transport, destination, destinationPort, true)) {
        SSLParameters parameters = tls.getSSLParameters();
        parameters.setEndpointIdentificationAlgorithm("HTTPS");
        tls.setSSLParameters(parameters);
        tls.setSoTimeout(15000);
        tls.startHandshake();
        // Send the application's HTTPS request through tls.
    }
}

הקטע מניח ייבוא סטנדרטי של Java networking ו-TLS, תצורת אמון ברירת מחדל קיימת וחיבור SOCKS שאינו דורש אישורי פרוקסי. הוא מבצע את לחיצת היד; היישום עדיין צריך לשלוח בקשת HTTP בפורמט שהשרת מצפה לו. עבור יעדי HTTPS ציבוריים בנתיבים ציבוריים מותרים, רשימת פרוקסי SOCKS מציעה נקודות קצה מועמדות; התאם את גרסת השרת ואת תמיכת שמות המארח לנתיב השקע הזה ב-Java.

קרא את שתי הזהויות בדוגמה

127.0.0.1:1080 היא נקודת הקצה של הפרוקסי, נגישה מתהליך ה-Java הזה. destination ו-destinationPort מזהים את האתר. createUnresolved שומר על שם המארח הזה עבור נתיב SOCKS במקום לפתור אותו מוקדם בצד הלקוח.

ה-createSocket המרובד מקבל את זהות היעד. setEndpointIdentificationAlgorithm("HTTPS") מבקש במפורש את בדיקות שם המארח שלו. אמון בשרשרת האישורים של SSLSocket גולמי אינו מוכיח כשלעצמו שאימות שם המארח מופעל. החלפת שם הפרוקסי או ה-loopback כדי לדכא אי-התאמה עלולה לאמת את נקודת הקצה הלא נכונה.

שמור על אמון וניקוי בשלבים שלהם

מפעל ברירת המחדל משתמש בסידור האמון המוגדר של ה-JVM. יישום עם דרישות פרטיות יכול להשתמש במקום זאת במפעל ה-SSLContext שלו, שהותחל כראוי. בחירה זו נפרדת מנתיב SOCKS; מנהל אמון שמקבל כל אישור אינו מתקן שם עמית שגוי.

דחיית SOCKS מתרחשת לפני TLS; אישור לא מהימן או שם מארח שגוי נכשל במהלך TLS; לאחר מכן עשויה לבוא שגיאת HTTP. התחברות לפרוקסי מאשרת את בקשת המנהרה ולא מאמתת את האתר שבתוכה.

סגירת השקע המרובד כאשר סגירה אוטומטית מופעלת סוגרת את התעבורה שלו. היקף המשאב החיצוני סוגר גם הוא את התעבורה אם העטיפה או לחיצת היד נכשלות לפני השלמה רגילה.

מאמרים קשורים