证书固定的一般做法是,将公钥证书(.crt 或者 .cer 等格式)内置到 App 中,然后创建 TrustManager 时将公钥证书加进去。...第二步,服务器发回相应,charles获取到服务器的CA证书,用根证书(这里的根证书是CA认证中心给自己颁发的证书)公钥进行解密,验证服务器数据签名,获取到服务器CA证书公钥。...第六步,charles截获服务器发送的密文,用对称密钥解开,再用自己伪造证书的私钥加密传给客户端。 第七步,客户端拿到加密信息后,用公钥解开,验证HASH。...4.3 证书校验(单向认证) 下载服务器端公钥证书 为了防止上面方案可能导致的“中间人攻击”,可以下载服务器端公钥证书,然后将公钥证书编译到Android应用中一般在assets文件夹保存,由应用在交互过程中去验证证书的合法性...官方比较推荐的一种校验方式 原理是在客户端中预先设置好证书信息,握手时与服务端返回的证书进行比较,以确保证书的真实性和有效性。
对称加密 速度高,可加密内容较大,用来加密会话过程中的消息 公钥加密 加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥 1.4 SSL 功能 1.4.1 客户对服务器的身份认证 SSL...服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性~ 1.4.2 服务器对客户的身份认证 也可通过公钥技术和证书进行认证,也可通过用户名,password...其内容包含:电子签证机关的信息、公钥用户信息、公钥、签名和有效期。...这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,然后采用 CA 的私钥对信息摘要进行加密,加密完的密文就是签名。...即:证书 = 公钥 + 签名 +申请者和颁发者的信息。
进行地址过滤,找到我们想看的网络数据。...对比 未使用 和 使用 抓包的报错信息,发现第一个 sha256 都是来自于知乎的公钥,但两个的 sha256 是不一样的。...这是两个公钥在不同 「中间证书认证」-「中间证书认证」……「根证书认证」这种认证体系下的一个hash串。...warning: 配置信任某个具体证书一定要与服务器开发或运维沟通好,因为如果服务器进行了证书替换而App没有更新到最新证书,App的请求将会失效。...还有什么骚操作 上面讲到我们配置到工程代码里的是 网站的公钥(任何人都可以随意下载) 根据HTTPS的原理,公钥和私钥的原理,其实完全可以在代码里配置上开发者的 charles 公钥(只针对某台具体的笔记本
今天我们来看一下 OKHttp 中是怎么处理 HTTP 的 TLS 安全连接的。...: 创建 TLS 套接字 配置 Socket 的加密算法,TLS版本和扩展 强行进行一次 TLS 握手 建立 SSL 会话 校验证书 证书锁定校验 如果成功连接,保存握手和 ALPN 的协议 创建 TLS...如果在java.security中设置了相应的属性,则验证证书链。 校验 接下来会获取 SSLSession 对象和握手信息 handshake。来做一些校验。 if (!...但是CA签发证书都存在有效期问题,所以缺点是在证书续期后需要将证书重新内置到客户端中。 除了这种方式,还有一种公钥锁定的方式。...提取证书中的公钥内置到客户端,通过与服务器端对比公钥值来验证合法性,并且在证书续期后,公钥也可以保持不变,避免了证书锁定的过期问题。
CA证书:CA证书CA证书内含服务端公钥与私钥,使用hash散列函数计算明文信息的信息摘要,然后采用CA证书内含的私钥对信息摘要进行加密最终生成签名。...即:证书 = 公钥 + 签名 +申请者和颁发者的信息。客户端中因为在操作系统中就预置了CA的公钥,所以支持解密签名。...2、服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,同时也返回服务器端的证书,即公钥证书 3、客户端使用服务端返回的信息验证服务器的合法性,包括: 证书是否过期发行服务器证书的CA是否可靠返回的公钥是否能正确解开返回证书中的数字签名服务器证书上的域名是否和服务器的实际域名相匹验证通过后...2.公钥锁定 HTTP公钥锁定是HTTPS网站防止攻击者CA机构错误签发的证书进行中间人攻击的一种安全机制,用于预防CA遭受入侵或其他会造成CA签发未授权证书的情况。...采用公钥锁定时,网站会提供已授权公钥的哈希列表,指示客户端在后续通讯中只接受列表上的公钥。提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。
即客户端使用对称加密生成密钥(key)对传输数据进行加密,然后使用非对称加密的公钥再对key进行加密。...5、数字证书 我们上面提到了HTTPS的工作原理,通过对称加密和非对称加密实现数据的安全传输。我们也知道非对称加密过程需要用到公钥进行加密。 那么公钥从何而来?其实公钥就被包含在数字证书中。...数字证书通常来说是由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,证书中包含了一个密钥对(公钥和私钥)和所有者识别信息。数字证书被放到服务端,具有服务器身份验证和数据传输加密功能。...7.1 双向认证流程 接下来我们来了解下双向认证的流程,以加深对双向认证的理解: a. 客户端发送一个连接请求给服务器。 b. 服务器将自己的证书,以及同证书相关的信息发送给客户端。 c....服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知客户端。 h. 客户端针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。 i.
但是如果是你们公司自签名(即自己用keytool生成的证书,而不是采用通过CA认证的证书)的服务器,OkHttp是无法访问的,例如访问12306网站(https://kyfw.12306.cn/otn/...握手过程的简单描述如下: 浏览器将自己支持的一套加密算法、HASH算法发送给网站。 网站从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。...证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。 浏览器获得网站证书之后,开始验证证书的合法性,如果证书信任,则生成一串随机数字作为通讯过程中对称加密的秘钥。...然后取出证书中的公钥,将这串数字以及HASH的结果进行加密,然后发给网站。...接下来的传输过程将由之前浏览器生成的随机密码并利用对称加密算法进行加密。 握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。
,先使用内置的证书信息校验一下服务器证书是否合法,如果不合法,直接断开。...认证方式:证书锁定 证书锁定(SSL/TLS Pinning)顾名思义,将服务器提供的SSL/TLS证书内置到移动端开发的APP客户端中,当客户端发起请求时,通过比对内置的证书和服务器端证书的内容,以确定这个连接的合法性...证书锁定需要把服务器的公钥证书(.crt 或者 .cer 等格式)提前下载并内置到App客户端中,创建TrustManager 时将公钥证书加进去。当请求发起时,通过比对证书内容来确定连接的合法性。...认证方式:公钥锁定 公钥锁定则需提取证书中的公钥内置到客户端中,通过比对公钥值来验证连接的合法性,由于证书更换依然可以保证公钥一致,所以公钥锁定不存在客户端频繁更换证书的问题。...指 Client 端内置 Server 端真正的公钥证书。在 HTTPS 请求时,Server 端发给客户端的公钥证书必须与 Client 端内置的公钥证书一致,请求才会成功。
3、 OKHttp 接入 HTTPDNS 既然了解了 HTTPDNS 的重要性,接下来看看如何在 OkHttp 中,集成 HTTPDNS。...OkHttp 是一个处理网络请求的开源项目,是 Android 端最火热的轻量级网络框架。在 OkHttp 中,默认是使用系统的 DNS 服务 InetAddress 进行域名解析。...服务端根据请求,选择合适的算法,下发公钥证书和随机数。 客户端对服务端证书,进行校验,并发送随机数信息,该信息使用公钥加密。 服务端经过私钥获取随机数信息。...双方根据以上交互的信息,生成 Session Ticket,用做该链接后续数据传输的加密密钥。 在这个流程中,客户端须要验证服务器下发的证书。...HTTPS 下的问题也获得解决,证书依然使用域名进行校验。 OkHttp 既然暴露出 dns 接口,咱们就尽可能使用它。
如何对协商过程进行加密 新问题来了,如何对协商过程进行加密?密码学领域中,有一种称为“非对称加密”的加密算法,特点是私钥加密后的密文,只要是公钥,都可以解密,但是公钥加密后的密文,只有私钥可以解密。...所以,我们不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密。...意思是,客户端在拿到证书后,自己就有能力分辨证书是否被篡改了。如何才能有这个能力呢? 我们从现实中找灵感。...其实呢,现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。...其实,问题应该是CA如何颁发给我们的网站管理员,而我们的管理员又如何将这个数字证书放到我们的服务器上。 我们如何向CA申请呢?每个CA机构都大同小异,我在网上找了一个: ?
所以,我们不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密。 ...意思是,客户端在拿到证书后,自己就有能力分辨证书是否被篡改了。如何才能有这个能力呢? 我们从现实中找灵感。...当客户端拿到证书后,开始对证书中的内容进行验证,如果客户端计算出来的证书编号与证书中的证书编号相同,则验证通过: ? 但是第三方机构的公钥怎么跑到了客户端的机器中呢?世界上这么多机器。 ...其实呢,现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。...其实,问题应该是CA如何颁发给我们的网站管理员,而我们的管理员又如何将这个数字证书放到我们的服务器上。 我们如何向CA申请呢?每个CA机构都大同小异,我在网上找了一个: ?
如何对协商过程进行加密 新问题来了,如何对协商过程进行加密?密码学领域中,有一种称为“非对称加密”的加密算法,特点是私钥加密后的密文,只要是公钥,都可以解密,但是公钥加密后的密文,只有私钥可以解密。...所以,我们不能直接将服务器的公钥传递给客户端,而是第三方机构使用它的私钥对我们的公钥进行加密后,再传给客户端。客户端再使用第三方机构的公钥进行解密。...意思是,客户端在拿到证书后,自己就有能力分辨证书是否被篡改了。如何才能有这个能力呢? 我们从现实中找灵感。...其实呢,现实中,浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。...其实,问题应该是CA如何颁发给我们的网站管理员,而我们的管理员又如何将这个数字证书放到我们的服务器上。 我们如何向CA申请呢?
三、 OKHttp 接入 HTTPDNS 既然了解了 HTTPDNS 的重要性,接下来看看如何在 OkHttp 中,集成 HTTPDNS。...OkHttp 是一个处理网络请求的开源项目,是 Android 端最火热的轻量级网络框架。在 OkHttp 中,默认是使用系统的 DNS 服务 InetAddress 进行域名解析。...服务端根据请求,选择合适的算法,下发公钥证书和随机数。 客户端对服务端证书,进行校验,并发送随机数信息,该信息使用公钥加密。 服务端通过私钥获取随机数信息。...双方根据以上交互的信息,生成 Session Ticket,用作该连接后续数据传输的加密密钥。 在这个流程中,客户端需要验证服务器下发的证书。...还是用域名进行访问,只是底层 DNS 解析换成了 HTTPDNS,以确保解析的 IP 地址符合预期。 2. HTTPS 下的问题也得到解决,证书依然使用域名进行校验。
HTTP(HyperText Transfer Protocol,超文本传输协议)被用于在Web浏览器和网站服务器之间传递信息,在TCP/IP中处于应用层。...这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,然后采用CA的私钥对信息摘要进行加密,加密完的密文就是签名。...客户端中因为在操作系统中就预置了CA的公钥,所以支持解密签名(因为签名使用CA的私钥加密的) 有了这些预备知识后,就可以来看看HTTPS是如何怎么做到安全认证的。...SSL-pinning有两种方式: 证书锁定(Certificate Pinning) 和公钥锁定( Public Key Pinning)。...但是CA签发证书都存在有效期问题,缺点是在 证书续期后需要将证书重新内置到APP中。 公钥锁定 提取证书中的公钥并内置到客户端中,通过与服务器对比公钥值来验证连接的正确性。
如何解决A的困惑呢?在上述场景中,邮件就是我们所说的消息。在讲解机密性的时候,我们知道公钥是公开的,而私钥则是独有,隐蔽的,因此私钥是可以代表持有者的身份。...证书主要包括5个部分: 签发者信息CA 使用者信息B B的密钥信息 B的公钥 数字签名 其中数字签名是由CA机构的私钥对证书上的信息(包括公钥)进行加密生成的。...首先说一下,证书是如何解决上述问题的,以数字签名那一节中的场景为例: 1.B手头有点紧,急需用钱,首先通过邮件将自己在CA机构申请的证书发给A。...2.A收到邮件后,看到证书签发者的信息是CA,于是拿着证书找CA机构,CA机构用自己的公钥对数字签名进行解密,并比对使用者信息,密钥信息等内容。如果一致,说明这是给B签发的证书,公钥是B的。...反向校验 在上图中,C找到B生成了证书,之前我们知道要验证证书中公钥的合法性,需要去找证书的签发者进行解密校验,同样道理,证书链也是这个流程,只不过是找了多级,C找B,B找A,A找CA。 ?
领取专属 10元无门槛券
手把手带您无忧上云