`

HttpClient https双向验证

阅读更多
已经发布的准备要测试的https服务:
package com.abin.lee.https;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class ReceiveHttpClientRequest extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("receive https request");
Map map=request.getParameterMap();
String user=(((Object[])map.get("user"))[0]).toString();
System.out.println("user="+user);
String pwd=(((Object[])map.get("pwd"))[0]).toString();
System.out.println("pwd="+pwd);

//给调用者返回值
PrintWriter write=response.getWriter();
write.write("receive HttpClient success");
write.flush();
write.close();
}
}





//web.xml
<servlet>
<servlet-name>httpsClientRequest</servlet-name>
<servlet-class>com.abin.lee.https.ReceiveHttpClientRequest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>httpsClientRequest</servlet-name>
<url-pattern>/httpsClientRequest</url-pattern>
</servlet-mapping>




//HttpClient测试类
package com.abin.lee.test;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import junit.framework.TestCase;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.junit.Before;
import org.junit.Test;
public class HttpsClient extends TestCase {
private String httpUrl = "https://localhost:8443/global/httpsClientRequest";
// 客户端密钥库
private String sslKeyStorePath;
private String sslKeyStorePassword;
private String sslKeyStoreType;
// 客户端信任的证书
private String sslTrustStore;
private String sslTrustStorePassword;

@Before
public void setUp() {
sslKeyStorePath = "D:\\home\\tomcat.keystore";
sslKeyStorePassword = "stevenjohn";
sslKeyStoreType = "JKS"; // 密钥库类型,有JKS PKCS12等
sslTrustStore = "D:\\home\\tomcat.keystore";
sslTrustStorePassword = "stevenjohn";
System.setProperty("javax.net.ssl.keyStore", sslKeyStorePath);
System.setProperty("javax.net.ssl.keyStorePassword",
sslKeyStorePassword);
System.setProperty("javax.net.ssl.keyStoreType", sslKeyStoreType);
// 设置系统参数
System.setProperty("javax.net.ssl.trustStore", sslTrustStore);
System.setProperty("javax.net.ssl.trustStorePassword",
sslTrustStorePassword);
}
@Test
public void testHttpsClient() {
SSLContext sslContext = null;
try {
KeyStore kstore = KeyStore.getInstance("jks");
kstore.load(new FileInputStream(sslKeyStorePath),
sslKeyStorePassword.toCharArray());
KeyManagerFactory keyFactory = KeyManagerFactory
.getInstance("sunx509");
keyFactory.init(kstore, sslKeyStorePassword.toCharArray());
KeyStore tstore = KeyStore.getInstance("jks");
tstore.load(new FileInputStream(sslTrustStore),
sslTrustStorePassword.toCharArray());
TrustManager[] tm;
TrustManagerFactory tmf = TrustManagerFactory
.getInstance("sunx509");
tmf.init(tstore);
tm = tmf.getTrustManagers();
sslContext = SSLContext.getInstance("SSL");
sslContext.init(keyFactory.getKeyManagers(), tm, null);
} catch (Exception e) {
e.printStackTrace();
}
try {
HttpClient httpClient = new DefaultHttpClient();
SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext);
Scheme sch = new Scheme("https", 8443, socketFactory);
httpClient.getConnectionManager().getSchemeRegistry().register(sch);
HttpPost httpPost = new HttpPost(httpUrl);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("user", "abin"));
nvps.add(new BasicNameValuePair("pwd", "abing"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse httpResponse = httpClient.execute(httpPost);
String spt = System.getProperty("line.separator");
BufferedReader buffer = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
StringBuffer stb=new StringBuffer();
String line=null;
while((line=buffer.readLine())!=null){
stb.append(line);
}
buffer.close();
String result=stb.toString();
System.out.println("result="+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}







//tomcat配置文件:(前提是https双向验证证书生成的没有一点问题)

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
   SSLEnabled="true" maxThreads="150" scheme="https"
   secure="true" clientAuth="true" sslProtocol="TLS"
   keystoreFile="D:\\home\\tomcat.keystore" keystorePass="stevenjohn"
   truststoreFile="D:\\home\\tomcat.keystore" truststorePass="stevenjohn" />
分享到:
评论
2 楼 huxiaogang1980 2014-02-19  
tomcat server.xml 配置如下:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="true" sslProtocol="TLS"
               keystoreFile="C:/tomcatserver.keystore"
               keystorePass="789789"
               truststoreFile="C:/tomcatserver.keystore"
               truststorePass="789789" />
1 楼 huxiaogang1980 2014-02-19  
  编译成功,运行成功。 好文章。 tomcat 6 双向认证的配置方法如下:

1A-1.制作客户端证书 client.p12(用于浏览器)
D:\program\jdk1.6.0_25\bin>keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore C:\client.p12 -validity 36500
密码123456

1A-2.转换客户端证书为 client.cer
D:\program\jdk1.6.0_25\bin>keytool -export -alias client -keystore C:\client.p12 -storetype PKCS12 -storepass 123456 -rfc -file C:\client.cer

2.生成服务端库 tomcatserver.keystore
D:\program\jdk1.6.0_25\bin>keytool -genkey -alias tomcatserver -keyalg RSA -keystore C:\tomcatserver.keystore -validity 36500
密码789789
您的名字与姓氏是什么?
  [Unknown]:  localhost   ---- 这里必须与与域名相同(如果Tomcat所在服务器的域名不是“localhost”,应改为对应的域名,如“www.sina.com.cn”)

4.客户端证书导入到服务端库(用于tomcat服务端,客户端java程序)
D:\program\jdk1.6.0_25\bin>keytool -import -v -alias client -file C:\client.cer -keystore C:\tomcatserver.keystore -storepass 789789



相关推荐

    AndroidHttpClient访问Tomcat双向SSL验证服务器.pdf

    本项目的目标是在`Android WebView`上成功访问`Tomcat SSL`双向验证服务。文中详细介绍了整个流程,并针对实际操作过程中遇到的问题提供了相应的解决方案。 **环境准备**: - 操作系统:Windows 2003 EE - 开发...

    httpclient

    在标题"HTTPClient"和描述"HTTPclient实现HTTPS双向认证"中,涉及到的关键知识点是HTTPClient库在处理HTTPS安全连接时的双向认证机制。这里我们将深入探讨这个主题。 首先,了解HTTPS协议的基本概念是必要的。HTTPS...

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

    本文将深入探讨如何使用HttpClient实现NTLM协议以及处理HTTPS的双向认证,同时也会提及到源码分析和工具的使用。 首先,NTLM(NT LAN Manager)是一种身份验证协议,常用于Windows环境,特别是当集成Windows域时。...

    https双向认证 .doc

    Java实现HTTPS双向认证详解 HTTPS双向认证是指客户端和服务端都需要拥有证书,并且双方都需要互换证书,客户端安装服务端证书,服务端安装客户端证书。这种情况下,并不是所有用户都可以访问服务端的。只有服务端...

    双向https的Android代码

    双向HTTPS(也称为SSL/TLS双向认证)是实现这种安全通信的一种方式。它不仅验证服务器的身份,还验证客户端(Android设备)的身份,从而提供更高的安全性。 双向HTTPS的工作原理: 1. 客户端(Android设备)发起一...

    android访问自签CA的Https SSL双向认证(j2SE也能使用)

    5. **设置HttpClient或OkHttp**:最后,将自定义的`SSLSocketFactory`应用到网络请求库(如Apache HttpClient或OkHttp)中,以便在发起HTTPS请求时使用我们的配置。 通过以上步骤,我们就可以成功地在Android应用中...

    双向HTTPS解决方案.zip

    但在双向HTTPS中,不仅服务器需要验证自身身份,客户端也需要向服务器证明它的身份,这提供了更高的安全级别,防止了中间人攻击和其他网络威胁。 在Java环境中实现双向HTTPS,我们需要关注以下几个关键知识点: 1....

    基于Tomcat搭建SSL双向认证示例【100012422】

    本示例将深入探讨如何使用Tomcat搭建SSL(Secure Socket Layer)双向认证环境,以及通过Java原生类库SSLSocket进行编程,以及使用Apache的Httpclient库模拟安全的客户端请求。以下是对这些知识点的详细讲解。 首先...

    发送https请求

    在IT行业中,HTTPS(HyperText Transfer Protocol Secure)是一种基于HTTP协议的安全通信协议,它通过SSL/TLS协议提供了数据加密、服务器身份验证以及消息完整性检查,确保了网络通信的安全性。当我们需要从服务器...

    sslcontext-kickstart::locked_with_key:一个轻量级的高级库,用于基于SSLContext或其他属性(例如TrustManager,KeyManager或Trusted Certificates)配置http客户端,以通过SSL TLS进行通信,以进行SSLFactory提供的单向身份验证或双向身份验证。 通过示例支持基于Java,Scala和Kotlin的客户端。 可用的客户端示例包括:Apache HttpClient,OkHttp,Spring RestTempla

    SSLContext Kickstart :locked_with_key: 使用以下方法安装库: 用安装 &lt; groupId&gt;io.github.hakky54 &lt; artifactId&gt;sslcontext-kickstart &lt; version&gt;6.2.0 使用Gradle安装 implementation ' io.github.hakky54:...

    c#网络应用编程

    在C#中,配置HttpClient使用HTTPS只需要设置一个证书即可。 除此之外,C#还支持WebSocket协议,这是一种双向通信协议,可以实现服务器与客户端的实时交互。WebSocket类使得开发者能够创建长连接应用,如在线游戏、...

    基于java实现计算机网络的基础知识(TCPIP,HTTPHTTPS)等源码.zip

    例如,ServerSocket监听客户端的连接请求,Socket则用于建立实际的连接并进行双向通信。 HTTP(超文本传输协议)是互联网上应用最广泛的数据通信协议,主要用于浏览器与服务器之间的信息交换。Java的`java.net....

    C#网络应用导航实例

    - 使用HttpClient配置HTTPS请求,确保通信加密。 - 掌握身份验证机制,如Basic Auth、OAuth、JWT等,以及如何在C#中实现它们。 6. **多线程和异步编程** - 网络I/O操作通常为阻塞型,使用多线程或异步编程可以...

    c#网络应用编程.rar

    5. **WebSocket协议**:WebSocket是一种双向通信协议,允许服务器和客户端实时交互。C#中可使用System.Net.WebSockets命名空间下的WebSocket类来实现WebSocket通信。 6. **FTP和SMTP协议**:对于文件传输和邮件发送...

    前段资料angular资源信息常用方法

    利用`FormBuilder`,`FormControl`, `FormGroup`和`FormArray`等类,我们可以构建动态且验证的表单。例如,创建一个简单的表单: ```typescript import { FormBuilder, FormGroup, Validators } from '@angular/...

    C# Intnet 编程

    Socket可以用来创建客户端和服务器应用,实现数据的双向传输。了解Socket的工作原理、如何建立连接、发送和接收数据是基础。 2. **HttpClient类**:作为.NET Framework的一部分,HttpClient类是进行HTTP请求的首选...

    C#网络应用程序集锦

    7. **WebSocket通信**:`System.Net.WebSockets`命名空间提供了WebSocket支持,这是一种双向、全双工的通信协议,常用于实时通讯应用,如在线游戏、聊天室等。`WebSocket`类提供了连接管理、数据发送和接收的方法。 ...

    java 网络编程pdf

    HTTPS是HTTP的安全版本,通过SSL/TLS协议提供加密传输和身份验证,Java的JSSE(Java Secure Socket Extension)库提供了实现HTTPS通信所需的功能。 除了基础的网络通信,Java还支持多播编程,通过MulticastSocket类...

    Visual C#网络编程技术与实践

    通过创建ServerSocket和ClientSocket,开发者可以建立客户端与服务器端的双向通信管道。 2. **UDP通信**:对于无连接、快速传输的需求,C#中的UdpClient类提供了UDP协议的支持。UDP不保证数据的顺序和完整性,但它...

    C# 精彩编程实例--第7章 网络应用

    10. **网络安全与身份验证**:理解如何使用OAuth、JWT等认证协议以及Windows身份验证(NTLM/Kerberos)是开发网络应用的重要环节。 通过本章的学习,开发者不仅能掌握C#的网络编程基础,还能了解如何利用这些知识...

Global site tag (gtag.js) - Google Analytics