一、服务端

1. 生成密钥库 --- kserver.keystore 是给服务端用的,其中保存着自己的私钥

keytool -genkey -alias serverkey -keystore ./kserver.keystore -dname CN=test-server,OU=CTF,O=CTF1,L=SHH,ST=SHH,C=CN -validity 36500 -keysize 1024 -keyalg RSA -storepass 123456 -v

2. 导出密钥证书kserver.cer --- 根据私钥,导出服务端证书

keytool -export -alias serverkey -keystore ./kserver.keystore  -file ./kserver.cer -storepass 123456

3. 生成服务端信任密钥库 (可以与密钥库使用同一个)

keytool -genkey -alias servertrustkey -keystore ./kservertrust.keystore -dname CN=test-server-trust,OU=CTF,O=CTF1,L=SHH,ST=SHH,C=CN -validity 36500 -keysize 1024 -keyalg RSA -storepass 123456trust -v

4. 将证书导入客户端信任库(客户端信任库在后续创建)

keytool -import -alias serverkey -file kserver.cer -keystore kclienttrust.keystore

5. 查看证书内容

keytool -list -v -keystore kserver.keystore -storepass 123456

keytool -list -v -keystore kservertrust.keystore -storepass 123456trust

二、客户端

1. 生成密钥库 --- kclient.keystore 是给服务端用的,其中保存着自己的私钥

 keytool -genkey -alias clientkey -keystore ./kclient.keystore -dname CN=test-client,OU=CTF,O=CTF1,L=SHH,ST=SHH,C=CN -validity 36500 -keysize 1024 -keyalg RSA -storepass 123456 -v

2. 导出密钥证书 kclient.cer --- 根据私钥,导出服务端证书

keytool -export -alias clientkey -keystore ./kclient.keystore  -file ./kclient.cer -storepass 123456

3. 生成客户端信任密钥库

keytool -genkey -alias clienttrustkey -keystore ./kclienttrust.keystore -dname CN=test-client-trust,OU=CTF,O=CTF1,L=SHH,ST=SHH,C=CN -validity 36500 -keysize 1024 -keyalg RSA -storepass 123456trust -v

此时得到如下6个文件:

4. 将证书导入服务端信任库

keytool -import -alias clientkey -file kclient.cer -keystore kservertrust.keystore

5. 查看证书内容

keytool -list -v -keystore kclient.keystore -storepass 123456keytool -list -v -keystore kclienttrust.keystore -storepass 123456trust

注:后续代码中会用到:

服务端(tomcat/weblogic):kserver.keystore、kservertrust.keystore

客户端(程序):kclient.keystore、kclienttrust.keystore

三、服务器配置

1.  Tomcat 服务器配置

Tomcat安装目录/conf/server.xml  中添加,其中clientAuth=true代表开启双向验证

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"maxThreads="150" scheme="https" secure="true"clientAuth="true" sslProtocol="TLS"keystoreFile="/home/https/kserver.keystore" keystorePass="123456"truststoreFile="/home/https/kserver.keystore" truststorePass="123456"/>

2. Weblogic服务器配置

最后激活重新部署。

四、自签名证书

自签名证书:对于每一个要链接的服务器,都要保存一个证书的验证副本,而且一旦服务器更换证书,所有客户端就需要重新部署这些副本。要解决这一问题可以使用openssl,或者使用第三方信任机构颁发的证书。

五、HttpsUtil工具类 - 客户端

