接 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. js获取浏览器宽度和高度值

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>请调整浏览器窗口</t ...

  2. 面向对象基础之基础—控制台C#模拟银行ATM存取操作实例

    c#控制台应用程序ATM银行操作实例.主要介绍了设计的方法:使用的类介绍:具体的运行界面:程序代码.代码直接写在一起放在Programm.cs中,拷贝可直接运行. 一.设计 1.原则上采用三层:(1) ...

  3. react+routerv6搭建项目

    目标配置:React + Hook + React-router-v6 + Mobx + AntD: 1.创建项目 npx npx create-react-app 项目名称 2.安装sass环境,r ...

  4. Qt ui_xxx.h no file or directory

    今天是2023年1.19,22号就过年了,先祝大家新年快乐! 首先经过这几天的研究,出现这个问题,提示其实已经很明显了,就是没找到文件,那么为什么没找到文件呢?基本上就是编译的时候没有找到相应的文件, ...

  5. web基础(5): CSS3介绍

    chapter5 CSS3 新性能 (一)圆角边框与阴影 1.border-radius属性 例1 border-top-left-radius:40px 20px ; 两个值分别表示水平方向.垂直方 ...

  6. pure-ftpd(源码编译)中文编码问题

    1.由于版本问题,该软件有些版本不能编译--with-rfc2640选项.解决办法为换成相应低一点的版本 tar -xf pure-ftpd-1.0.42.tar.gz cd pure-ftpd-1. ...

  7. [转载]Linux关于磁盘操作命令

    一.查看篇 1.1.du : 查看文件和 目录的使用空间 语法: du [参数]  [文件或目录] 参数 说明 -a 列出所有的文件与目录容量. -h 以G.M.K为单位,返回容量. -s 列出总量. ...

  8. Web入门实战

    Web入门实战 - [湖湘杯 2021 final]Penetratable 难度:**** 查看题解 - [GKCTF 2021]easycms 难度:** 查看题解

  9. 谷歌云|机密 GKE 节点可在计算优化的 C2D 虚拟机上使用

    机密 GKE 节点可用于计算优化的 C2D 虚拟机. 许多公司已采用 Google Kubernetes Engine (GKE) 作为其应用程序基础架构中的关键组件.在某些情况下,使用容器和 Kub ...

  10. Install MySQL wsl1

    To install MySQL on WSL (ie. Ubuntu) env Ubuntu 22.04.1 LTS mysql Ver 8.0.32-0ubuntu0.22.04.2 for Li ...