如果您阅读了上面的3 次握手过程,您会发现握手主要完成以下任务:
1. 客户端与服务器通信及加密方式协商
2.客户端和服务器验证对方身份
3. 双方安全地交换用于https通信的密钥(会话密钥)。
第一阶段:CS协商加密方式
客户端向服务器端发送ClientHello信息。此信息包括客户端支持的密码、客户端支持的SSL 版本等。服务器收到ClientHello信息后,首先向客户端发送ServerHello信息。告诉客户端要使用什么加密方法和SSL 版本。
第二阶段:身份校验
第2 阶段主要涉及客户端和服务器验证彼此的身份。
客户端和服务器之间的身份验证是通过证书来完成的
1、关于证书:
服务器向客户端颁发自己的证书。通常是由CA 认证的证书。证书包含很多信息,主要是“公钥信息”、“签名”、“组织区域等信息”、“证书颁发机构”,以及相关的媒体证书(mediacertificate)、根证书(rootcertificate)等。
X.509作为SSL数字证书标准应该会变得更加流行,包括但不限于以下领域:
字段值说明对象名称(Subject Name) 用于标识数字证书的信息通用名称(Common Name) 对于客户端证书,一般为对应的域名证书颁发者(Issuer Name)信息认证颁发并签署数字证书的实体的签名算法证书用于签署证书的算法序列号由数字证书颁发机构(CA) 赋予证书的唯一整数数字证书具有有效期(之前无效)。 ´) 有效期(超过后无效) (口)(—公钥公钥签名通过签名算法计算证书内容后得到的数据。证书已被篡改
重要的是签名,它用于检查是否被篡改。
2、客户端如何通过证书确定服务器的身份?
证明以下两点(可以使用证书的公钥对生成会话密钥的随机数进行加密):
我们保证baidu.com的证书确实是百度证书,并且baidu.com的证书未被任何人修改过。
证书以证书链的形式组织。颁发证书时,首先有根CA组织颁发根证书,然后根CA组织为中间CA组织颁发证书,最后中间CA组织颁发证书。特定的SSL 证书。
数字证书使用信任链进行验证。数字证书的信任锚(信任源点)是根证书颁发机构。根证书是未签名或自签名的证书。用于标识根证书颁发机构(CA) 的公钥证书。
验证的具体实现如下图所示。
从左到右,用户证书指的是对其进行签名的中间证书,用户证书的摘要是用中间证书的私钥加密的,密文记录在用户证书中作为用户的证书签名。同样,中间证书是指对其进行签名的根证书。同时,用根证书的私钥对中间证书的摘要进行加密,并将密文记录为中间证书的签名。签署中间证书时,根证书使用颁发机构的私钥对证书摘要进行加密,并将密文记录为根证书的签名。
如何验证证书
1.如何检查证书没有被篡改
例如,要验证用户证书A,必须使用中间证书的公钥B解密中间证书的签名并获得摘要Digest1。客户端还计算A证书的内容,得到摘要Digest2。比较两个摘要就可以知道前者是否被篡改。后者使用证书颁发者提供的公钥进行验证。一旦受信任的根证书经过验证,您就可以确定该证书是可信的。
2. 根证书为何受信任
由数字证书颁发机构(Certificate Authority,CA)签名和管理的CA根证书包含在浏览器和操作系统的可信证书列表中,用于判断根证书是否可信。因此,不要随意将陌生的根证书导入到您的操作系统中。
第三阶段:产生通信密钥
如前所述,在第一步中,服务器告诉客户端稍后使用哪种加密方法(通常是对称加密,因为非对称加密太昂贵且耗时)。
第二阶段,客户端验证服务器证书是否正确,即证书中代表的公钥用于加密信息。只有服务器可以解密加密信息;其他第三方无法解密。 然后,在第三阶段,客户端生成第三个随机数,称为PMSc(预主密钥,46字节),使用服务器的公钥对其进行加密,并将其发送到服务器。服务器获得密文后,用自己的私钥解密,得到PMSc。
接下来,最重要的一步开始了。基于先前协商好的加密方法和三个随机数,客户端和服务器各自生成一个称为主密钥(Master Secret,缩写为MS)的通信密钥。该密钥是单独生成的,但生成后是一致的。
第四阶段:加密信道已经建立
客户端和服务器各自生成通信密钥后,使用同一个MS来加密以后所有的通信信息。虽然没有第三方知道这个密钥,但它就像客户端和服务器通过加密通道进行通信一样,即使他们窃听也无法理解该信息。
从上面可以看出,https通信过程是对称加密和非对称加密的混合。
中间人攻击与https抓包
针对SSL的中间人攻击流程如下:
![](https://upload-images.jianshu.io/upload_images/24142630-56ac0389a913fc5d.image?imageMogr2/auto-orient/strip%7C
imageView2/2/w/1240)
事实上,中介机构在客户不知情的情况下诱骗客户与其进行安全互动的方式就是他们采取非法行动的方式。我们来看看Charles是如何捕获HTTPS数据包的。网上有很多关于如何捕获HTTPS 数据包的Fiddler 教程。最重要的是:
在手机上安装私有CA颁发的数字证书,并将其保存为可信证书。
将私有CA 证书添加到系统信任证书后,您就可以完成证书链验证过程。
更多关于Fiddler抓包流程可以参见www.cnblogs.com/afeng2010/p.
android7.0之后用户CA限制
从Android 7.0开始,系统不再信任用户CA证书(应用targetSdkVersion=24时启用,即使系统是7.0或更高版本,targetSdkVersion 24仍然受信任)。这意味着即使安装了用户CA 证书,您也无法在Android 7.0 及更高版本的计算机上捕获targetSdkVersion=24 的应用程序的HTTPS 包。
Android 6.0 (API 23) 及更早版本上的应用程序的默认网络安全配置为:
从Android 7.0 (API 24) 到Android 8.1 (API 27) 的默认网络安全配置为:
从Android 9.0 (API 28) 开始,默认的网络安全配置为:
如果要抓包自己的APP包,解决方案是使用Android 6.0及以下的网络安全配置:添加res/xml/network_security_config.xml:
?xml 版本=\’1.0\’ 编码=\’utf-8\’?
然后在清单文件中指定以下文件:
?xml 版本=\’1.0\’ 编码=\’utf-8\’?
宣言.
应用程序android:networkSecurityConfig=\”@xml/network_security_config\”
……
……
如何防止中间人攻击
我想通过上面的解释大家都能明白了,
假设设备没有安装来自未知颁发者的受信任证书,则无论WIFI 或网络环境如何,HTTPS 通信通常都是安全的。
此外,Android 7.0 及更高版本通常是安全的,因为Android 7.0 及更高版本默认情况下不信任用户证书,即使手机安装了受信任的证书。
因此,您通常不需要执行任何特殊操作来防止中间人攻击。
然而,一些金融应用程序需要额外的验证以确保https 安全。
下载服务器端公钥证书,将公钥证书编译到您的Android 应用程序中,通常将其保存在asset 文件夹中。应用程序在交互过程中验证证书的有效性。
//使用内置证书
公共静态SSLSocketFactory getSSLSocketFactory_Certificate(上下文上下文){
尝试{
//获取X.509格式的内置证书
CertificateFactory 证书工厂=CertificateFactory.getInstance(\”X.509\”);
KeyStore keyStore=KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
Collection 扩展了证书cers=certificateFactory.generateCertificates(context.getAssets().open(“CACertificate.cer”));
整数索引=0;
对于(证书cert : cer){
字符串证书别名=Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias, 证书);
}
//使用这个keystore来指导生成的TrustManager进行验证。
最终TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keystore);
最后
多年来,编辑了解到,大多数入门级和中级Android工程师想要提高自己,往往必须自己探索和成长,这是不系统的、短暂的,我了解到这并没有帮助。
因此,我们收集整理了《2024年Android移动开发全套学习资料》册。最初的目的也很简单。换句话说,我们想帮助那些想学习、提高自己,但不知道从哪里开始的朋友。
一个人可以走得快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
获取信息专栏
《移动开发全套学习资料》的初衷也很简单:想帮助那些想学习、提高但不知道从哪里开始的朋友。 **
[外部链接照片转发.(img-hBdMuytn-1719085225054)] 一个人可以走得很快,但一群人可以走得更远。无论是IT行业的资深人士还是对IT行业感兴趣的新人。
欢迎任何人加入我们的圈子(技术交流、学习资源、职场投诉、大公司内部推荐、面试指导),让我们一起学习、成长!
获取信息专栏
在#Android 程序员面试中,您需要了解上面的内容:HTTPS 加密原理和中间人攻击到底是什么?相关内容来源网络仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91743.html