/*** 使用httpclient4.x.x实现https双向验证*/
public class Https4client {public static void main(String[] args) throws Exception {HttpClient httpclient = getHttpClient();HttpEntity entity=null;//1.get测试
//        HttpGet get = new HttpGet("https://自己服务器IP:端口/test/doget");
//        HttpResponse rsp = httpclient.execute(get);//2.post测试HttpPost post = new HttpPost("https://自己服务器IP:端口/test/dopost");StringEntity stringEntity = new StringEntity("test post method!", Charset.forName("UTF-8"));post.setEntity(stringEntity);HttpResponse rsp = httpclient.execute(post);entity =  rsp.getEntity();//用EntityUtils.toString()这个静态方法将HttpEntity转换成字符串,防止服务器返回的数据带有中文,所以在转换的时候将字符集指定成utf-8就可以了String result= EntityUtils.toString(entity, "UTF-8");System.out.println("-------------------------result:"+result+"-------------");if(rsp.getStatusLine().getStatusCode()==200){System.out.println(rsp.getStatusLine().getStatusCode()+"-----------success------------------");}else{System.out.println(rsp.getStatusLine().getStatusCode()+"------------------fail-----------");}}public static HttpClient getHttpClient() throws Exception{//设置http参数HttpParams params = new BasicHttpParams();HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);HttpProtocolParams.setContentCharset(params, "UTF-8");HttpProtocolParams.setUseExpectContinue(params, true);HttpConnectionParams.setConnectionTimeout(params, 5000);//连接超时HttpConnectionParams.setSoTimeout(params, 5000);//请求超时SchemeRegistry schReg = new SchemeRegistry();schReg.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));SSLSocketFactory sf = getBidirectionalSSL();schReg.register(new Scheme("https", 443, sf));PoolingClientConnectionManager pccm = new PoolingClientConnectionManager(schReg);pccm.setMaxTotal(100); // 客户端总并行链接最大数pccm.setDefaultMaxPerRoute(20); // 发送到指定主机的最大连接数DefaultHttpClient httpclient = new DefaultHttpClient(pccm, params);//        //设置代理 DNS
//        HttpHost proxy = new HttpHost("10.112.24.30", 8019);
//        httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);return httpclient;}/*** 双向ssl 设置客户端证书* @return*/public static SSLSocketFactory getBidirectionalSSL() throws Exception {//客户端证书库,上面生成的kclient.keystoreFile certFile = new File(GetConfigUtil.getProjectConfig("ssl.client.keystore"));KeyStore ks = null;try {ks = KeyStore.getInstance("JKS");} catch (KeyStoreException e) {throw new Exception(e);}//密钥库密码 123456String password = "";try {password = GetConfigUtil.getProjectConfig("client.store.file.password");ks.load(new FileInputStream(certFile), password.toCharArray());} catch (NoSuchAlgorithmException e) {throw new Exception(e);} catch (CertificateException e) {throw new Exception(e);} catch (FileNotFoundException e) {throw new Exception(e);} catch (IOException e) {throw new Exception(e);}KeyManagerFactory kmf = null;try {kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());} catch (NoSuchAlgorithmException e) {throw new Exception(e);}try {kmf.init(ks, password.toCharArray());} catch (UnrecoverableKeyException e) {throw new Exception(e);} catch (KeyStoreException e) {throw new Exception(e);} catch (NoSuchAlgorithmException e) {throw new Exception(e);}SSLContext sslContext = null;try {sslContext = SSLContext.getInstance("TLS");} catch (NoSuchAlgorithmException e) {throw new Exception(e);}try {sslContext.init(kmf.getKeyManagers(), getTrustManager(), null);} catch (KeyManagementException e) {throw new Exception(e);} catch (Exception e) {throw new Exception(e);}SSLSocketFactory factory = new SSLSocketFactory(sslContext,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);return factory;}/*** 双向SSL 认证服务器的证书* @return* @throws Exception*/public static TrustManager[] getTrustManager() throws Exception{TrustManager[] trustManager=null;String password = "";//上面生成的kclienttrust.keystoreString publicKey = GetConfigUtil.getProjectConfig("ssl.clienttrust.keystore");if(null ==publicKey ||"".equals(publicKey)){throw new RuntimeException("信任库证书未配置");}else{//第三方机构服务器的公钥证书File publicFile = new File(publicKey);KeyStore pks = KeyStore.getInstance("JKS");password = GetConfigUtil.getProjectConfig("client.trust.file.password");pks.load(new FileInputStream(publicFile), password.toCharArray());TrustManagerFactory tmf = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());tmf.init(pks);trustManager = tmf.getTrustManagers();}return trustManager;}}

GetConfigUtil我就不贴了吧,还是要自己动动脑子的,不能彻底无脑CV流~~

算了我还是分享出来吧

项目地址:https://gitee.com/defense-of-the-anciant2/market-purchase

SSL双向验证--keytool实现自签名证书相关推荐

  1. Debain8 Tomcat8 JDK8 实现SSL双向验证

    先说说环境: 系统:Debain8.Tomcat8.JDK8 实现目标:使用JDK自带的keytool实现SSL双向加密 1.为服务器生成证书 keytool -genkey -v -alias to ...

