از هویت مقصد برای Java TLS روی SOCKS استفاده کنید
ابتدا از طریق SOCKS متصل شوید، سپس یک SSLSocket با نام میزبان وبسایت و بررسیهای صریح نقطه پایانی HTTPS لایهبندی کنید.
نقطه پایانی 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.
}
}این قطعه واردسازیهای استاندارد شبکه و TLS جاوا، پیکربندی اعتماد پیشفرض موجود و اتصال SOCKS بدون اعتبارنامه پروکسی را فرض میکند. دستدادن را انجام میدهد؛ برنامه هنوز باید یک درخواست HTTP در قالب مورد انتظار سرور بفرستد. برای مقصدهای عمومی HTTPS روی مسیرهای عمومی مجاز، فهرست پروکسیهای SOCKS نقاط پایانی نامزد ارائه میدهد؛ نسخه سرور و پشتیبانی نام میزبان را با این مسیر سوکت جاوا تطبیق دهید.
دو هویت را در مثال بخوانید
127.0.0.1:1080 نقطه پایانی پروکسی است که از این فرآیند جاوا قابل دسترسی است. destination و destinationPort وبسایت را شناسایی میکنند. createUnresolved آن نام میزبان را برای مسیر SOCKS نگه میدارد و آن را از پیش روی کلاینت تفکیک نمیکند.
createSocket لایهبندیشده هویت مقصد را دریافت میکند. setEndpointIdentificationAlgorithm("HTTPS") صریحاً بررسیهای نام میزبان آن را درخواست میکند. اعتماد زنجیره گواهی یک SSLSocket خام بهخودیخود ثابت نمیکند که تأیید نام میزبان فعال است. جایگزین کردن نام پروکسی یا loopback برای سرکوب عدمتطابق میتواند نقطه پایانی نادرست را احراز کند.
اعتماد و پاکسازی را همراه با مرحلههایشان نگه دارید
کارخانه پیشفرض از ترتیب اعتماد پیکربندیشده JVM استفاده میکند. برنامهای با نیازهای خصوصی میتواند بهجای آن از کارخانه SSLContext که بهدرستی مقداردهی شده است استفاده کند. این انتخاب از مسیر SOCKS جداست؛ مدیر اعتمادی که هر گواهی را میپذیرد نام همتای نادرست را اصلاح نمیکند.
رد SOCKS پیش از TLS رخ میدهد؛ گواهی نامعتبر یا نام میزبان نادرست در طول TLS شکست میخورد؛ سپس ممکن است خطای HTTP رخ دهد. ورود به پروکسی درخواست تونل را مجاز میکند، نه احراز هویت وبسایت درون آن.
بستن سوکت لایهبندیشده با بستن خودکار فعال، انتقال آن را میبندد. دامنه منابع بیرونی نیز اگر بستهبندی یا دستدادن پیش از تکمیل عادی شکست بخورد، آن انتقال را میبندد.