博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SSL单向认证Java实现 Tomcat篇
阅读量:5920 次
发布时间:2019-06-19

本文共 3430 字,大约阅读时间需要 11 分钟。

hot3.png

单向验证,客户机只验证服务器的证书,服务器不验证客户机的证书。所以只需要生成服务器端的keystore.

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"
2. 从keystore中导出别名为server的服务端证书.
keytool -export -alias server -keystore serverKeystore.jks -storepass 123456 -file server.cer
 
3. 将server.cer导入客户端的信任证书库clientTruststore.jks。
 
 keytool -import -alias trustServer -file server.cer -keystore clientTruststore.jks -storepass 123456
 
 服务器端: serverKeystore.jks 
 客户端:   clientTruststore.jks
 
4. 在tomcat 配置server.xml

Xml代码  收藏代码

  1. <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  

  2.                  maxThreads="150" scheme="https" secure="true"  

  3.              clientAuth="false" sslProtocol="TLS"   

  4.              keystoreFile="keystore/serverKeystore.jks" keystorePass="123456"  />  

5. 客户端代码

Java代码  收藏代码

  1. /** 

  2.  *  

  3.  */  

  4. package com.ssl.http;  

  5.   

  6. import java.io.File;  

  7. import java.io.FileInputStream;  

  8. import java.security.KeyStore;  

  9.   

  10. import org.apache.http.HttpEntity;  

  11. import org.apache.http.HttpResponse;  

  12. import org.apache.http.client.methods.HttpGet;  

  13. import org.apache.http.conn.scheme.Scheme;  

  14. import org.apache.http.conn.ssl.SSLSocketFactory;  

  15. import org.apache.http.impl.client.DefaultHttpClient;  

  16.   

  17. /** 

  18.  *  

  19.  * @author kevin 

  20.  * 

  21.  */  

  22. public class ClientOneWaySSL {  

  23.   

  24.     public final static void main(String[] args) throws Exception {  

  25.         DefaultHttpClient httpclient = new DefaultHttpClient();  

  26.   

  27.         KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());          

  28.         FileInputStream instream = new FileInputStream(new File("com/ssl/http/clientTruststore.jks"));   

  29.         try {  

  30.             trustStore.load(instream, "123456".toCharArray());  

  31.         } finally {  

  32.             instream.close();  

  33.         }  

  34.           

  35.         SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);  

  36.         Scheme sch = new Scheme("https", socketFactory, 8443);  

  37.         httpclient.getConnectionManager().getSchemeRegistry().register(sch);  

  38.   

  39.         HttpGet httpget = new HttpGet("https://w03gca01a/");  

  40.   

  41.         System.out.println("executing request" + httpget.getRequestLine());  

  42.           

  43.         HttpResponse response = httpclient.execute(httpget);  

  44.         HttpEntity entity = response.getEntity();  

  45.   

  46.         System.out.println("----------------------------------------");  

  47.         System.out.println(response.getStatusLine());  

  48.         if (entity != null) {  

  49.             System.out.println("Response content length: " + entity.getContentLength());  

  50.         }  

  51.         if (entity != null) {  

  52.             entity.consumeContent();  

  53.         }  

  54.   

  55.         // When HttpClient instance is no longer needed,   

  56.         // shut down the connection manager to ensure  

  57.         // immediate deallocation of all system resources  

  58.         httpclient.getConnectionManager().shutdown();          

  59.     }  

  60.   

  61. }  

 

6. 运行成功打印如下:

Console代码  收藏代码

  1. executing requestGET https://w03gca01a/ HTTP/1.1  

  2. ----------------------------------------  

  3. HTTP/1.1 200 OK  

  4. Response content length: 7347  

 

备注:

A. 如出现如下error,请配置C:\WINDOWS\system32\drivers\etc\hosts, 将“127.0.0.1     w03gca01a” 加在hosts文件中

Exception代码  收藏代码

  1. executing requestGET https://w03gca01a/ HTTP/1.1  

  2. Exception in thread "main" javax.net.ssl.SSLException: hostname in certificate didn't match: <w03gca01a> != <localhost>  

  3.     at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:220)  

  4.     at org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)  

  5.       

 

B. 本文用到 httpcore-4.0.1.jar httpclient-4.0.1.jar httpmime-4.0.1.jar,下载地址:

http://hc.apache.org/downloads.cgi

 

 

 

转载于:https://my.oschina.net/rock912/blog/609758

你可能感兴趣的文章
【PHP原生】CURL请求
查看>>
js 解决由于&#65279(bom文件格式)产生的空白行
查看>>
负载平衡问题(费用流)
查看>>
mysql
查看>>
i++和++i
查看>>
This Handler class should be static or leaks might occur.
查看>>
浏览器缓存原理(转载)
查看>>
1 JPA入门----项目搭建以及CRUD
查看>>
sql盲注及其相关方法
查看>>
2011年超炫的CSS3教程
查看>>
go语言之抛出异常
查看>>
在VC6.0++ 下的调试
查看>>
前端 css position
查看>>
《梦断代码》阅读笔记Ⅰ
查看>>
IOS Tutorial -- 1) Objective-C Basics
查看>>
一些C++11语言新特性 - Uniform Initialization
查看>>
快速幂取模
查看>>
Maven + Eclipse + Tomcat - 开启项目调试之旅(转载)
查看>>
umount 强制卸载
查看>>
php
查看>>