目标:构建免SSL认证的HttpClient
JDK:Java8
依赖jar包:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4.1</version>
</dependency>
Java代码:
import javax.net.ssl.SSLContext;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.ssl.SSLContextBuilder;
public class HttpClientUtil {
/**
* 构建免认证的HttpClient
* @param user
* @param password
* @return
*/
public static CloseableHttpClient getNoopSSLClient(String user, String password) {
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
//设置认证
AuthScope authScope = new AuthScope(AuthScope.ANY_HOST,
AuthScope.ANY_PORT);
UsernamePasswordCredentials usernamePasswordCredentials = new UsernamePasswordCredentials(
user, password);
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(authScope,
usernamePasswordCredentials);
clientBuilder.setDefaultCredentialsProvider(credentialsProvider);
// 设置免认证的SSLConnectionSocketFactory
clientBuilder.setSSLSocketFactory(getNoopSSLConnectionSocketFactory());
return clientBuilder.build();
}
/**
* 构建免认证的SSLConnectionSocketFactory
* @return
*/
private static SSLConnectionSocketFactory getNoopSSLConnectionSocketFactory() {
SSLContext sslContext;
try {
sslContext = new SSLContextBuilder().loadTrustMaterial(null,
/*
* 传统方式构建匿名内部类
* new TrustStrategy() { public boolean isTrusted(X509Certificate[]
* chain, String authType) throws CertificateException { return
* true; } }
*/
//采用Java8 lambda表达式 ->
(chain, authType) -> true).build();
// trust all hosts
return new SSLConnectionSocketFactory(sslContext,
NoopHostnameVerifier.INSTANCE);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}