数字证书及安全加密(二)tomcat单向SSL验证及服务调用
本篇博文内容包括:tomcat单/双向SSL验证配置及使用java程序访问https服务。
文中涉及证书和安全的知识请参考上一篇:数字证书及安全加密(一)数字证书基础知识http://sb33060418.iteye.com/admin/blogs/1998862
系统环境:
windows+jdk1.6.0_31+tomcat6.0+httpclient4.3.1
单向SSL配置
1.生成服务端证书
配置中使用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加入以下配置:
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代码如下:
运行后可以看到httpclient从本地服务端取回的数据。
b.信任所有证书
如果希望程序不仅仅只是信任自签发证书,也可以信任其他所有证书,可以将
7.使用信任证书库
将socketFactory替换为以下代码// trustStoreSystem.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服务时,通过上述配置步骤可以验证通过。