㈠ 如何在Apache HttpClient 4忽略SSL证书错误问题,怎么解决
在访问部署了SSL证书的网站的过程中,往往由于证书的兼容性、证书配置、证书过期等多种原因提示SSL证书错误,这里给大家总结常见的SSL证书错误和解决办法。
ssl证书错误一:"无法将这个证书验证到一个受信任的证书颁发机构"或者类似"该安全证书由您没有选定信任的公司颁发"等情况。
解决方法:出现的原因可能是由于该证书没有在浏览器信任的列表里,我们可将该证书安装到浏览器的"信任列表之中即可"具体的步骤是:浏览器中选项→内容选项卡→证书-→导入即可。如果是颁发机构不可信的话,推荐购买通过全球认证的SSL证书,比如沃通SSL证书兼容性非常好。
㈡ Java的HttpClient如何去支持无证书访问https
项目里需要访问其他接口,通过http/https协议。我们一般是用HttpClient类来实现具体的http/https协议接口的调用。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=http://www.xxx.com/xxx;
// Init a HttpMethod
HttpMethod get = new GetMethod(url);
get.setDoAuthentication(true);
get.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(1, false));
// Call http interface
try {
client.executeMethod(get);
// Handle the response from http interface
InputStream in = get.getResponseBodyAsStream();
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
} finally {
// Release the http connection
get.releaseConnection();
}
以上代码在通过普通的http协议是没有问题的,但如果是https协议的话,就会有证书文件的要求了。一般情况下,是这样去做的。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
System.setProperty("javax.net.ssl.trustStore", "/.sis.cer");
System.setProperty("javax.net.ssl.trustStorePassword", "public");
}
于是,这里就需要事先生成一个.sis.cer的文件,生成这个文件的方法一般是先通过浏览器访问https://,导出证书文件,再用JAVA keytool command 生成证书
# $JAVA_HOME/bin/keytool -import -file sis.cer -keystore .sis.cer
但这样做,一比较麻烦,二来证书也有有效期,过了有效期之后,又需要重新生成一次证书。如果能够避开生成证书文件的方式来使用https的话,就比较好了。
还好,在最近的项目里,我们终于找到了方法。
// Init a HttpClient
HttpClient client = new HttpClient();
String url=https://www.xxx.com/xxx;
if (url.startsWith("https:")) {
this.supportSSL(url, client);
}
用到了supportSSL(url, client)这个方法,看看这个方法是如何实现的。
private void supportSSL(String url, HttpClient client) {
if(StringUtils.isBlank(url)) {
return;
}
String siteUrl = StringUtils.lowerCase(url);
if (!(siteUrl.startsWith("https"))) {
return;
}
try {
setSSLProtocol(siteUrl, client);
} catch (Exception e) {
logger.error("setProtocol error ", e);
}
Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
}
private static void setSSLProtocol(String strUrl, HttpClient client) throws Exception {
URL url = new URL(strUrl);
String host = url.getHost();
int port = url.getPort();
if (port <= 0) {
port = 443;
}
ProtocolSocketFactory factory = new SSLSocketFactory();
Protocol authhttps = new Protocol("https", factory, port);
Protocol.registerProtocol("https", authhttps);
// set https protocol
client.getHostConfiguration().setHost(host, port, authhttps);
}
在supportSSL方法里,调用了Security.setProperty( "ssl.SocketFactory.provider",
"com.tool.util.DummySSLSocketFactory");
那么这个com.tool.util.DummySSLSocketFactory是这样的:
访问https 资源时,让httpclient接受所有ssl证书,在weblogic等容器中很有用
代码如下:
1. import java.io.IOException;
2. import java.net.InetAddress;
3. import java.net.InetSocketAddress;
4. import java.net.Socket;
5. import java.net.SocketAddress;
6. import java.net.UnknownHostException;
7. import java.security.KeyManagementException;
8. import java.security.NoSuchAlgorithmException;
9. import java.security.cert.CertificateException;
10. import java.security.cert.X509Certificate;
11.
12. import javax.net.SocketFactory;
13. import javax.net.ssl.SSLContext;
14. import javax.net.ssl.TrustManager;
15. import javax.net.ssl.X509TrustManager;
16.
17. import org.apache.commons.httpclient.ConnectTimeoutException;
18. import org.apache.commons.httpclient.params.HttpConnectionParams;
19. import org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory;
20.
21. public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
22. static{
23. System.out.println(">>>>in MySecureProtocolSocketFactory>>");
24. }
25. private SSLContext sslcontext = null;
26.
27. private SSLContext createSSLContext() {
28. SSLContext sslcontext=null;
29. try {
30. sslcontext = SSLContext.getInstance("SSL");
31. sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
32. } catch (NoSuchAlgorithmException e) {
33. e.printStackTrace();
34. } catch (KeyManagementException e) {
35. e.printStackTrace();
36. }
37. return sslcontext;
38. }
39.
40. private SSLContext getSSLContext() {
41. if (this.sslcontext == null) {
42. this.sslcontext = createSSLContext();
43. }
44. return this.sslcontext;
45. }
46.
47. public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
48. throws IOException, UnknownHostException {
49. return getSSLContext().getSocketFactory().createSocket(
50. socket,
51. host,
52. port,
53. autoClose
54. );
55. }
56.
57. public Socket createSocket(String host, int port) throws IOException,
58. UnknownHostException {
59. return getSSLContext().getSocketFactory().createSocket(
60. host,
61. port
62. );
63. }
64.
65.
66. public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort)
67. throws IOException, UnknownHostException {
68. return getSSLContext().getSocketFactory().createSocket(host, port, clientHost, clientPort);
69. }
70.
71. public Socket createSocket(String host, int port, InetAddress localAddress,
72. int localPort, HttpConnectionParams params) throws IOException,
73. UnknownHostException, ConnectTimeoutException {
74. if (params == null) {
75. throw new IllegalArgumentException("Parameters may not be null");
76. }
77. int timeout = params.getConnectionTimeout();
78. SocketFactory socketfactory = getSSLContext().getSocketFactory();
79. if (timeout == 0) {
80. return socketfactory.createSocket(host, port, localAddress, localPort);
81. } else {
82. Socket socket = socketfactory.createSocket();
83. SocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
84. SocketAddress remoteaddr = new InetSocketAddress(host, port);
85. socket.bind(localaddr);
86. socket.connect(remoteaddr, timeout);
87. return socket;
88. }
89. }
90.
91. //自定义私有类
92. private static class TrustAnyTrustManager implements X509TrustManager {
93.
94. public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
95. }
96.
97. public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
98. }
99.
100. public X509Certificate[] getAcceptedIssuers() {
101. return new X509Certificate[]{};
102. }
103. }
104.
105. }
public class MySecureProtocolSocketFactory implements SecureProtocolSocketFactory {
static{
System.out.println(">>>>in MySecureProtocolSocketFactory>>");
}
private SSLContext sslcontext = null;
private SSLContext createSSLContext() {
SSLContext sslcontext=null;
try {
sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return sslcontext;
}
private SSLContext getSSLContext() {
if (this.sslcontext == null) {
this.sslcontext = createSSLContext();
}
return this.sslcontext;
}
public Socket createSocket(Socket socket, String host, int port, boolean autoClose)
throws IOException, UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
socket,
host,
port,
autoClose
);
}
public Socket createSocket(String host, int port) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(
host,
port
然后按如下方式使用HttpClient
Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
Protocol.registerProtocol("https", myhttps);
HttpClient httpclient=new HttpClient();
㈢ HttpClient 怎么忽略证书验证访问https
您好,我来为您解答:
自定义一个SSLSocketFactory,忽略证书的验证。
如果我的回答没能帮助您,请继续追问。
㈣ 怎么给httpclient 配置https证书
你那个 SSLSocketFactory(ks) 是自己的类?
你有用过 KeyManager.init (...)? 和 TrustManager.init(...) ?
想要在连接建立过程上交互式的弹出确认对话框专来的话需要我们自属己提供一个 KeyManager 和 TrustManager 的实现类,这有点复杂,你可以看一个 Sun 的 X509KeyManager 是怎么做的,默认地情况下它是从自动搜索匹配的 subject ,我们需要用自己提供的方式弹出确认的过程还不是全自动,另外一个账户可能有多个数字证书,比如支付宝我们就有多个签发时间不一样的数字证书,在连接建立时 IE 会提示我们选择其中的一个来使用,银行的 U 盾在安装多张数字证书时也会提示我们选择其中一个对应到你正在使用的银行卡号的那张证书。
㈤ 如何处理与Apache HttpClient的无效SSL证书
如果是自己的私有证书,他本身不受信任的,而且可能您的SSL证书缺少了重要的文件,或者可以说不具备
浏览器信任条件,可以淘宝Gworg获取公网信任SSL证书。
㈥ 如何使用HttpClient认证机制
是单向认证还是双向认证呢?
其实2者实现过程是类似的,我对httpclient4.3+的版本比较熟悉,生成httpclient实例的一般过程是:首先生成SSLContext,然后用sslcontext作为参数传入工厂方法生成SSLsocketfactory实例,之后通过HttpClientBuilder()将工厂传进去生成httpclient实例,当然生成工厂实例这一步可以不做,看需求,因为工厂可以设置一些连接参数,如果你用不到可以直接把SSLContext传入HttpClientBuilder()出来httpclient实例。
过程了解了,那么如果要做证书验证,对于单向认证,我们只需要信任服务器证书即可,如果你手里有服务器证书(一般都可以下载),可以直接把它转成keystore格式,然后sslcontext有一个.loadTrustMaterial(xxx.keystore)方法设置证书信任域,你把服务器证书设置进去就可以了,还有一个.loadTrustMaterial(null, new TrustSelfSignedStrategy()),这是默认信任所有,当然不太安全,另外还可以通过重写默认方法信任所有证书,这个不再赘述,你选择一种方法就行。
对于双向认证,你只需要把客户端证书传过去即可,你手上肯定有客户端证书对吧,把它整成keystore格式,然后通过sslcontext的.loadKeyMaterial(xx.keystore,"password")把证书传进去,很简单吧,下面我给你个例子,是我以前写的,也参考了网上的例子。
这个是先得到keystore实例
publicclassTrustKey{
@SuppressWarnings("finally")
(){
KeyStoretrustStore=null;
FileInputStreamfis=null;
try{
trustStore=KeyStore.getInstance(KeyStore.getDefaultType());
//fis=newFileInputStream(newFile("D:\java\tomcat8\wx_dev\webapps\data.keystore"));
fis=newFileInputStream(newFile("E:\certi\data.keystore"));
trustStore.load(fis,"password".toCharArray());//加载KeyStore
}catch(NoSuchAlgorithmExceptione){
e.printStackTrace();
}catch(CertificateExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}catch(KeyStoreExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
try{
fis.close();
}catch(IOExceptione){
e.printStackTrace();
}
returntrustStore;
}
}
下面是生成httpclient实例,用到了连接池,如果你不需要可以去掉。
(){
CloseableHttpClienthttpclient=null;
try{
KeyStoretrustStore=TrustKey.getTrustKey();//获得keystore
//设置ssl上下文
SSLContextsslContext=SSLContexts.custom()
.loadTrustMaterial(null,newTrustSelfSignedStrategy())
.loadKeyMaterial(trustStore,"sinowel".toCharArray())
.setSecureRandom(newSecureRandom())
.useSSL()
.build();
=PlainConnectionSocketFactory.INSTANCE;
//将参数注入sslconnection工厂,,忽略域名一致验证
=newSSLConnectionSocketFactory(
sslContext,newString[]{"TLSv1"},null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
//注册协议
Registry<ConnectionSocketFactory>r=RegistryBuilder.<ConnectionSocketFactory>create()
.register("http",plainSocketFactory)
.register("https",sslSocketFactoy)
.build();
HttpHosttarget=newHttpHost(IP,PORT,"https");
//根据已生成协议工厂对象生成连接管理器
connectionManager=(r);
connectionManager.setMaxTotal(MAXCONNECTION);
//设置每个Route的连接最大数
connectionManager.setDefaultMaxPerRoute(DEFAULTMAXCONNECTION);
//设置指定域的连接最大数
connectionManager.setMaxPerRoute(newHttpRoute(target),20);
//返回HTTPCLIENT对象
httpclient=HttpClients.custom()
.setConnectionManager(connectionManager)
.setProxy(newHttpHost("10.182.22.88",8002))
.build();
//将ssl上下文及连接管理器注入工厂产生httpclient对象
//=newSSLConnectionSocketFactory(sslContext);
//httpclient=HttpClients.custom().setSSLSocketFactory(sslsf).build();
//httpclient=HttpClientBuilder.create().setSSLSocketFactory(sslsf).build();
}catch(Exceptione){
e.printStackTrace();
}finally{
returnhttpclient;
}
}
㈦ Java的HttpClient如何去支持无证书访问https
Java的HttpClient如何去支持无证书访问https
SSL 连接的 context 目前用那个 KeyManager, TrustManager 的实现(Sun 公司提供的)都是默认地从命令行提供的参数或代码中明确初始化的 trust manager / key manager 中查找的,这里面可以肯定的是这个参数在连接建立之前已经固定了的静态形式,这要求我们把可以信任的服务器证书的颁发机构的根证书先导入到 trust store 中然后指派给 java 程序。
㈧ 用java做一个httpClient 发送https 的get请求,需要证书验证的那种,求大神指点一下!
你那个 SSLSocketFactory(ks) 是自己的类?
你有用过 KeyManager.init (...)? 和 TrustManager.init(...) ?
想要在连接建立过程上交互式的弹出确认对话框来的话需要我们自己提供一个 KeyManager 和 TrustManager 的实现类,这有点复杂,你可以看一个 Sun 的 X509KeyManager 是怎么做的,默认地情况下它是从自动搜索匹配的 subject ,我们需要用自己提供的方式弹出确认的过程还不是全自动,另外一个账户可能有多个数字证书,比如支付宝我们就有多个签发时间不一样的数字证书,在连接建立时 IE 会提示我们选择其中的一个来使用,银行的 U 盾在安装多张数字证书时也会提示我们选择其中一个对应到你正在使用的银行卡号的那张证书。
㈨ 谁知道如何屏蔽掉htmlunit抛出的各种异常
在main函数里面加上:
1
2
3
4
5
6
7
LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog");
java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit")
.setLevel(Level.OFF);
java.util.logging.Logger.getLogger("org.apache.commons.httpclient")
.setLevel(Level.OFF);
追问:
不管用呀,还是往外抛
追答:
是不是这些代码所在的位置的问题,我测试了一个简单的只是下载网页源码的类,放在最前面不会抛异常,放在HtmlPage page = client.getPage(url);的后面就会抛异常。
可以添加代码如下: 1 WebClient client = new WebClient(); 2 3 client.setIncorrectnessListener(new SilentIncorrectnessListener()); 4 //js异常控制主要的一步 5 client.getOptions().setJavaScriptEnabled(false); 6 client.setCssErrorHandler(new QuietCssErrorHandler()); 7 client.getOptions().(false); 8 9 client.getOptions().(false);10 //设置日志级别11 java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);