热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SSL双向验证keytool实现自签名证书

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

 

一、服务端

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代表开启双向验证   

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



推荐阅读
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
author-avatar
强悍的梅子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有