Օգտագործեք նպատակակետի ինքնությունը Java TLS-ի համար SOCKS-ով
Նախ միացե՛ք SOCKS-ով, ապա շերտավորե՛ք SSLSocket՝ կայքի հոսթանվամբ և HTTPS վերջնակետի բացահայտ ստուգումներով։
SOCKS վերջնակետը ձեզ հասցնում է կայք։ Այդ կապի ներսում TLS գործընկերը հենց կայքն է, ուստի փոխանցե՛ք նպատակակետի հոսթանունը շերտավորված socket ֆաբրիկային․
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 socket ուղուն։
Կարդացե՛ք օրինակի երկու ինքնությունները
127.0.0.1:1080 պրոքսի վերջնակետն է՝ հասանելի այս Java գործընթացից։ destination և destinationPort նույնականացնում են կայքը։ createUnresolved պահպանում է այդ հոսթանունը SOCKS ուղու համար՝ փոխարենը հաճախորդում վաղաժամ լուծելու։
Շերտավորված createSocket ստանում է նպատակակետի ինքնությունը։ setEndpointIdentificationAlgorithm("HTTPS") բացահայտ պահանջում է իր հոսթանվի ստուգումները։ Հում SSLSocket-ի վկայագրաշղթայի վստահությունը ինքնին չի հաստատում, որ հոսթանվի ստուգումը միացված է։ Պրոքսի անվան կամ loopback-ի փոխարինումը՝ անհամապատասխանությունը ճնշելու համար, կարող է վավերացնել սխալ վերջնակետը։
Պահե՛ք վստահությունն ու մաքրումը իրենց փուլերում
Լռելյայն ֆաբրիկան օգտագործում է JVM-ի կարգավորված վստահության կարգը։ Մասնավոր պահանջներ ունեցող հավելվածը կարող է փոխարենը օգտագործել իր պատշաճ նախաձեռնված SSLContext ֆաբրիկան։ Այդ ընտրությունը առանձին է SOCKS երթուղուց․ բոլոր վկայագրերն ընդունող վստահության կառավարիչը չի ուղղում սխալ գործընկերոջ անունը։
SOCKS մերժումը տեղի է ունենում TLS-ից առաջ․ անվստահելի վկայագիրը կամ սխալ հոսթանունը ձախողվում է TLS-ի ընթացքում․ դրանից հետո կարող է հետևել HTTP սխալ։ Պրոքսի մուտքը լիազորում է թունելի հարցումը, այլ ոչ թե վավերացնում դրա ներսում գտնվող կայքը։
Շերտավորված socket-ի փակումը՝ ավտոմատ փակումը միացված վիճակում, փակում է դրա տրանսպորտը։ Արտաքին ռեսուրսի շրջանակը նույնպես փակում է այդ տրանսպորտը, եթե փաթաթումը կամ ձեռքսեղմումը ձախողվում են նորմալ ավարտից առաջ։