JRE7 中的 TLS 解析为 TLSv1。将协议显式设置为 TLSv1.2:
SSLContext context = SSLContext.getInstance("TLSv1.2");
否则您使用HttpClientBuilder 的示例是可以的。
编辑:
如果你想禁用主机名检查(在生产系统中这是个坏主意):
与Apache httpclient
package hello;
import java.net.URI;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
public class client {
public static void main(String args[]) throws Exception {
// System.setProperty("javax.net.debug", "ssl:handshake:verbose");
SSLSocketFactory socketFactory = null ;
// Set benevolent host name verifier
socketFactory = new SSLSocketFactory( "TLS" , null /* Keystore*/ ,
null /* keystore passwd */ ,null /* trusts store */ , null ,
SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER ) ;
Scheme sch = new Scheme("https", 443, socketFactory);
DefaultHttpClient httpClient = new DefaultHttpClient() ;
httpClient.getConnectionManager().getSchemeRegistry().register(sch);
HttpGet request = new HttpGet(new URI("https://www.wikipedia.org/"));
// request.addHeader("Authorization", basicAuthorization);
// request.addHeader("Accept", "text/plain");
CloseableHttpResponse httpResponse = httpClient.execute(request);
System.out.println(httpResponse.getStatusLine());
httpClient.close();
}
}
使用Apache httpclient >= 4.3:
package hello;
import java.net.URI;
import java.util.Arrays;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import sun.security.ssl.SSLSocketFactoryImpl;
public class client {
public static void main(String args[]) throws Exception {
// System.setProperty("javax.net.debug", "ssl:handshake:verbose");
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null, null, null);
SSLConnectionSocketFactory sslCF = new SSLConnectionSocketFactory(context, new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
// or add your own test here
return true;
}
});
CloseableHttpClient httpClient = HttpClientBuilder
.create()
.setSSLSocketFactory(sslCF)
.build();
HttpGet request = new HttpGet(new URI("https://www.wikipedia.org/"));
// request.addHeader("Authorization", basicAuthorization);
// request.addHeader("Accept", "text/plain");
CloseableHttpResponse httpResponse = httpClient.execute(request);
System.out.println(httpResponse.getStatusLine());
}
}