本篇博文内容包括:tomcat单/双向SSL验证配置及使用java程序访问https服务。
文中涉及证书和安全的知识请参考上一篇:数字证书及安全加密(一)数字证书基础知识
http://sb33060418.iteye.com/admin/blogs/1998862
系统环境:
windows+jdk1.6.0_31+tomcat6.0+httpclient4.3.1
单向SSL配置
1.生成服务端证书
cd %JAVA_HOME%/bin
keytool -genkey -v -alias server -keyalg RSA -keystore D:/lib/server.keystore -storepass server
创建了别名为server的证书(jks类型),文件名为server.keystore,密码为server,密钥算法为RSA。
生成时需要输入多项证书信息,因不影响本次时间测试,不在此展示。
配置dns
编辑C:\Windows\System32\drivers\etc\hosts文件,在文件最后加上server的地址。
127.0.0.1 server
2.配置tomcat
配置tomcat/conf/server.xml,打开注释或加入以下配置
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
port="8443" minSpareThreads="5" maxSpareThreads="75"
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="D:/lib/server.keystore"
keystorePass="server"/>
配置中使用Http11NioProtocol协议和8443端口,sslProtocol为TLS,clientAuth为false表示不要求客户端使用SSL认证,证书库文件/密码为上一步骤生成的服务端证书库。
重启tomcat后,使用
http://server:8080/或
https://server:8443/都可以访问tomcat下应用,但是浏览器会提示不可信的证书(只有使用受信任的根证书发出证书才不会提示)。
3.配置应用路径
上一步配置后,tomcat/webapps目录下的应用的所有路径都可以被http/https访问。可以通过对单个应用的配置,使得该应用下的某些路径只能使用https访问。
a.普通web应用
对于普通web应用,需要在web.xml加入以下配置:
<!-- ssl -->
<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/rest/**</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
重新部署应用后,/rest/下所有路径只能使用https访问。
b.spring security应用
对于使用了spring security框架的应用,不需要配置web.xml,只需要在applicationContext-security.xml的<http></http>标签中加入以下配置并重新部署。
<intercept-url pattern="/rest/**" requires-channel="https">
4.httpclient访问
经过上面的配置后,使用浏览器可以访问https服务(提示不受信任的网站证书)。使用java访问时会报unable to find valid certification path to requested target(不受信任)或java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty(客户端信任库为空)异常,因为httpclient不信任该证书。
a.信任自签发证书
可以在java代码里设置相信自身签发的证书,就可以访问本地的https服务了。使用httpclient代码如下:
package test;
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.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.DefaultHttpClient;
public class TestServerSSL {
/**
* The main method.
*
* @param args
* the arguments
*/
public static void main(String[] args) {
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
// 信任自身签发证书
SSLSocketFactory socketFactory = new SSLSocketFactory(
new TrustSelfSignedStrategy());
Scheme sch = new Scheme("https", socketFactory, 8443);
httpclient.getConnectionManager().getSchemeRegistry().register(sch);
HttpGet httpget = new HttpGet(
"https://server:8443/api/rest/test");
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();
}
}
运行后可以看到httpclient从本地服务端取回的数据。
b.信任所有证书
如果希望程序不仅仅只是信任自签发证书,也可以信任其他所有证书,可以将
// 信任自身签发证书
SSLSocketFactory socketFactory = new SSLSocketFactory(
new TrustSelfSignedStrategy());
替换为
// 信任所有证书
X509TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0,
String arg1) throws CertificateException {
}
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
};
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory socketFactory = new SSLSocketFactory(sslcontext);
这样程序就能信任其他证书签发机构签发的证书了。
c.主机名校验
但httpclient只能连接至
https://server:8443/而不能访问localhost、127.0.0.1或本地ip,否则抛出异常
- javax.net.ssl.SSLException: hostname in certificate didn't match: <127.0.0.1> != <server>
可以在代码中允许SSL连接至任意主机名标示符,加入下行代码即可
socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
当然这段代码导致程序极不安全,因为可能证书被其他网站使用,证书的名称和网站域名不一致。
配置信任证书库
但上面的代码并不能限定程序只信任我们刚生成的server证书。
如果java程序访问此地址时在jre默认的信任库中找不到对方证书的颁发机构,则会抛出安全方面的异常。所以要将站方公钥存进一个信任证书库,并在环境变量中设定,表明信任此库中的公钥,才可以正常访问。
5.导出服务端证书
keytool -export -v -alias server -keystore D:/lib/server.keystore -rfc -file D:/lib/server.cer -storepass server
或:点击地址栏https》证书信息》详细信息》复制到文件》下一步》DER编码二进制X.509(.cer)》选择目录及文件名》确认
6.导入服务端证书至客户端信任库
keytool -import -v -alias server -file D:/lib/server.cer -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -storepass server
7.使用信任证书库
将socketFactory替换为以下代码
// trustStore
System.out.println("---trustStore---");
KeyStore trustStore = KeyStore.getInstance(KeyStore
.getDefaultType());
FileInputStream instream = new FileInputStream(
// 信任库路径
new File( "D:/Program Files (x86)/Java/jdk1.6.0_31/jre/lib/security/cacerts"));
try {
// 证书库密码
trustStore.load(instream, "server".toCharArray());
} finally {
instream.close();
}
Enumeration<String> e = trustStore.aliases();
while (e.hasMoreElements()) {
System.out.println(e.nextElement());
}
SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
程序会读取上一步导入的信任库来建立SSL链接。在控制台可以看到证书库中包含的证书别名。
8.web应用
web应用在服务器启动时,会自动读取jdk默认的证书库来访问https服务。
使用spring security oauth2框架,通过https协议来访问rest服务时,通过上述配置步骤可以验证通过。
分享到:
相关推荐
tomcat 配置ssl加密通讯tomcat 配置ssl加密通讯tomcat 配置ssl加密通讯
Tomcat 配置SSL完美 https可以正常使用 小程序调用Tomcat 配置SSL完美 https可以正常使用 小程序调用Tomcat 配置SSL完美 https可以正常使用 小程序调用
本资源包含一个 openssl 工具安装包 Win32OpenSSL-1_1_0c.exe,一个 tomcat 进行配置 ssl 证书、完全 TLS v1.2、完全正向加密的 server.xml、startup.bat 配置文件。关于tomcat 进行配置 ssl 证书、完全 TLS v1.2、...
理解单向双向认证: 单向认证:客户端向服务器发送消息,服务器接到消息后,用服务器端的密钥库...服务器用私钥对数据进行解密,这就完成了客户端 和服务器之间通信的安全问题,但是单向认证没有验证客户端的合法性。
说明tomcat如何配置https单向加密,如何使用jdk提供的keytool建立服务器证书
当客户机使用SSL加密模式连接服务器并控制服务器后,在网络中传输的所有信息都是加密过的,黑客使用sniffer等工具无法抓取到可用的数据包。从而真真正正的将远程桌面的安全进行到底。远程操作界面也出现了SSL加密的...
3. 使用新安装的国密浏览器访问 https://127.0.0.1 地址,浏览器通过GMSSL_ECC_WITH_SM4_CBC_SM3国密密码套件与TOMCAT服务器建立国密SSL规范的单向加密通道,并打开指定网页 以上步骤经过实际测试 感谢大宝CA...
关于证书和数字加密方面的信息,是整个数字证书和加密方面的概要介绍。
使用AES256加密技术实现tomcat7对连接池数据库密码加密解密,资源中包含加密小程序,小程序实现加密,tomcat中实现解密,方便客户自己修改数据库密码且是密文!支持多操作系统如:linux mac os 文件太多分成两部分请...
tomcat的8005端口是用来关闭服务的,如果服务关闭不了那就执行下边操作,如果服务能正常访问,能正常关闭,那就不需要执行下边操作
RSA密钥 加密 解密 数字签名 数字证书 tomcat ssl https:里面有加密、解密、数字签名、验前,数字证书,已经tomcat配置https的方法!还保留部分收集到的资料。含源码
zabbix配置数字证书加密.docx
学习RSA算法,读取数字证书中的私钥对文件进行加密,使用数字证书的公钥解密,这种方式就是RSA算法.
TOMCAT8 JNDI对用户名和密码加密
Android安全加密:数字签名和数字证书 Android安全加密:Https编程 以上学习所有内容,对称加密、非对称加密、消息摘要、数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识。数字证书是密码学里的...
Tomcat配置数据库连接加密访问
在win32平台下利用openssl编写ssl通信程序时需要进行加密证书的验证,本文档是客户端和服务端的证书文件。
java rsa证书加密,crt、pem、pfx、cer等 内附工具
Windows下用SSL实现加密通讯Demo。内含win32 realease版本的openssl-1.1.0f静态库,及用其生成的加密数字证书文件。可参见:http://blog.csdn.net/ljttianqin/article/details/73498453
使用AES256加密技术实现tomcat7对连接池数据库密码加密解密,资源中包含加密小程序,小程序实现加密,tomcat中实现解密,方便客户自己修改数据库密码且是密文!