接 https代理服务器(三)实践,实践双向ssl

本文采用客户端与服务端不同密钥对

1 mkcert myclient

生成客户端公钥 私钥

2 mkcert -pkcs12 myclient

也可以直接生成p12 非对称钥匙对

请注意,根据https原理(四)双向实践(java客户端+tcp代理) 9 的结论,1与2是两套证书,1的私钥加密的内容不能被2的公钥解密

本文只有用到1的file

3 keytool -import -file myclient.pem -keystore myclient.jks

密码123456

将公钥导入jks (https://www.jianshu.com/p/e1aaa5e9de17)

也可以从p12提取公钥pem

PKCS12是一袋X509证书和密钥。 袋子中的证书之一就是您想要的X509证书。

https://www.codenong.com/46842957/

因为之前对trustStore的理解不够深刻,因此,在项目中配置server.ssl.trust-store时候,直接将PKCS12密钥交换文件转换过来的JKS设置成为trustStore。这里其实是有问题的,trustStore是服务器的信任密钥存储库,存CA的证书(操作系统管理的所有受信任的根证书),有一部分人存的是客户端证书集合(比如我们内部自己的自签名证书,必须手动设置为信任)不算特别规范,但是trustStore里是绝对不能有私钥信息的。否则在加载trustStore的时候会报类似错误(spring-boot-2.1.0+内嵌tomcat):

Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200) ~[na:1.8.0_181]
at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:157) ~[na:1.8.0_181]
at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:130) ~[na:1.8.0_181]
at org.apache.tomcat.util.net.jsse.JSSEUtil.getParameters(JSSEUtil.java:390) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
at org.apache.tomcat.util.net.jsse.JSSEUtil.getTrustManagers(JSSEUtil.java:314) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:112) ~[tomcat-embed-core-9.0.12.jar:9.0.12]
... 24 common frames omitted

因此我有理由相信,这个trustStore的内容一定出问题了。所以,我尝试只用证书链来生成trustStore:
导入我们的证书链(从根证书到应用证书)

但是在启动的时候,却一直报错:the trustAnchors parameter must be non-empty

  经排查,是trust-store有问题,可以看看解释的文章:

  https://blog.csdn.net/HD243608836/article/details/118555240

总体来说,就是trust-store只需要包含公钥的信息,而之前配置的JKS文件同时含有公私钥的信息而导致出错,如下文章讲述了如何生成只有公钥的jks:

  http://t.zoukankan.com/Amos-Turing-p-7111499.html

https://www.cnblogs.com/zgz21/p/16824929.html

服务端有客户端私钥就不合理

4

server.ssl.trust-store=classpath:mkcert/myclient.jks
server.ssl.trust-store-password=123456
server.ssl.client-auth=need

5 https://blog.csdn.net/u013187531/article/details/124508774

import java.security.cert.X509Certificate;
import javax.servlet.http.HttpServletRequest;
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public String get(HttpServletRequest request){
X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
if(certs != null && certs.length > 0) {
X509Certificate iX509Cert = certs[0];
String dn = iX509Cert.getSubjectDN().toString();
System.out.println("个人证书信息:" + dn);
String username = "";
String[] dnArray = dn.split(",");
for (String dnItem : dnArray) {
String[] dnInfo = dnItem.split("=");
String key = dnInfo[0];
String value = dnInfo[1];
if("cn".equalsIgnoreCase(key.trim())) {
username = value;
break;
}
}
}
return "DONE";
}

6

curl -k --cert myclient.pem --key myclient-key.pem https://myhost.com:8080/test/test -v

https://www.jianshu.com/p/e1aaa5e9de17

控制台打印:个人证书信息:OU=mac@macdeMacBook.local, O=mkcert development certificate

curl未指定truststore,信任一切服务端公钥

7 第2步的p12,本想让浏览器信息然后在浏览器中访问6,双击-信任所有,重启chrome,但是并不如windows版直接弹框让选择

