已经发布的准备要测试的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" />
分享到:
相关推荐
本项目的目标是在`Android WebView`上成功访问`Tomcat SSL`双向验证服务。文中详细介绍了整个流程,并针对实际操作过程中遇到的问题提供了相应的解决方案。 **环境准备**: - 操作系统:Windows 2003 EE - 开发...
在标题"HTTPClient"和描述"HTTPclient实现HTTPS双向认证"中,涉及到的关键知识点是HTTPClient库在处理HTTPS安全连接时的双向认证机制。这里我们将深入探讨这个主题。 首先,了解HTTPS协议的基本概念是必要的。HTTPS...
本文将深入探讨如何使用HttpClient实现NTLM协议以及处理HTTPS的双向认证,同时也会提及到源码分析和工具的使用。 首先,NTLM(NT LAN Manager)是一种身份验证协议,常用于Windows环境,特别是当集成Windows域时。...
Java实现HTTPS双向认证详解 HTTPS双向认证是指客户端和服务端都需要拥有证书,并且双方都需要互换证书,客户端安装服务端证书,服务端安装客户端证书。这种情况下,并不是所有用户都可以访问服务端的。只有服务端...
双向HTTPS(也称为SSL/TLS双向认证)是实现这种安全通信的一种方式。它不仅验证服务器的身份,还验证客户端(Android设备)的身份,从而提供更高的安全性。 双向HTTPS的工作原理: 1. 客户端(Android设备)发起一...
5. **设置HttpClient或OkHttp**:最后,将自定义的`SSLSocketFactory`应用到网络请求库(如Apache HttpClient或OkHttp)中,以便在发起HTTPS请求时使用我们的配置。 通过以上步骤,我们就可以成功地在Android应用中...
但在双向HTTPS中,不仅服务器需要验证自身身份,客户端也需要向服务器证明它的身份,这提供了更高的安全级别,防止了中间人攻击和其他网络威胁。 在Java环境中实现双向HTTPS,我们需要关注以下几个关键知识点: 1....
本示例将深入探讨如何使用Tomcat搭建SSL(Secure Socket Layer)双向认证环境,以及通过Java原生类库SSLSocket进行编程,以及使用Apache的Httpclient库模拟安全的客户端请求。以下是对这些知识点的详细讲解。 首先...
在IT行业中,HTTPS(HyperText Transfer Protocol Secure)是一种基于HTTP协议的安全通信协议,它通过SSL/TLS协议提供了数据加密、服务器身份验证以及消息完整性检查,确保了网络通信的安全性。当我们需要从服务器...
SSLContext Kickstart :locked_with_key: 使用以下方法安装库: 用安装 < groupId>io.github.hakky54 < artifactId>sslcontext-kickstart < version>6.2.0 使用Gradle安装 implementation ' io.github.hakky54:...
在C#中,配置HttpClient使用HTTPS只需要设置一个证书即可。 除此之外,C#还支持WebSocket协议,这是一种双向通信协议,可以实现服务器与客户端的实时交互。WebSocket类使得开发者能够创建长连接应用,如在线游戏、...
例如,ServerSocket监听客户端的连接请求,Socket则用于建立实际的连接并进行双向通信。 HTTP(超文本传输协议)是互联网上应用最广泛的数据通信协议,主要用于浏览器与服务器之间的信息交换。Java的`java.net....
- 使用HttpClient配置HTTPS请求,确保通信加密。 - 掌握身份验证机制,如Basic Auth、OAuth、JWT等,以及如何在C#中实现它们。 6. **多线程和异步编程** - 网络I/O操作通常为阻塞型,使用多线程或异步编程可以...
5. **WebSocket协议**:WebSocket是一种双向通信协议,允许服务器和客户端实时交互。C#中可使用System.Net.WebSockets命名空间下的WebSocket类来实现WebSocket通信。 6. **FTP和SMTP协议**:对于文件传输和邮件发送...
利用`FormBuilder`,`FormControl`, `FormGroup`和`FormArray`等类,我们可以构建动态且验证的表单。例如,创建一个简单的表单: ```typescript import { FormBuilder, FormGroup, Validators } from '@angular/...
Socket可以用来创建客户端和服务器应用,实现数据的双向传输。了解Socket的工作原理、如何建立连接、发送和接收数据是基础。 2. **HttpClient类**:作为.NET Framework的一部分,HttpClient类是进行HTTP请求的首选...
7. **WebSocket通信**:`System.Net.WebSockets`命名空间提供了WebSocket支持,这是一种双向、全双工的通信协议,常用于实时通讯应用,如在线游戏、聊天室等。`WebSocket`类提供了连接管理、数据发送和接收的方法。 ...
HTTPS是HTTP的安全版本,通过SSL/TLS协议提供加密传输和身份验证,Java的JSSE(Java Secure Socket Extension)库提供了实现HTTPS通信所需的功能。 除了基础的网络通信,Java还支持多播编程,通过MulticastSocket类...
通过创建ServerSocket和ClientSocket,开发者可以建立客户端与服务器端的双向通信管道。 2. **UDP通信**:对于无连接、快速传输的需求,C#中的UdpClient类提供了UDP协议的支持。UDP不保证数据的顺序和完整性,但它...
10. **网络安全与身份验证**:理解如何使用OAuth、JWT等认证协议以及Windows身份验证(NTLM/Kerberos)是开发网络应用的重要环节。 通过本章的学习,开发者不仅能掌握C#的网络编程基础,还能了解如何利用这些知识...