[英]Cloudflare free SSL ConnectException
我使用它的免費SSL功能將我的網站置於CloudFlare之后。
瀏覽器中的每一件事都很好。 SSL鎖定在瀏覽器中正確顯示。
但是,如果我使用Java程序向同一個Web發出HTTP GET請求,我將獲得異常。
以下是我寫的小java程序。
package com.mycompany.textexception;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
public class Main {
public static void main(String [] args) throws IOException, URISyntaxException{
URI loginUri = new URI("https://site-behind-cf.in/");
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet( loginUri );
HttpResponse response = httpclient.execute( httpget );
System.out.println("Done");
}
}
例外是
Exception in thread "main" java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:656)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:524)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:403)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:177)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:304)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:611)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:446)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at com.mycompany.textexception.Main.main(Main.java:26)
注意:如果我指向https://www.google.co.in
或https://my-other-web.com
並且不是CloudFlare並且已經發布了自己的SSL,那么相同的程序將正常工作。
SSL for Free計划利用Comodo或GlobalSign的Elliptic Curve數字簽名算法(ECDSA)證書。
這些證書僅適用於支持服務器名稱指示(SNI)的現代瀏覽器
如果你去Cloudflare Pro,你可能沒有同樣的問題
SSL for Free計划利用Comodo或GlobalSign的Elliptic Curve數字簽名算法(ECDSA)證書。
這些證書僅適用於支持服務器名稱指示(SNI)的現代瀏覽器
您需要添加相同的標題瀏覽器(支持SNI)才能為您完成。 以下測試代碼可能對您有所幫助。 謝謝。
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
public class CloudFlareTest {
public static void main(String[] params){
HttpClient httpClient = HttpClients.createDefault();
HttpGet getMethod = new HttpGet("https://your.domain.com/path/to/yourrequest");
getMethod.addHeader(":authority", "your.domain.com");
getMethod.addHeader(":method","GET");
getMethod.addHeader(":path","/path/to/yourrequest");
getMethod.addHeader(":scheme","https");
try {
HttpResponse httpResponse = httpClient.execute(getMethod);
if(httpResponse.getStatusLine().getStatusCode() == 200){
System.out.println("Done: " + httpResponse.getEntity().getContentLength());
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.