https://blog.csdn.net/a82514921/article/details/104587416/

http原理(五)双向加代理实践中通过加代理的方式实现

其他:

1

http://m.juming.com/zx/13583.html

为什么要双向ssl

SSL 单向验证过程中,客户端会验证自己访问的服务器端,服务器端对客户端不做验证。如果服务器端验证客户端,则需要开启服务器端验证,这就是双向验证。

而在一般的浏览器以及网站中都是采用单向认证的,虽然安全性能不及证书双向认证高,但是它的用户数目非常的广泛。没有需要做太多的用户身份验证。

如果是一些公司企业需要做网站对接的话。一般建议使用SSL双向证书认证。这样的话,对客户端进行身份验证。做了证书双向认证之后,就可以让信息传递更加的安全以及加密,防止敏感信息被第三方泄露,而加密方案也会相对的好。

2

https://www.codenong.com/cs81486147/

Trust Store:密钥文件可以存放私钥和公钥,具体就是可以存放自己的私钥、自己的公钥和别人的公钥(也可以存放别人的私钥,但这不合理,私钥必须私有)。一般地我们把自己的(私钥和公钥)存放在Key Store里,而把别人的公钥存放在Trust Store里。

3

双向的对称密钥一定要用客户端公钥加密的协商和传输一定要有客户端公钥参与,更本质的,握手过程一定要involve中间人没有的客户端私钥

为什么:因为如果中间人只代理服务端公钥,不代理客户端公钥,握手仍能顺利进行,因为客户端公钥没有参与,只有服务端公钥决定,则凭借中间人私钥即可破解对称密钥

服务端的公钥给中间人,而客户掌握着客户端,可以手动信任中间人替换的仿冒服务端公钥

客户端的公钥给中间人,服务端对中间替换的仿冒客户端公钥具有绝对控制权

3+如果客户端与服务端用同一个密钥对,这可能是第一个漏洞,客户端与服务端用同一个公钥

漏洞真的存在?

图来自:https://www.cnblogs.com/larrydpk/p/12830365.html

ssl握手将失败在第8步,中间人拿到客户端公钥加密的加密方案,没有私钥解密

ssl即使不断,中间人拿着自己的私钥解密第9步客户端用“服务端公钥”即中间人公钥加密的对称密钥,也不知道加密方案

所以漏洞不存在

4 双向为什么能抵抗中间人

客户端有客户端的私钥公钥,但是只会响应服务端对公钥的请求,所以中间人只能截到客户端公钥
服务端用involve客户端公钥的方式加密对称密钥,则中间人没有私钥无法解密
中间人如果像对服务器公钥那样掉包用自己的一对密钥冒充客户端,则无法通过服务端对客户端公钥的验证

5 奇怪现象

need时java 客户端可访问,但没客户端证书;want时有

后来发现,没有给truststore,猜测为,当springboot读到need,没有读到truststore时,没有强制检验的手段,直接放弃双向握手

后证实如果不给truststore,会用java cacerts文件

而当want时,虽然tomcat没有检验手段,但tomcat不能排除用户没有检验手段,兴许用户就是不用 struststore检验,所以没有放弃双向握手,把客户端公钥传下去

这可能是第二个漏洞,没有使用tomcat专业级验证,使用自己的java代码简单验证客户端公钥cn,所以只需要自签名一个相同cn的公钥,就能绕开服务端验证

漏洞存在?

https原理(四)双向实践(java客户端+tcp代理)中7有实践,结果自签名证书无法突破,ca证书直接ssl失败,tomcat的want肯定做了一些基础检验,即使在没有truststore的情况下