  2. 请给你的短信验证码接口加上SSL双向验证

    序言 去年年底闲来几天,有位同事专门在网上找一些注册型的app和网站,研究其短信接口是否安全,半天下来找到30来家,一些短信接口由于分析难度原因,没有继续深入,但差不多挖掘到20来个,可以肆意被调用, ...

  3. java keytool nginx_java 自签名证书转 nginx 所需证书

    下面个将介绍怎样利用 jdk keytool 生成自签名证书,然后使用 JKS2PFX 工具将证书转换成 pem 格式.详细步骤如下: (1)先试用 jdk 自带的 keytool 工具生成证书,如下 ...

  4. Java nginx 双向ssl_nginx配置ssl双向验证 nginx https ssl证书配置

    参考<nginx安装>:http://www.ttlsa.com/nginx/nginx-install-on-linux/ 如果你想在单IP/服务器上配置多个https,请看<ng ...

  5. java和签名工具_java 证书工具keytool生成自签名证书和自签CA证书

    jdk自带的证书管理工具叫keytool,在jdk/bin目录下,可以用来生成自签名证书.导入导出证书.打印证书信息等. 1. 名词 自签名证书:用自己的私钥签发自己的公钥即主体信息生成的证书. 证书 ...

  6. 什么是SSL双向认证,与单向认证证书有什么区别?

    SSL/TLS 证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是 ...

  7. HTTPS|SSL笔记-SSL双向认证失败(服务端证书信任库不含客户端证书)握手过程(含wireshark分析)

    这里我把服务端信任库添加了其他证书,不含客户端的证书,这时SSL认证失败报错如下.下面来分析下: 1. 首先是TCP三次握手,对应的包如下: 2. 握手成功后,客户端发送自己支持的加密套,和随机数给服 ...

  8. netty 校验_Netty SSL双向验证

    一· 快速命令 1.生成ca证书 openssl req -new -x509 -keyout ca.key -out ca.crt -days 36500 在本目录得到 ca.key 和 ca.cr ...

  9. iOS之支持https与ssl双向验证(包含:解决UIWebView加载不了https网页的图片,css,js等外部资源)

    http://blog.csdn.net/luochuanad/article/details/53410537

最新文章

  1. java super快速生成_为什么当我使用编辑器代码生成器时,eclipse会在构造函数中自动添加一个java super()方法?...
  2. XSLT基本语法和第一个实例
  3. 告别繁琐提升效率,Docker 帮您降低从开发到部署的复杂性
  4. linux压缩内核镜像,zImage内核镜像解压过程详解
  5. .NET多线程编程(2)——Thread类
  6. mysql数据库回滚日志_Mysql数据库慢查询日志的使用
  7. 6.深入浅出:差分放大电路——参考《模拟电子技术基础》清华大学华成英主讲
  8. 手把手教你安装Sketch破解版和measure插件 1
  9. TIA WinCC Professional入门经典(1) 组态第一个WinCC Professional项目
  10. 计算机网各管理员技能鉴定,计算机网络管理员国家职业技能鉴定考核指导
  11. 杨涛鸣 杨焘鸣:世界各个角落都存在人脉关系
  12. ThreeJS自带网格线
  13. RMAN 下CROSSCHECK命令 详解
  14. Mac 如何开启实现DOH保护隐私?
  15. 贫穷不可怕,贫穷的思维才最可怕
  16. 在线python编辑器-在线python编辑器
  17. 如何批量缩小图片尺寸?
  18. Mono for Android 实现高效的导航
  19. Scala学习(一) 快速入门
  20. python os system_python中os.system返回值为-1是什么意思?

热门文章

  1. 什么是前向纠错(FEC)?FEC最全解析
  2. 解决Ubuntu Linux终端输入命令没有颜色提示的设置方法
  3. 了解Windows WDDM 驱动程序
  4. 全像素双核激光对焦拍照是个什么厉害玩意儿
  5. ObjectARX自定义实体
  6. 图形化编程语言的设计
  7. Win10 可以联网,但是右下角图标显示无法连接互联网
  8. chrome所有页面崩溃【转载】
  9. xsell5 momokai配色
  10. 可视化网络拓扑:两天之内从零到英雄