当前位置:首页 > 开发 > 编程语言 > Http > 正文

httpclient使用NTLM协与https协议访问双向认证站点

发表于: 2013-09-09   作者:bewithme   来源:转载   浏览次数:
摘要:     上篇中提到了在NTLM协议中使用HTTPS协议访问需要双向认证的问题,这里会给出方案和相应代码。     public static String getWithNTCredentialAndSSLClientAuth(String url,boolean needProxy,int msTimeOut) throws MalformedUR

 

  上篇中提到了在NTLM协议中使用HTTPS协议访问需要双向认证的问题,这里会给出方案和相应代码。

 

 

public static String getWithNTCredentialAndSSLClientAuth(String url,boolean needProxy,int msTimeOut) throws MalformedURLException{
		log.info("--get url:[" + url + "]");
		String responseBody = null;
		HttpMethod getMethod = new GetMethod(url);
		if(msTimeOut>0) {
			getMethod.getParams().setSoTimeout(msTimeOut);
		}
		log.info("--queryString:" + getMethod.getQueryString());
		Protocol authhttps = new Protocol("https",new AuthSSLProtocolSocketFactory(), 443); 
        Protocol.registerProtocol("https",authhttps);
		HttpClient httpClient = new HttpClient();
		if (needProxy) {
			String proxyUrl = "xxx.xxx.xxx.xxx";
			String proxyPort ="8080";
			String proxyUser ="xxxxxx";
			String proxyPassword ="xxxxx";
			String domain="xxxxx.COM";
			httpClient.getHostConfiguration().setProxy(proxyUrl,Integer.parseInt(proxyPort));
			List authPrefs = new ArrayList(2);
			authPrefs.add(AuthPolicy.NTLM);
			httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT,"Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1"); 
			httpClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
			// 如果代理需要密码验证,这里设置用户名密码
			NTCredentials ntc=new NTCredentials(proxyUser, proxyPassword,proxyUrl,domain);
			httpClient.getState().setProxyCredentials(AuthScope.ANY,ntc);
		}
		try {
			int statusCode = httpClient.executeMethod(getMethod);
			log.info("http get url:" + getMethod.getURI());
			log.info("----http status code:" + statusCode);
			if (statusCode == HttpStatus.SC_OK || statusCode==HttpStatus.SC_PARTIAL_CONTENT) {
				responseBody = getMethod.getResponseBodyAsString();
			}
		} catch (HttpException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			getMethod.releaseConnection();
		}
		return responseBody;
	}

 

   关键代码

	Protocol authhttps = new Protocol("https",new AuthSSLProtocolSocketFactory(), 443); 
        Protocol.registerProtocol("https",authhttps);

  此处代码指定使用https协议,而此协议的创建需要传入

AuthSSLProtocolSocketFactory

 这是SSL协议认证工厂实例,这个实例主要提供 SSLContext 即SSL上下文,示例代码中,该上下文由SSLTool类提供,而 SSLContext的创建需要服务器端证书,客户端证书,客户端证书。示例代码中,我们把配置我们存放在/configs/tenpay.properties文件中。

server_cert_file_name=D:/sslfile/xxxx.pem   服务器端证书文件路径
client_cert_file_name=D:/sslfile/xxxx.pfx   客户端证书文件路径 
client_cert_password=xxxxx客户端证书密码 

 

代码中,测试方法在src\com\apache\test\https\HttpClientUtil.java  中

有问题可加QQ 359709421

 我的网店,有劳各位参观参观  http://mrs-x.taobao.com/

 

httpclient使用NTLM协与https协议访问双向认证站点

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
没错,NTLM就是你听说过的那个NTLM。是微软应用最广泛的认证协议之一。 NTLM是NT LAN Manager的缩写
一、背景&概念 HTTPS:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的
NTLM认证协议学习笔记(一) zhao_rong 2011-06-15 这个文章放草稿箱里已经太多天了,工作太忙,没
NTLM是一种保护在认证过程中保护用户名和密码的认证协议,一般用在Microsoft的产品中,比如IE,IIS
去年用tomcat、jboss配置过HTTPS双向认证,那时候主要用的是JDK自带的keytool工具。这次是用httpd +
SSL 的双向认证就是,客户端要获取服务端的证书,检查下服务端是不是我可以信任的主机,否则我就认
SSL 的双向认证就是,客户端要获取服务端的证书,检查下服务端是不是我可以信任的主机,否则我就认
Form PHP,you can access the useful cURL Library(libcurl) to make requests to URLs using a va
什么是双向认证呢?简而言之,就是服务器端对请求它的客户端要进行身份验证,客户端对自己所请求的
最近发现Java的HttpClient从4.1版本以后就开始支持NTLM协议了,之前版本是不支持NTLM协议的(但可以
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号