`
fireflyjava
  • 浏览: 186260 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SSL双向认证Java实现 Tomcat篇

    博客分类:
  • SSL
阅读更多

双向验证,在客户机连接服务器时,客户机验证服务器的证书,服务器验证客户机的证书,链接双方都要对彼此的数字证书进行验证,保证这是经过授权的才能够连接。

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

 

分享到:
评论
3 楼 hayoouch 2014-12-05  
很好,赞!!!
2 楼 冷静 2012-03-20  
javax.net.ssl.SSLException: hostname in certificate didn't match

解决方法是:
socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
1 楼 浅绘墨漠 2012-02-03  
你好。按照你的方法进行了试验,出现的错误就是hostname in certificate didn't match: <w03gca01a/127.0.0.1> != <w03gca01a>。已经按照您说的解决办法去做,可是还是报错。不知道博主什么时候有时间可不可以在线向您请教?

相关推荐

    tomcat实现SSL双向认证

    Tomcat 实现 SSL 双向认证 Tomcat 是一个流行的开源 Web 应用服务器,而 SSL(Secure Sockets Layer)是一种常用的安全协议,用于确保 Web 应用程序之间的数据传输安全。本文将详细介绍如何在 Tomcat 中实现 SSL ...

    Tomcat_SSL.rar_JAVA SSL _ssl_ssl java_tomcat_tomcat ssl

    4. **启用Client Authentication**:如果需要双向认证(也称为mutual SSL),可以将`clientAuth`属性设置为"want"或"need"。"want"表示如果客户端有证书,则验证,否则继续连接;"need"表示客户端必须提供证书才能...

    Tomcat下使用ssl实现双向认证[网络安全]

    总结,Tomcat下的SSL双向认证是通过配置Keystore、Truststore,修改Tomcat的服务器配置,并确保客户端正确配置来实现的。这一过程增强了服务器与客户端之间的通信安全性,对于保护敏感数据传输尤其重要。

    用tomcat和openSSL构建https双向认证

    这是我实战的笔记,全程直播。 #### Tomcat和Openssl构建HTTPS双向认证 ###### ...二、tomcat实现双向认证 1、创建服务器信任的CA证书库 2、配置Tomcat支持HTTPS双向认证(服务器将认证客户端证书)

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

    在IT行业中,安全通信是至关重要的,特别是...通过上述步骤,你可以在Tomcat上实现一个完整的SSL双向认证环境,并利用Java和Apache HttpClient进行安全的通信。这个过程对于理解网络安全和提高应用安全性具有重要意义。

    Tomcat6和5.5配置使用SSL双向认证(使用openssl生成密钥).rar

    在这个场景中,我们将探讨如何在Tomcat 6和5.5版本中配置SSL双向认证,并使用openssl工具生成必要的密钥文件。 **一、生成CA证书** 创建一个自签名的根证书颁发机构(Root CA)是SSL双向认证的第一步。这可以通过...

    Tomcat6和5.5配置使用SSL双向认证(使用openssl生成密钥)

    ### Tomcat6 和 5.5 配置使用 SSL 双向认证(使用 OpenSSL 生成密钥) 在本文中,我们将详细介绍如何通过 OpenSSL 工具为 Tomcat 服务器配置 SSL 双向认证的过程。SSL(Secure Sockets Layer)是用于加密互联网通信...

    tomcat 实现https 双向认证通信

    本文主要介绍如何在Linux平台上,使用Apache Tomcat、OpenSSL以及Java Keytool来实现HTTPS通信,并进一步完成双向认证的功能。文章假设读者具备基本的Linux操作技能以及对Tomcat有一定的了解。 #### 环境配置 - **...

    ssl双向认证密钥

    在SSL双向认证中,不仅服务器需要验证客户端的身份,客户端也需要验证服务器的身份,从而提供了更高级别的安全保护。这种模式通常在银行、企业内部网络或高度敏感的信息交换中使用。 在SSL双向认证中,涉及的主要...

    tomcat android 双向ssl通信

    ##### 二、Tomcat的PC版SSL双向配置步骤 1. **生成密钥**:创建服务端与客户端的公钥和私钥,这是SSL通信中保证数据安全的关键。 2. **证书交换**:客户端将证书导出并被服务端信任。服务端需要将客户端证书加入到...

    Tomcat6配置使用SSL双向认证

    本文将详细介绍如何在Tomcat 6服务器上实现SSL双向认证。 #### 一、理解SSL双向认证 **SSL双向认证**是一种更高级别的安全措施,它不仅验证了服务器的身份,还验证了客户端的身份。这种机制通常用于需要高度安全性...

    Java环境中配置SSL双向认证.doc

    Java环境中配置SSL双向认证是一项确保网络通信安全的重要技术,尤其在处理敏感数据传输时更为关键。SSL(Secure Sockets Layer)是一种网络安全协议,用于在互联网上建立加密连接,确保数据在传输过程中不被窃取或...

    Apache 2 mod_jk tomcat 5 双向SSL认证 传递证书信息

    标题 "Apache 2 mod_jk tomcat 5 双向SSL认证 传递证书信息" 描述了一种在Apache HTTP服务器和Tomcat应用服务器之间进行安全通信的方法,即使用mod_jk模块实现双向SSL(Secure Sockets Layer)认证。双向SSL认证是一...

    tomcat+SSL

    【描述】:本文档将详细介绍如何在Apache Tomcat服务器上实现SSL双向认证的配置过程,包括基础概念、SSL工作原理及具体的配置步骤。 【标签】:Tomcat, SSL, 配置SSL, 双向认证 【正文】: 一、SSL基础 1. **...

    JAVA NIO MINA2调用大宝CA密码安全套件实现国密SSL安全通道,1.0.1版本,含通信示例代码

    使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书

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

    - 更多关于Java实现SSL双向认证的信息可参考:“java实现SSL双向认证”。 3. **OpenSSL命令行测试**: - 使用`OpenSSL`命令行工具直接连接到`Tomcat`服务器,以测试SSL双向验证过程。 ```bash openssl s_client...

Global site tag (gtag.js) - Google Analytics