Tôi đã tạo một ứng dụng Java dựa trên cài đặt http.proxyPort
và http.proxyHost
. Có hai quy trình: Một là chương trình thông thường, chương trình kia là proxy. Tôi có một bộ lắng nghe socket đơn giản chạy trên http.proxyPort
(mà tôi kiểm soát). Nó đơn giản nhưProxy https Java (sử dụng https.proxyPort và https.proxyHost)
while (true) {
try {
Socket connection = server.accept();
Handler handler = new Handler(connection);
handler.start();
} catch (Exception ex) {
ex.printStackTrace();
}
}
Vì vậy, bất cứ khi nào "quá trình 1" làm cho một http request - như
URL yahoo = new URL("http://www.google.ca/");
URLConnection yc = yahoo.openConnection();
System.out.println(yc.getClass().getName());
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
Nó đi qua proxy. Bây giờ nếu khách hàng đang sử dụng giao thức HTTPS thì sao? Thay vào đó, hãy sử dụng https://google.ca
? Có một tài sản https.proxyPort
và https.proxyHost
, nhưng tôi đã cố gắng trong nhiều tháng (trên và tắt, nó không quá quan trọng) mà không có may mắn. Tôi đã đọc một loạt các chủ đề (tôi sẽ liệt kê một số ở cuối để bạn biết tôi đã làm một cái gì đó).
nỗ lực của tôi gần gũi nhất cho đến nay: server
try {
System.setProperty("javax.net.ssl.keyStore", "test.jks");
System.setProperty("javax.net.ssl.keyStorePassword", "2520xe");
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket =
(SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
System.out.println("Ready");
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
InputStream inputstream = sslsocket.getInputStream();
InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
OutputStream toClient = sslsocket.getOutputStream();
toClient.write(("HTTP/1.0 200 Connection established\n" +
"Content-Length: " + "Shut down!".getBytes().length
+ "\r\n").getBytes("utf-8"));
toClient.write("Shut down!".getBytes("utf-8"));
toClient.close();
} catch (Exception exception) {
exception.printStackTrace();
}
Khách hàng
try {
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "9999");
URL yahoo = new URL("https://www.google.ca/");
URLConnection yc = yahoo.openConnection();
System.out.println(yc.getClass().getName());
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
} catch (Exception ex) {
ex.printStackTrace();
}
Và tôi nhận được lỗi này javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
Tôi googled nó, nhưng đã đưa ra một số nội dung email thay thế.
Về cơ bản, tôi cần phải tạo một máy chủ java proxy, đó là thiết lập cho khách hàng bởi các https.proxyPort
và https.proxyHost
cờ, và có thể gửi dữ liệu trở lại để ứng dụng client, mà có thể không được sửa đổi trong bất kỳ cách nào (nó chỉ sử dụng URL connection = new URL("https://...")
)
Một vài trong số các trang web mà tôi đã cố gắng ...
- creating a Java Proxy Server that accepts HTTPS
- http://stilius.net/java/java_ssl.php
- Có một cái gì đó khác về việc Java chấp nhận tất cả các chứng chỉ, nhưng tôi không thể tìm thấy bất kỳ liên kết nào. Tôi có mã, nhưng tôi gặp phải nhiều lỗi hơn những gì tôi đang làm ngay bây giờ, nhưng tôi có thể bao gồm nó nếu nó giúp (tôi không ban đầu vì đây là một câu hỏi dài)
Hiện nay tôi đang còn phải vật lộn với việc thiết lập hệ thống sở hữu https.proxyHost. Bằng cách đính kèm một trình gỡ lỗi vào quá trình VM, có vẻ như máy ảo không nhận được thuộc tính https.proxyHost chút nào. –
Ok, chỉ sử dụng proxyHost và proxyPort mà không có http. hoặc https. tiền tố bây giờ làm việc cho tôi. Nó cũng có vẻ như hành vi đó (một lần nữa) được biên dịch từ Java 6 đến Java 7. Tuyên bố trên appleis cho Java 7. –
Khi yêu cầu URL https qua proxy, máy khách phải yêu cầu 'CONNECT www.google.ca:443 HTTP/1.0' và phản hồi của máy chủ proxy 'HTTP/1.0 200 Kết nối được thiết lập', cả hai đều ở dạng plain. Sau đó, khách hàng bắt đầu một cái bắt tay SSL. – auntyellow