本篇博文内容包括: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可以正常使用 小程序调用
SSL是一种网络安全协议,它为互联网上的数据传输提供了加密和身份验证服务。SSL双向认证,也称为mutual TLS或mTLS,是指服务器验证客户端的身份,同时客户端也验证服务器的身份。这种机制增强了通信的安全性,防止了...
### CXF实现SSL安全验证 在现代网络应用中,安全通信是至关重要的。Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF ...
**HTTPS 双向认证**是一种安全通信方式,在这种模式下,不仅服务器验证客户端的身份(通过客户端证书),客户端同样也要验证服务器的身份(通过服务器证书)。这种机制增强了数据传输的安全性,尤其是在敏感信息交换...
通过理解和应用上述知识点,开发者可以构建一个安全的、基于Spring Boot和Tomcat的Web应用,实现前后端数据的加密传输,保护用户信息不被非法获取,提高应用的安全性。在实际项目中,可以根据具体需求调整和扩展这些...
8. **安全配置**:如何设置用户访问权限,配置Realm(认证域)进行身份验证,以及使用SSL/TLS加密通信以增强安全性。 9. **日志和错误处理**:理解日志文件的位置和内容,以及如何调整日志级别和配置自定义日志记录...
Tomcat提供了多种安全特性来保护Web应用,包括身份验证、授权和加密通信。身份验证通常通过HTTP的基本认证、摘要认证或者表单认证实现,确保只有经过验证的用户才能访问受保护的资源。授权则依赖于角色基的安全模型...
为了确保服务器的安全,你需要配置Tomcat的server.xml文件,设置管理员账号,启用SSL/TLS支持以加密传输数据,并考虑限制哪些IP地址可以访问你的服务器。 总结起来,搭建Tomcat服务器涉及安装JDK,下载并解压Tomcat...
4. **建立安全连接**:在Android应用中,使用`HttpsURLConnection`或者第三方库如OkHttp,设置SSLContext并启用自定义的TrustManager和X509TrustManager,这些管理器会信任我们提供的证书。然后,通过调用`connect()...
5. **安全特性**:Tomcat支持基本的身份验证、授权和SSL加密,可以配置访问控制策略,保护Web应用程序的安全。 6. **部署**:应用可以通过WAR(Web Application Archive)文件进行部署,这是一种打包好的包含所有...
通过`conf/server.xml`和`conf/context.xml`,Tomcat可以设置用户认证、角色权限以及SSL/TLS加密等安全措施。 8. **错误处理** Tomcat在遇到异常时,会根据配置生成错误页面,并记录在日志文件中,帮助开发者诊断...
2. 安全性:通过SSL/TLS加密传输,使用WS-Security等标准实现身份验证和授权。 3. 性能优化:合理设置缓存,使用连接池,避免频繁的网络交互,提高服务响应速度。 4. 日志记录:对服务调用过程进行日志记录,便于...
8. **安全性**:Tomcat提供多种安全机制,如角色授权、SSL加密、form-based认证等,确保Web应用的安全性。 9. **JMX管理**:通过Java Management Extensions(JMX),开发者可以远程监控和管理Tomcat的运行状态,如...
5. **安全性**:Tomcat支持基本的身份验证机制,如FORM、BASIC和DIGEST,以及SSL/TLS加密,以保护Web应用的安全。 6. **线程模型**:Tomcat使用多线程模型处理并发请求,可以高效地利用系统资源。 7. **配置文件**...
7. **安全性**:Tomcat支持多种安全机制,如SSL/TLS加密、角色基础的访问控制(RBAC)、 FORM和DIGEST认证等。配置这些功能需要修改`server.xml`中的`<Connector>`元素和`web.xml`中的安全约束。 8. **性能优化**:...
HTTPS(Hypertext Transfer Protocol Secure)是一种通过网络在客户端和服务器之间进行安全通信的协议,它基于SSL/TLS协议,提供了数据加密、服务器身份验证、消息完整性检查等功能,确保了在网络传输过程中的数据...
- 考虑使用SSL/TLS加密连接以提高安全性。 - 对于大量远程调用,考虑使用连接池来复用JNDI连接,减少创建和销毁连接的成本。 - 根据负载调整Jboss和Tomcat的配置,如线程池大小、内存分配等。 6. **测试与调试**...
3. **SSL支持**:Tomcat可配置为使用HTTPS协议,提供加密的通信,确保数据传输安全。 **四、性能优化** 1. **连接器优化**:调整连接器的maxThreads参数,根据服务器硬件配置和预期负载来设定最大线程数。 2. **...
Tomcat的安全机制包括认证、授权、SSL/TLS加密和MIME类型安全。`Realm`接口负责验证用户身份,`Constraint`和`Role`定义了权限控制,`SSLHostConfig`配置SSL连接。 九、错误处理 Tomcat通过`ErrorReportValve`处理...
此外,还可以通过修改`web.xml`文件设置安全约束,如登录验证、角色权限等。 性能优化是Tomcat运维中的重要环节。8.5.34版本提供了许多可调整的参数,如最大线程数、最小空闲线程数、接受队列长度等,这些都可以在`...