https原理(六)系统分析
先解决此前的问题:
need时java 客户端可访问,但没客户端证书;want时有 后来发现,没有给truststore,猜测为,当springboot读到need,没有读到truststore时,没有强制检验的手段,直接放弃双向握手 后证实如果不给truststore,会用java cacerts文件 而当want时,虽然tomcat没有检验手段,但tomcat不能排除用户没有检验手段,兴许用户就是不用 struststore检验,所以没有放弃双向握手,把客户端公钥传下去
不给truststore home所有请求都失败 java和curl com可以不知道为啥
com那边没指定truststore,但直接指向了cacerts
truststore:双向认证中是必须的,如果没有显式的指定,默认指定为$JAVA_HOME/lib/security/cacerts 这个文件。
2 现在确定了com没给truststrore仍然能跑的第一个必要条件,那么接下去的问题是,ecs上的cacerts里面有什么
是否同时有ca和客户端公钥?
3 第2点引出一个问题,是否truststore里面有ca证书就行了?
home实践下来不行
keytool -import -file /Users/mac/Library/Application\ Support/mkcert/rootCA.pem -alias ca -keystore myhost.com-capub.jks
失败,无论need还是want
实际上此前也有类似实践,删除truststore属性,模仿com,但是请求失败
根据今天的结论,删除truststore会指向cacerts,我们看下cacerts里有啥
keytool -list -v -keystore cacerts > ~/Downloads/tmp.txt
用mkcert做关键词搜索tmp.txt,仅有一处,即mkcert ca,所以在https代理服务器(三)实践中,mkcert install 已经将mkcert根证书安装到not only mac but java了
4 在3的基础上,推测com的ecs cacerts中,运维安装了各服务的公钥和ca证书
5 还有个问题,服务每次发布,都会得到一个新的 jks p12文件,密码也新的不变,仅一对同时可用于作为服务端和客户端的密钥对(p12)
那么会发生以下情况
app1 | cacerts | app2 |
既有app1与app2的公钥 | ||
发布,得到一个密钥对 | 植入app1的新的公钥 | 不重启 |
请求app2 | 不认新的公钥 |
无穷尽也
那么猜测,新的 jks p12文件,只是把原公钥重新封装一下,并没有重新签发密钥对
app1 | cacerts | app2 |
运维签发app1和app2的密钥对,将2个公钥和ca证书植入所有ecs的jre cacerts文件(可能都集中管理在ecs某个区域) |
||
发布,请求新的jks, 但里面的密钥对还是之前运维签发的 |
对app1的密钥对重新生成一个jks | |
请求app2,带着公钥 | app1的公钥一直在truststore(即java cacerts)没变过 | 检验app1的公钥成功 |
还有一个有此推测的原因是,ca私钥签发密钥对应该是很繁琐的,不太可能发布一次就给一对新的
6 如何获得证据
如果能打印前后两次发布获得jks的sha1(可以hash),如果一样,就是证据
那么同一个公钥,两次jks,sha1 一样吗?
7 对myhost.com.pem 两次jks,查看证书
keytool -import -file ../mkcert/myhost.com.pem -keystore 1.jks
123456
keytool -import -file ../mkcert/myhost.com.pem -keystore 2.jks
654321
mac@macdeMacBook twicesamepemjkssha1 % keytool -list -v -keystore 1.jks > 1.txt
输入密钥库口令: 123456
mac@macdeMacBook twicesamepemjkssha1 % keytool -list -v -keystore 2.jks > 2.txt
输入密钥库口令: 654321
1与2完全一样
因此可以用6的方式检验2次发布的私钥和公钥有没有变,还是只是jks变了
8 获得证据
其实下载的是p12,且app1前后两次下载得到的pw相同;
而app1 app2都是通过一个参数相同的get请求拿的
所以只要证明app1前后两次获得的是一个证书(目前pw相同并不能说证书相同),就证明了该get接口只要入参不变,output也不变,而app2也是用这套参数,所以app1与app2获得的是同一个证书
ecs pem:openssl x509 -sha1 -in cert.pem -noout -fingerprint
本地上次get的p12:"keytool" -list -v -keystore keystore.jks
两者sha1相同
至此证明了ecs的密钥对都是同一个
9 non ecs
non ecs的keystore同时作为truststore(这一点不同于ecs没给truststore),是个p12文件,转为jks显示有30多个证书在里面,其中有一个公钥证书,CN、sha1与8中获取的一致
"C:\Program Files\jdk8\latest\bin\keytool" -list -v -keystore c:\work/test/httpproxy\keystore2.jks > "C:\work\tmptmp.txt"
https://www.coder.work/article/67786
通常您可以在一个存储中存储多个私钥和证书。
基于 Java 的服务器使用哪种 key 和证书组合取决于应用程序的实现方式。许多应用程序允许您使用 别名 名称选择给定的证书。 keystore中的 key 和证书 getter 采用 alias
参数来做出此选择。通常,当配置中没有指定时,应用程序或框架将使用它根据 KeyStore.aliases()
枚举找到的第一个合适的。
例如,Tomcat 中使用 keyAlias
属性。 :
keyAlias: The alias used to for the server certificate in the keystore. If not specified the first key read in the keystore will be used.
https://www.elecfans.com/d/1238385.html
如果您的密钥库包含多个私钥别名,则需要添加“ keyAlias”指令以及对所需别名地引用。
keyAlias =“ tomcat”保存更改并重新启动Tomcat Web服务。
作为客户端拿p12的密钥对时,也可以指定alias
错了,写入tomcat配置的是p12而不是jks,p12只包含1个私钥,包含1个或多个公钥。公钥是构成信任链的密钥。https://cloud.tencent.com/developer/ask/sof/100353685
anyway,她只要有一个私钥就够了
ecs | non ecs |
作为客户端 | 作为服务端 |
请求non ecs | |
拿着keystore,里面一个ecs密钥对 | |
发送keystore里面的公钥 | |
信任一切服务端公钥 | |
发送ecs公钥 | |
核对truststore,里面确实有ecs公钥证书 | |
作为服务端 | 作为客户端 |
请求ecs | |
发送keystore里面的公钥 | |
信任一切服务端公钥 | |
发送客户端(non ecs)公钥,根据keystore | |
核对truststore,因为没给,所以找到java的cacerts文件 由此可以推测non ecs keystore的公钥所表达的证书链能在在cacerts文件中被验证 |
这里看出non ecs的keystore和truststore暴露,尤其是keystore有私钥,且keystore读权限宽松,直接可以拿来跟ecs双向ssl握手,从而对ecs进行抓包
9+
https://www.coder.work/article/67786
基于 Java 的服务器使用哪种 key 和证书组合取决于应用程序的实现方式。许多应用程序允许您使用 别名 名称选择给定的证书。 KeyStore 中的 key 和证书 getter 采用 alias
参数来做出此选择。通常,当配置中没有指定时,应用程序或框架将使用它根据 KeyStore.aliases()
枚举找到的第一个合适的。
例如,Tomcat 在其 Connector configuration 中使用 keyAlias
属性。 :
keyAlias: The alias used to for the server certificate in the keystore. If not specified the first key read in the keystore will be used.
10 虽然non ecs keystore请求ecs双向握手成功,但ecs端的x509 filter获得的Common Name为non ecs的hostname,既然keystore里面有ecs公钥证书,能不能把它拉出来发给ecs?这样就能通过filter
试了各种方式失败,即使只删除 hostname那个公钥
原因推测为里面的唯一的私钥是对应于cn为hostname的那个公钥,所以无法解密ecs用这个发过去的ecs公钥加密的加密方式,握手失败
11 此外找到了ecs的cacerts,里面并没有non ecs 和ecs的公钥本身,猜测有root下面次一级的证书链支持
总结:
整体系统设计非常教科书
1 传输层透明代理,确保端对端ssl
2 ecs每个app一个密钥对,同时作为keystore(单向ssl服务端,双向ssl客户端)和truststore(双向ssl服务端)
3 同一个环境所有ecs app密钥对都是同一个,sit与uat共用ca
4 ecs无需app自己配trustrore,运维统一管理cacerts
5 利用want的严密实现部分url双向ssl验证
https原理(六)系统分析的更多相关文章
- Tengine HTTPS原理解析、实践与调试【转】
本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验.内容主要有四个方面:HTTPS趋势.HTTPS基础.HTTPS实践.HTTPS调试. 一.HTTPS趋势 这一 ...
- python并发编程之进程、线程、协程的调度原理(六)
进程.线程和协程的调度和运行原理总结. 系列文章 python并发编程之threading线程(一) python并发编程之multiprocessing进程(二) python并发编程之asynci ...
- https原理总结
博客搬家: https原理总结 最近在公司项目的服务器上做一些内部接口,要求使用https,于是花时间研究了一波.我们熟知的http在传输时未对数据进行加密,在传输一些敏感信息时存在着不小的安全隐患. ...
- HTTPS 原理解析
一 前言 在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议.HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全.为了保证 ...
- [转]HTTPS那些事(一)HTTPS原理
[转]HTTPS那些事(一)HTTPS原理 http://www.guokr.com/post/114121/ 楔子谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>, ...
- HTTPS 原理浅析及其在 Android 中的使用
作者:曹丰斌 本文首先分析HTTP协议在安全性上的不足,进而阐述HTTPS实现安全通信的关键技术点和原理.然后通过抓包分析HTTPS协议的握手以及通信过程.最后总结一下自己在开发过程中遇到的HTT ...
- https原理及其中所包含的对称加密、非对称加密、数字证书、数字签名
声明:本文章已授权公众号Hollis转载,如需转载请标明转载自https://www.cnblogs.com/wutianqi/p/10654245.html(安静的boy) 一.为什么要使用http ...
- [转帖]HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...
- HTTPS原理解析-转
这篇文章关于Https的讲解真的是太透彻了,转过来备忘. 来源:腾讯bugly 另附两个SSL/TLS的交互详解:一.二 基于此文章的学习总结:下一篇文章 1.HTTPS 基础 HTTPS(Secur ...
- OpenSSL和https原理
https原理: 浏览器请求服务端的公钥证书,server将注冊的证书发送给client. client向办法机构验证证书的合法性,证书 包含公钥,server网址及一些信息. 验证完成,client ...
随机推荐
- ROS1 Qt5 CMake基本配置
############################################################################## # CMake ############# ...
- Linux命令执行时,提示commond not found的处理办法
执行chattr命令时,或其他命令时,若出现命令没发现,commond not found 那么就是有可能命令文件丢了,执行find / -name chattr,如果没有命令了,可以拷贝一个或yum ...
- 使用python和adb来学习(学习通)
在某一天赶课比较着急,奈何找不到人可以帮我,于是自己动手写了一个简单的脚本来学习 准备工作: 1.需要一个你不用的手机,打开手机的adb,因为需要用到adb来操作手机 2.进入百度智能云,申请一个 通 ...
- VOLO论文笔记
Outlook Attention 设给定输入为 \(X \in R^{H \times W \times C}\), 首先经过两个线性映射得到两个输出A 和 V,A叫做outlook weight ...
- k3s|如何将k8s集群的node节点设置不可调度或删除node节点?
k3s|如何将k8s集群的node节点设置不可调度或删除node节点? k3s是由 Rancher 公司开发的轻量级Kubernetes,是经CNCF一致性认证的Kubernetes发行版,专为物联网 ...
- 预览服务器上的html静态网页
预览服务器上的html静态网页 远程服务器中html静态文件不方便直接查看 使用vscode快速预览远程服务器上的html静态文件 我遇到的场景: 我使用windows电脑办公,使用vscode的ss ...
- vue指令入门
1. vue属性.事件.内容绑定 1 <div id="dv"> 2 <!-- v-cloak能够解决表达式闪烁问题 3 (当网速较慢时,会先出现{{msg}} ...
- CVE-2023-25813 漏洞
自己使用Nestjs 搭配 Sequelize ,在安装新包的时候提示有Critical 风险.有漏洞嘛,要第一时间处理,要处理,除了升级,还要看一下这个漏洞如何复现. 粗略得到结果如下: CVE-2 ...
- Unity模型剖切
效果展示 1.首先先下载一个模型剖切插件Cross-Section插件 没有的下方链接自取 插件下载链接 2.下载之后导入到项目 导入之后的样子如下图 因项目需求需要剖切模型,要使用滑动条进行剖切, ...
- sudo:Operation not permitted事件
转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14933949.html 前言 事情是这样的,在风和日丽的一天,我如往常一样在服务器上敲下了sudo xxx ...