阅读此文首先需要具备数据加解密,公钥,私钥,签名,证书等基础知识。

通信服务端:使用tomcat

通信客户端:使用apache httpclient 4.5.1

1. 服务端操作

.
keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\servesert\tomcat.keystore -validity
终端问答的参数:
CN=helloworld.com, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
keypassword storepassword 这步生成服务端的私钥和证书。 keystore是一个秘钥和证书的容器,里面可以装多个秘钥和证书。alias是一个keystore里证书或秘钥的唯一的识别id。CN=helloworld.com是服务端的域名,做测试时,客户端机器需要配置helloworld.com的hosts。 keytool -list -v -keystore D:\servesert\tomcat.keystore
查看该keystore里的证书和私钥。
keytool -keystore D:\servesert\tomcat.keystore -export -alias tomcat -file D:\servesert\tomcat.cer
将tomcat.keystore这个秘钥库里alias为tomcat的公钥导出为证书,这个证书将添加到客户端的受信任秘钥库中。

2.客户端操作

keytool -genkey -v -alias me -keyalg RSA -keystore D:\cert\me.keystore -validity
CN=hello, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown
keypassword storepassword
生成客户端秘钥,CN名字可以随便填 keytool -import -v -alias tomcat -file D:\servesert\tomcat.cer -keystore D:\cert\trust.keystore
将服务端导出的证书添加到客户端受信任的秘钥库中。 keytool -list -v -keystore D:\cert\me.keystore
keytool -list -v -keystore D:\cert\trust.keystore keytool -keystore D:\cert\me.keystore -export -alias me -file D:\cert\me.cer 将客户端私钥库中的客户端证书导出,之后会添加到服务端的受信任证书库。

3.服务端操作

keytool -import -v -alias me -file D:\cert\me.cer -keystore D:\servecert\trust.keystore
将客户端的证书导入服务器的受信任证书库

4.tomcat server.xml配置

 <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS" keystoreFile="D:\\servesert\\tomcat.keystore"
keystorePass="123456" truststoreFile="D:\\servesert\\trust.keystore"
truststorePass="123456" />

5.java客户端代码

package com.xy;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.http.ssl.SSLContexts; import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException; /**
* Created by xiaxia on 2015/11/4.
*/
public class Test {
public static void main(String[] args) throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, UnrecoverableKeyException {
// Trust own CA and all self-signed certs
SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(new File("D:\\cert\\trust.keystore"), "123456".toCharArray(),
new TrustSelfSignedStrategy())
.loadKeyMaterial(new File("D:\\cert\\me.keystore"), "123456".toCharArray(), "123456".toCharArray()).build();
// Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { "TLSv1" },
null,
SSLConnectionSocketFactory.getDefaultHostnameVerifier());
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
.build(); try { HttpGet httpget = new HttpGet("https://helloworld.com:8443/hello/testget.json"); System.out.println("Executing request " + httpget.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpget);
try {
HttpEntity entity = response.getEntity(); System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println(EntityUtils.toString(entity)); EntityUtils.consume(entity);
} finally {
response.close();
}
} finally {
httpclient.close();
}
} // HttpPost httpPost = new HttpPost("http://targethost/login");
// List <NameValuePair> nvps = new ArrayList <NameValuePair>();
// nvps.add(new BasicNameValuePair("username", "vip"));
// nvps.add(new BasicNameValuePair("password", "secret"));
// httpPost.setEntity(new UrlEncodedFormEntity(nvps));
// CloseableHttpResponse response2 = httpclient.execute(httpPost);
//
// try {
// System.out.println(response2.getStatusLine());
// HttpEntity entity2 = response2.getEntity();
// // do something useful with the response body
// // and ensure it is fully consumed
// EntityUtils.consume(entity2);
// } finally {
// response2.close();
// }
}

说明:如果自己的私钥库中有超过一个可选证书,系统会默认选择第一个。若受信任证书库中有超过一个证书,会遍历证书直到找到第一个匹配的。

参见http://stackoverflow.com/questions/6370745/can-we-load-multiple-certificates-keys-in-a-key-store