https原理(三)双向实践(curl)的更多相关文章

  1. Tengine HTTPS原理解析、实践与调试【转】

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

  2. 【大量干货】史上最完整的Tengine HTTPS原理解析、实践与调试

    本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...

  3. HTTPS 原理与证书实践

    1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了互连两台主机之间可以进行通汛的目的,虽然看似简简单单几句 ...

  4. https原理与实践

    HTTPS 原理与证书实践   分类: Web应用   1.1 网络安全知识 1.1.1 网结安全出现背景 网络就是实现不同主机之间的通讯,网络出现之初利用TCP/IP协议簇的相关协议概念,已经满足了 ...

  5. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  6. HTTPS 原理浅析及其在 Android 中的使用

    作者:曹丰斌   本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...

  7. HTTPS原理解析-转

    这篇文章关于Https的讲解真的是太透彻了,转过来备忘. 来源:腾讯bugly 另附两个SSL/TLS的交互详解:一.二 基于此文章的学习总结:下一篇文章 1.HTTPS 基础 HTTPS(Secur ...

  8. HTTPS 原理及配置

    目录 一.HTTPS 身份验证介绍 二.windows 环境下配置 tomcat HTTPS 三.linux 环境下配置 tomcat HTTPS 一.HTTPS 身份验证介绍 1. HTTPS 原理 ...

  9. 网络知识杂谈 - https - 原理简述

    概述 简单描述 https 尽量介绍它的原理 实际的机制, 可能会更加复杂一些... 背景 这玩意, 困扰我好多年了 今天开始, 想做个了断 之前工作也接触过, 但从我的角度来说, 认识很浅 会配置 ...

  10. Android端代码染色原理及技术实践

    导读 高德地图开放平台产品不断迭代,代码逻辑越来越复杂,现有的测试流程不能保证完全覆盖所有业务代码,测试不到的代码及分支,会存在一定的风险.为了保证测试全面覆盖,需要引入代码覆盖率做为测试指标,需要对 ...

随机推荐

  1. swiper滑动异常

    遇到这样的情况,一共5张slide,但是从第三个起再往右划就不动了.后来发现是已经初始化swiper后又追加了slide.(大概意思是这样.太久的程序了,也不想仔细捋了) 暂且用到的办法: 先定义好: ...

  2. win7电脑休眠后只能按重启键解决办法

    一.点击"开始"后选择控制面板 二.选择"电源选项" 三.点击"更改计划设置" 四.选择"更改高级电源设置" 五.点击& ...

  3. #Cisco——配置链路聚合

    Cisco--配置链路聚合 一.什么是链路聚合. 链路聚合(英语:Link Aggregation)是一个计算机网络术语,指将多个物理端口汇聚在一起,形成一个逻辑端口,以实现出/入流量吞吐量在各成员端 ...

  4. JDK卸载与JDK12 安装

    JDK卸载与JDK12 安装 一.JDK卸载 控制面板>程序和功能>jdk程序(java 8 update 391:java SE Development Kit8 update 391) ...

  5. django的模型层(二)

    django的模型层(二) 一 创建模型 from django.db import models # Create your models here. class Author(models.Mod ...

  6. requests学习笔记02

    一.会话对象 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能. ...

  7. PostgreSQL权限管理

    一旦一个对象被创建,它会被分配一个所有者.所有者通常是执行创建语句的角色.对于大部分类型的对象,初始状态下只有所有者(或者超级用户)能够对该对象做任何事情.为了允许其他角色使用它,必须分配权限. 1 ...

  8. 2- 用户登录表单拦截 UsernamePasswordAuthenticationFilter

    /* * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited * * Licensed under the Apache License, ...

  9. C语言的qsort函数

    C函数----qsort 函数 qsort()看起来和C++的sort()差不多,但是其实差别很大, qsort的cmp函数,传入的是指针,返回值是int sort的则传入值,返回值是bool 当qs ...

  10. 第二性 合卷本 横本.PDF

    书本详情 第二性台版 作者: 西蒙.德.波娃(Simone de Beauvoir)出版社: 貓頭鷹原作名: Le Deuxième Sexe译者: 邱瑞鑾出版年: 2013-10页数: 1136装帧 ...