双向验证,在客户机连接服务器时,客户机验证服务器的证书,服务器验证客户机的证书,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接。
1. 生成服务器端的keystore和truststore文件:
1.1. 以jks格式生成服务器端包含Public key和Private Key的keystore文件,keypass与storepass务必要一样,因为在tomcat server.xml中只配置一个password.
keytool -genkey -alias server -keystore serverKeystore.jks -keypass 123456 -storepass 123456 -keyalg RSA -keysize 512 -validity 365 -v -dname "CN = W03GCA01A,O = ABC BANK,DC = Server Https,DC = ABC,OU = Firefly Technology And Operation"
1.2. 从keystore中导出别名为server的服务端证书.
keytool -export -alias server -keystore serverKeystore.jks -storepass 123456 -file server.cer
1.3. 将server.cer导入客户端的信任证书库clientTruststore.jks。
keytool -import -alias trustServer -file server.cer -keystore clientTruststore.jks -storepass 123456
2. 生成客户端的keystore和truststore文件:
1.1. 以jks格式生成服务器端包含Public key和Private Key的keystore文件。
keytool -genkey -alias client -keystore clientKeystore.jks -keypass 123456 -storepass 123456 -keyalg RSA -keysize 512 -validity 365 -v -dname "CN = W03GCA01A,O = ABC BANK,DC = Client Https,DC = ABC,OU = Firefly Technology And Operation"
1.2. 从keystore中导出别名为client的客户端证书.
keytool -export -alias client -keystore clientKeystore.jks -storepass 123456 -file client.cer
1.3. 将client.cer导入服务端的信任证书库serverTruststore.jks。
keytool -import -alias trustClient -file client.cer -keystore serverTruststore.jks -storepass 123456
服务器端: serverKeystore.jks serverTruststore.jks
客户端: clientKeystore.jks clientTruststore.jks
3. 在tomcat 配置server.xml
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="keystore/serverKeystore.jks" keystorePass="123456"
truststoreFile="keystore/serverTruststore.jks" truststorePass="123456" />
4. 客户端代码
package com.ssl.http;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
/**
*
* @author kevin
*
*/
public class ClientTwoWaySSL {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
DefaultHttpClient httpclient = new DefaultHttpClient();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream keyStoreIn = new FileInputStream(new File(
"com/ssl/http/clientKeystore.jks"));
FileInputStream trustStoreIn = new FileInputStream(new File(
"com/ssl/http/clientTruststore.jks"));
try {
keyStore.load(keyStoreIn, "123456".toCharArray());
trustStore.load(trustStoreIn, "123456".toCharArray());
} finally {
keyStoreIn.close();
trustStoreIn.close();
}
SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore,
"123456", trustStore);
Scheme sch = new Scheme("https", socketFactory, 8443);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
HttpGet httpget = new HttpGet("https://w03gca01a:8443/");
System.out.println("Request:" + httpget.getRequestLine());
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: "
+ entity.getContentLength());
}
if (entity != null) {
entity.consumeContent();
}
httpclient.getConnectionManager().shutdown();
}
}
备注:
A. 如出现如下error,请配置C:\WINDOWS\system32\drivers\etc\hosts, 将“127.0.0.1
w03gca01a” 加在hosts文件中
# executing requestGET https://w03gca01a/ HTTP/1.1
# Exception in thread "main" javax.net.ssl.SSLException: hostname in certificate didn't match: <w03gca01a> != <localhost>
# at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)
# at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)
B. 本文用到 httpcore-4.0.1.jar httpclient-4.0.1.jar
httpmime-4.0.1.jar,下载地址:
http://hc.apache.org/downloads.cgi
分享到:
相关推荐
Tomcat 实现 SSL 双向认证 Tomcat 是一个流行的开源 Web 应用服务器,而 SSL(Secure Sockets Layer)是一种常用的安全协议,用于确保 Web 应用程序之间的数据传输安全。本文将详细介绍如何在 Tomcat 中实现 SSL ...
4. **启用Client Authentication**:如果需要双向认证(也称为mutual SSL),可以将`clientAuth`属性设置为"want"或"need"。"want"表示如果客户端有证书,则验证,否则继续连接;"need"表示客户端必须提供证书才能...
总结,Tomcat下的SSL双向认证是通过配置Keystore、Truststore,修改Tomcat的服务器配置,并确保客户端正确配置来实现的。这一过程增强了服务器与客户端之间的通信安全性,对于保护敏感数据传输尤其重要。
这是我实战的笔记,全程直播。 #### Tomcat和Openssl构建HTTPS双向认证 ###### ...二、tomcat实现双向认证 1、创建服务器信任的CA证书库 2、配置Tomcat支持HTTPS双向认证(服务器将认证客户端证书)
在IT行业中,安全通信是至关重要的,特别是...通过上述步骤,你可以在Tomcat上实现一个完整的SSL双向认证环境,并利用Java和Apache HttpClient进行安全的通信。这个过程对于理解网络安全和提高应用安全性具有重要意义。
在这个场景中,我们将探讨如何在Tomcat 6和5.5版本中配置SSL双向认证,并使用openssl工具生成必要的密钥文件。 **一、生成CA证书** 创建一个自签名的根证书颁发机构(Root CA)是SSL双向认证的第一步。这可以通过...
本文主要介绍如何在Linux平台上,使用Apache Tomcat、OpenSSL以及Java Keytool来实现HTTPS通信,并进一步完成双向认证的功能。文章假设读者具备基本的Linux操作技能以及对Tomcat有一定的了解。 #### 环境配置 - **...
在SSL双向认证中,不仅服务器需要验证客户端的身份,客户端也需要验证服务器的身份,从而提供了更高级别的安全保护。这种模式通常在银行、企业内部网络或高度敏感的信息交换中使用。 在SSL双向认证中,涉及的主要...
##### 二、Tomcat的PC版SSL双向配置步骤 1. **生成密钥**:创建服务端与客户端的公钥和私钥,这是SSL通信中保证数据安全的关键。 2. **证书交换**:客户端将证书导出并被服务端信任。服务端需要将客户端证书加入到...
本文将详细介绍如何在Tomcat 6服务器上实现SSL双向认证。 #### 一、理解SSL双向认证 **SSL双向认证**是一种更高级别的安全措施,它不仅验证了服务器的身份,还验证了客户端的身份。这种机制通常用于需要高度安全性...
Java环境中配置SSL双向认证是一项确保网络通信安全的重要技术,尤其在处理敏感数据传输时更为关键。SSL(Secure Sockets Layer)是一种网络安全协议,用于在互联网上建立加密连接,确保数据在传输过程中不被窃取或...
标题 "Apache 2 mod_jk tomcat 5 双向SSL认证 传递证书信息" 描述了一种在Apache HTTP服务器和Tomcat应用服务器之间进行安全通信的方法,即使用mod_jk模块实现双向SSL(Secure Sockets Layer)认证。双向SSL认证是一...
【描述】:本文档将详细介绍如何在Apache Tomcat服务器上实现SSL双向认证的配置过程,包括基础概念、SSL工作原理及具体的配置步骤。 【标签】:Tomcat, SSL, 配置SSL, 双向认证 【正文】: 一、SSL基础 1. **...
使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书
- 更多关于Java实现SSL双向认证的信息可参考:“java实现SSL双向认证”。 3. **OpenSSL命令行测试**: - 使用`OpenSSL`命令行工具直接连接到`Tomcat`服务器,以测试SSL双向验证过程。 ```bash openssl s_client...