https双向认证demo的更多相关文章

  1. Android Https双向认证 + GRPC

    keywords:android https 双向认证android GRPC https 双向认证 ManagedChannel channel = OkHttpChannelBuilder.for ...

  2. HTTPS 双向认证构建移动设备安全体系

    HTTPS 双向认证构建移动设备安全体系 对于一些高安全性要求的企业内项目,我们有时希望能够对客户端进行验证.这个时候我们可以使用Https的双向认证机制来实现这个功能. 单向认证:保证server是 ...

  3. Tomcat 配置 HTTPS双向认证

    Tomcat 配置 HTTPS 双向认证指引说明: � 本文档仅提供 Linux 操作系统下的指引 � 在阅读本指引前请您在 Linux 部署 JDK 和 Tomcatserver为了 Tomcat ...

  4. httpd设置HTTPS双向认证

    去年用tomcat.jboss配置过HTTPS双向认证,那时候主要用的是JDK自带的keytool工具.这次是用httpd + openssl,区别比较大 在网上搜索了很多文章,发现全面介绍的不多,或 ...

  5. Https双向认证Android客户端配置

    Https .cer证书转换为BKS证书 公式https://blog.csdn.net/zww986736788/article/details/81708967 keytool -importce ...

  6. 双向认证 HTTPS双向认证

    [微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=4_3 HTTPS双向认证使用说明 ...

  7. https双向认证訪问管理后台,採用USBKEY进行系统訪问的身份鉴别,KEY的证书长度大于128位,使用USBKEY登录

    近期项目需求,须要实现用USBKEY识别用户登录,採用https双向认证訪问管理后台管理界面,期间碰到过一些小问题,写出来给大家參考下. 1:前期准备工作 USBKEY 硬件:我买的是飞天诚信 epa ...

  8. nodejs之https双向认证

    说在前面 之前我们总结了https的相关知识,如果不懂可以看我另一篇文章:白话理解https 有关证书生成可以参考:自签证书生成 正题 今天使用nodejs来实现https双向认证 话不多说,直接进入 ...

  9. SpringBoot服务间使用自签名证书实现https双向认证

    SpringBoot服务间使用自签名证书实现https双向认证 以服务server-one和server-two之间使用RestTemplate以https调用为例 一.生成密钥 需要生成server ...

随机推荐

  1. thinkphp 3+ 观后详解 (4)

    static public function run() { // 应用初始化标签 Hook::listen('app_init'); App::init(); // 应用开始标签 Hook::lis ...

  2. hadoop学习笔记之倒排索引

    开发工具:eclipse 目标:对下面文档phone_numbers进行倒排索引: 13599999999 1008613899999999 12013944444444 13800138000137 ...

  3. 由“大数据量Excel入库高效方式”瞥见“并联系统”之优势

    使用场景:         当你有一个Excel文件,需要把其中的数据高速录入到数据库中,文件中包含10万条以上数据. 设计方案:        我们将整个过程分成三个阶段,A(装载Excel文件). ...

  4. UVALive 4225 Prime Bases 贪心

    Prime Bases 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&a ...

  5. Ogre Addon之Paged Geometry

    还是OGRE好啊,无尽的Addon,无尽的宝藏.既有SkyX,Hydrx这样的天空水体渲染库可供学习,还有Paged Geometry这样的“大规模海量geometry管理系统”.它通过batch,s ...

  6. stm32出现错误“identifier file is undefined”

    为什么记录这个问题,说来很简单,这已经是第二次犯这个小错误了. 出现了错误“identifier file is undefined”的解决方法;option->general options- ...

  7. JSON使用——获取网页返回结果是Json的代码

    public String getWebData(String strUrl){ String json = null; try { URL url = new URL(strUrl); HttpUR ...

  8. L - Fabled Rooks(中途相遇法和贪心)

    Problem F: Fabled Rooks We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the ...

  9. IOS 免受xib自动布局影响

    1.适配苹果手机  iPhone 4 ,4s 一个xib  iPhone 5 5s xib   以后iPhone6一个xib 2.再根据ios6 和 ios7 进行 微调 就是状态栏的那个问题 3.# ...

  10. 关于 2dx v3.7 UIScale9Sprite的bug

    关于 2dx v3.7 UIScale9Sprite的bug 刚把引擎从js binding v3.0升级到v3.7,发现了一些bug,这里先说说关于scale9sprite的 1. 关于capIns ...