`
sb33060418
  • 浏览: 152034 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数字证书及安全加密(三)tomcat双向SSL验证及服务调用

阅读更多
本篇博文内容包括:tomcat双向SSL验证配置及使用java程序访问https服务。

系统环境:
windows+jdk1.6.0_31+tomcat6.0+httpclient4.3.1

双向SSL配置
上一篇博文中生成了客户端证书来搭建单项SSL验证,双向SSL就是服务器端也要求客户端使用受信任的证书来访问。

1.生成证书
需要生成客户端证书(含私钥)并将客户端公钥证书导入至服务端信任证书库。

    生成客户端证书
cd %JAVA_HOME%/bin
keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore D:/lib/client.p12 -storepass client

创建了别名为server的证书(pcks12类型,含密钥的用户证书交换类型),文件名为client.p12,密码为client,密钥算法为RSA。
生成时需要输入多项证书信息,因不影响本次时间测试,不在此展示。

    导出客户端证书
jdk keytool无法直接导入pcks12类型证书,需要从pcks12证书中导出cer格式证书(公钥证书,才能导入至证书库中
javakeytool -export -v -alias client -keystore D:/lib/client.p12 -storetype PKCS12 -rfc -file D:/lib/client.cer -storepass client

导出了名为client.cer的公钥证书,证书库密码为client

    导入客户端证书至服务端信任库
keytool -import -v -file D:/lib/client.cer -keystore D:/lib/servertrust.keystore -alias client -keypass client -storepass servertrust

客户端公钥证书被导入到了名为servertrust.keystore的证书库中,别名为client,证书密码为client,证书库密码为servertrust。

    查看服务端信任库
keytool -list -v -keystore D:/lib/servertrust.keystore -storepass servertrust

可以看到服务端信任库中包含客户端公钥证书
  • 您的 keystore 包含 1 输入
  • 别名名称: client
  • 创建日期: 2014-1-2
  • 输入类型: trustedCertEntry
  • 所有者:CN=client, OU=client, O=client, L=client, ST=client, C=US

2.配置tomcat
配置conf/server.xml,找到上一篇中配置的
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443"></Connector>
标签,将
clientAuth="false"
修改为
clientAuth="true"
使服务端要求验证客户端证书。
在标签中加入服务端信任库属性
truststoreFile="D:/lib/servertrust.keystore" truststorePass="servertrust"

使tomcat信任servertrust.keysto中的公钥证书。

重启tomcat后,访问https://server:8443/发现无法访问,报ssl错误,因为服务端要求客户端证书,而客户端没有对应的证书(含私钥)。

3.导入客户端证书
首先使用浏览器测试客户端证书。

    浏览器客户端导入客户端证书
双击客户端(私钥)证书D:/lib/client.p12,按提示进行操作,即可将客户端证书导入浏览器。
或:打开IE》选项》内容》证书》导入》选择证书类型p12、选择证书》输入客户端证书密码》确认,也可导入客户端证书。
导入客户端证书成功后,可以通过浏览器访问https://server:8443/

    java客户端导入客户端证书
通过jdk访问时报java.net.SocketException: Software caused connection abort: recv failed,也是因为客户端没有受信任的证书。java程序不会导入浏览器中的客户端证书,需要我们手工指定客户端证书。
在上一篇已将服务端公钥证书导入至jdk信任证书库中(客户端信任服务端证书)后,只需要在jvm参数中加入
-Djavax.net.ssl.keyStore=D:/lib/client.p12 -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword=client
即在java程序中使用客户端自身的证书,程序即可访问https://server:8443/

4.指定客户端信任库
这里配置中使用的是jdk系统默认的证书库文件,程序中也可以指定使用其他信任证书库文件。

    导入服务端证书至客户端信任库
keytool -import -v -alias server -file D:/lib/server.cer -keystore D:/lib/clienttrust.keystore -keypass server -storepass clienttrust

    查看客户端信任库
keytool -list -v -keystore D:/lib/clienttrust.keystore -storepass clienttrust

    配置客户端信任库
删除jdk默认信任证书库文件"%JAVA_HOME%\jre\lib\security\cacerts",再在jvm参数中加入
-Djavax.net.ssl.trustStore=D:/lib/clienttrust.keystore -Djavax.net.ssl.trustStorePassword=clienttrust -Djavax.net.ssl.trustStoreType=JKS
程序即可使用该jvm访问https。

web应用在服务器启动时,会自动读取jdk默认的证书库来访问https服务。

使用spring security oauth2框架,通过https协议来访问rest服务时,通过上述配置步骤可以验证通过。

5.使用HttpClient访问双向SSL服务
Test类代码如下:
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {
			System.out.println("---keyStore---");
			KeyStore keyStore = KeyStore.getInstance("PKCS12");
			FileInputStream keyinstream = new FileInputStream(new File(
					"D:/lib/client.p12"));
			try {
				keyStore.load(keyinstream, "client".toCharArray());
			} finally {
				keyinstream.close();
			}
			Enumeration<String> e = keyStore.aliases();
			while (e.hasMoreElements()) {
				System.out.println(e.nextElement());
			}
			System.out.println("---trustStore---");
			KeyStore trustStore = KeyStore.getInstance(KeyStore
					.getDefaultType());
			FileInputStream instream = new FileInputStream(new File(
					"D:/lib/clienttrust.keystore"));
			try {
				trustStore.load(instream, "clienttrust".toCharArray());
			} finally {
				instream.close();
			}
			e = trustStore.aliases();
			while (e.hasMoreElements()) {
				System.out.println(e.nextElement());
			}
			// 可以不指定trustStore,直接使用系统默认位置%JAVA_HOME%\jre\lib\security\cacerts与new
			// SSLSocketFactory(keyStore,"client")
			SSLSocketFactory socketFactory = new SSLSocketFactory(keyStore,
					"client", trustStore);
			Scheme sch = new Scheme("https", socketFactory, 8443);
			httpclient.getConnectionManager().getSchemeRegistry().register(sch);
			HttpGet httpget = new HttpGet(
					"https://server:8443/api/rest/test?access_token=86cb4392-425a-4b30-8e31-7250661a15c4");
			System.out.println("executing request" + httpget.getRequestLine());
			HttpResponse response = httpclient.execute(httpget);
			System.out.println("-------------response-------------");
			System.out.println(response.getStatusLine());
			HttpEntity entity = response.getEntity();
			System.out.println(EntityUtils.toString(response.getEntity()));			if (entity != null) {
				entity.consumeContent();
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		httpclient.getConnectionManager().shutdown();

程序中使用client.p12作为客户端证书(含私钥,公钥证书client.cer已导入服务端信任证书库servertrust.jks),clienttrust.keystore作为客户端信任证书库(含服务端公钥证书server.cer),c/s两端服务器校验都成功后,SSL通道建立完成,即可直接发送信息。
分享到:
评论

相关推荐

    Tomcat 配置SSL完美 https可以正常使用 小程序调用

    Tomcat 配置SSL完美 https可以正常使用 小程序调用Tomcat 配置SSL完美 https可以正常使用 小程序调用Tomcat 配置SSL完美 https可以正常使用 小程序调用

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

    SSL是一种网络安全协议,它为互联网上的数据传输提供了加密和身份验证服务。SSL双向认证,也称为mutual TLS或mTLS,是指服务器验证客户端的身份,同时客户端也验证服务器的身份。这种机制增强了通信的安全性,防止了...

    CXF实现SSL安全验证

    ### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...

    https双向认证证书配置详解

    **HTTPS 双向认证**是一种安全通信方式,在这种模式下,不仅服务器验证客户端的身份(通过客户端证书),客户端同样也要验证服务器的身份(通过服务器证书)。这种机制增强了数据传输的安全性,尤其是在敏感信息交换...

    spring(tomcat)前后端数据加密传输demo

    通过理解和应用上述知识点,开发者可以构建一个安全的、基于Spring Boot和Tomcat的Web应用,实现前后端数据的加密传输,保护用户信息不被非法获取,提高应用的安全性。在实际项目中,可以根据具体需求调整和扩展这些...

    Tomcat服务器配置 视频教程 Tomcat视频

    8. **安全配置**:如何设置用户访问权限,配置Realm(认证域)进行身份验证,以及使用SSL/TLS加密通信以增强安全性。 9. **日志和错误处理**:理解日志文件的位置和内容,以及如何调整日志级别和配置自定义日志记录...

    WEB服务器工作机制由浅至深(4):【How Tomcat Works】第10章翻译分析及Tomcat安全性探讨

    Tomcat提供了多种安全特性来保护Web应用,包括身份验证、授权和加密通信。身份验证通常通过HTTP的基本认证、摘要认证或者表单认证实现,确保只有经过验证的用户才能访问受保护的资源。授权则依赖于角色基的安全模型...

    tomcat服务器搭建

    为了确保服务器的安全,你需要配置Tomcat的server.xml文件,设置管理员账号,启用SSL/TLS支持以加密传输数据,并考虑限制哪些IP地址可以访问你的服务器。 总结起来,搭建Tomcat服务器涉及安装JDK,下载并解压Tomcat...

    Android TLS1.2双向认证demo

    4. **建立安全连接**:在Android应用中,使用`HttpsURLConnection`或者第三方库如OkHttp,设置SSLContext并启用自定义的TrustManager和X509TrustManager,这些管理器会信任我们提供的证书。然后,通过调用`connect()...

    小型服务器tomcat5.5

    5. **安全特性**:Tomcat支持基本的身份验证、授权和SSL加密,可以配置访问控制策略,保护Web应用程序的安全。 6. **部署**:应用可以通过WAR(Web Application Archive)文件进行部署,这是一种打包好的包含所有...

    tomcat服务器工作原理

    通过`conf/server.xml`和`conf/context.xml`,Tomcat可以设置用户认证、角色权限以及SSL/TLS加密等安全措施。 8. **错误处理** Tomcat在遇到异常时,会根据配置生成错误页面,并记录在日志文件中,帮助开发者诊断...

    Java webservice cxf客户端调用demo和服务端

    2. 安全性:通过SSL/TLS加密传输,使用WS-Security等标准实现身份验证和授权。 3. 性能优化:合理设置缓存,使用连接池,避免频繁的网络交互,提高服务响应速度。 4. 日志记录:对服务调用过程进行日志记录,便于...

    Tomcat深入剖析pdf+源码(Tomcat运行原理)

    8. **安全性**:Tomcat提供多种安全机制,如角色授权、SSL加密、form-based认证等,确保Web应用的安全性。 9. **JMX管理**:通过Java Management Extensions(JMX),开发者可以远程监控和管理Tomcat的运行状态,如...

    apache-tomcat-6.0.18 tomcat服务器

    5. **安全性**:Tomcat支持基本的身份验证机制,如FORM、BASIC和DIGEST,以及SSL/TLS加密,以保护Web应用的安全。 6. **线程模型**:Tomcat使用多线程模型处理并发请求,可以高效地利用系统资源。 7. **配置文件**...

    开发Java的Tomcat6.0版本的服务器

    7. **安全性**:Tomcat支持多种安全机制,如SSL/TLS加密、角色基础的访问控制(RBAC)、 FORM和DIGEST认证等。配置这些功能需要修改`server.xml`中的`&lt;Connector&gt;`元素和`web.xml`中的安全约束。 8. **性能优化**:...

    https原理及tomcat配置https方法

    HTTPS(Hypertext Transfer Protocol Secure)是一种通过网络在客户端和服务器之间进行安全通信的协议,它基于SSL/TLS协议,提供了数据加密、服务器身份验证、消息完整性检查等功能,确保了在网络传输过程中的数据...

    (sshproject)tomcat调用jboss上的ejb3.0

    - 考虑使用SSL/TLS加密连接以提高安全性。 - 对于大量远程调用,考虑使用连接池来复用JNDI连接,减少创建和销毁连接的成本。 - 根据负载调整Jboss和Tomcat的配置,如线程池大小、内存分配等。 6. **测试与调试**...

    Tomcat6.0(apachetomcat.exe)

    3. **SSL支持**:Tomcat可配置为使用HTTPS协议,提供加密的通信,确保数据传输安全。 **四、性能优化** 1. **连接器优化**:调整连接器的maxThreads参数,根据服务器硬件配置和预期负载来设定最大线程数。 2. **...

    Tomcat8.0底层源码

    Tomcat的安全机制包括认证、授权、SSL/TLS加密和MIME类型安全。`Realm`接口负责验证用户身份,`Constraint`和`Role`定义了权限控制,`SSLHostConfig`配置SSL连接。 九、错误处理 Tomcat通过`ErrorReportValve`处理...

    tomcat-8.5.34

    此外,还可以通过修改`web.xml`文件设置安全约束,如登录验证、角色权限等。 性能优化是Tomcat运维中的重要环节。8.5.34版本提供了许多可调整的参数,如最大线程数、最小空闲线程数、接受队列长度等,这些都可以在`...

Global site tag (gtag.js) - Google Analytics