Android安全加密:Https编程

澳门新葡亰3522平台游戏 4

Android安全加密专题文章索引

  1. Android安全加密:对称加密
  2. Android安全加密:非对称加密
  3. Android安全加密:消息摘要Message
    Digest
  4. Android安全加密:数字签名和数字证书
  5. Android安全加密:Https编程

以上学习所有内容,对称加密、非对称加密、消息摘要、数字签名等知识都是为了理解数字证书工作原理而作为一个预备知识。数字证书是密码学里的终极武器,是人类几千年历史总结的智慧的结晶,只有在明白了数字证书工作原理后,才能理解Https
协议的安全通讯机制。最终才能在SSL 开发过程中得心应手。

另外,对称加密和消息摘要这两个知识点是可以单独拿来使用的。

知识点串联:

数字证书使用到了以上学习的所有知识

  • 对称加密与非对称加密结合使用实现了秘钥交换,之后通信双方使用该秘钥进行对称加密通信。
  • 澳门新葡亰3522平台游戏,消息摘要与非对称加密实现了数字签名,根证书机构对目标证书进行签名,在校验的时候,根证书用公钥对其进行校验。若校验成功,则说明该证书是受信任的。
  • Keytool
    工具可以创建证书,之后交给根证书机构认证后直接使用自签名证书,还可以输出证书的RFC格式信息等。
  • 数字签名技术实现了身份认证与数据完整性保证。
  • 加密技术保证了数据的保密性,消息摘要算法保证了数据的完整性,对称加密的高效保证了数据处理的可靠性,数字签名技术保证了操作的不可否认性。

通过以上内容的学习,我们要能掌握以下知识点:

  • 基础知识:bit 位、字节、字符、字符编码、进制转换、io
  • 知道怎样在实际开发里怎样使用对称加密解决问题
  • 知道对称加密、非对称加密、消息摘要、数字签名、数字证书是为了解决什么问题而出现的
  • 了解SSL 通讯流程
  • 实际开发里怎样请求Https 的接口

Android安全加密专题文章索引

  1. Android安全加密:对称加密
  2. Android安全加密:非对称加密
  3. Android安全加密:消息摘要Message
    Digest
  4. Android安全加密:数字签名和数字证书
  5. Android安全加密:Https编程

概述

SSL(Secure Sockets
Layer 安全套接层),为网景公司(Netscape)所研发,用以保障在Internet
上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。一般通用之规格为40
bit 之安全标准,美国则已推出128 bit 之更高安全标准,但限制出境。只要3.0
版本以上之I.E.或Netscape 浏览器即可支持SSL。

TLS(Transport Layer
Security 传输层安全),用于在两个通信应用程序之间提供保密性和数据完整性。TLS
是SSL 的标准化后的产物,有1.0 ,1.1 ,1.2 三个版本,默认使用1.0。TLS1.0
和SSL3.0 几乎没
有区别,事实上我们现在用的都是TLS,但因为历史上习惯了SSL 这个称呼。

概述

SSL(Secure Sockets Layer
安全套接层),为网景公司(Netscape)所研发,用以保障在Internet
上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。一般通用之规格为40
bit 之安全标准,美国则已推出128 bit 之更高安全标准,但限制出境。只要3.0
版本以上之I.E.或Netscape 浏览器即可支持SSL。

TLS(Transport Layer Security
传输层安全),用于在两个通信应用程序之间提供保密性和数据完整性。TLS
是SSL 的标准化后的产物,有1.0 ,1.1 ,1.2 三个版本,默认使用1.0。TLS1.0
和SSL3.0 几乎没
有区别,事实上我们现在用的都是TLS,但因为历史上习惯了SSL 这个称呼。

SSL 通信简单图示:

澳门新葡亰3522平台游戏 1

SSL 通信简单图示:

澳门新葡亰3522平台游戏 2

这里写图片描述

SSL 通信详细图示:

澳门新葡亰3522平台游戏 3

当请求使用自签名证书的网站数据时,例如请求12306
的客运服务页面:,则会报下面的错误,原因是客户端的根认证机构不能识别该证书错误信息:unable
to find valid certification path to requested target

SSL 通信详细图示:

澳门新葡亰3522平台游戏 4

这里写图片描述

当请求使用自签名证书的网站数据时,例如请求12306
的客运服务页面:https://kyfw.12306.cn/otn/,则会报下面的错误,原因是客户端的根认证机构不能识别该证书错误信息:unable
to find valid certification path to requested target

解决方案1

一个证书可不可信,是由TrustManager
决定的,所以我们只需要自定义一个什么都不做的TrustManager即可,服务器出示的所有证书都不做校验,一律放行。

public static void main(String[] args) throws Exception {
//协议传输层安全TLS(transport layer secure)
SSLContext sslContext = SSLContext.getInstance("TLS");
//创建信任管理器(TrustManager 负责校验证书是否可信)
TrustManager[] tm = new TrustManager[]{new EmptyX509TrustManager()};
//使用自定义的信任管理器初始化SSL 上下文对象
sslContext.init(null, tm, null);
//设置全局的SSLSocketFactory 工厂(对所有ssl 链接都产生影响)
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

 //URL url = new URL("https://www.baidu.com");
 URL url = new URL("https://kyfw.12306.cn/otn/");
 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
 InputStream in = conn.getInputStream();
 System.out.println(Util.inputstream2String(in));
 }

 /**
 * 自定义一个什么都不做的信任管理器,所有证书都不做校验,一律放行
 */
 private static class EmptyX509TrustManager implements X509TrustManager{
 @Override
 public void checkClientTrusted(X509Certificate[] chain, String authType)
 throws CertificateException {
 }

 @Override
 public void checkServerTrusted(X509Certificate[] chain, String authType)
 throws CertificateException {
 }

 @Override
 public X509Certificate[] getAcceptedIssuers() {
 return null;
 }
}

解决方案1

一个证书可不可信,是由TrustManager
决定的,所以我们只需要自定义一个什么都不做的TrustManager即可,服务器出示的所有证书都不做校验,一律放行。

public static void main(String[] args) throws Exception {
//协议传输层安全TLS(transport layer secure)
SSLContext sslContext = SSLContext.getInstance("TLS");
//创建信任管理器(TrustManager 负责校验证书是否可信)
TrustManager[] tm = new TrustManager[]{new EmptyX509TrustManager()};
//使用自定义的信任管理器初始化SSL 上下文对象
sslContext.init(null, tm, null);
//设置全局的SSLSocketFactory 工厂(对所有ssl 链接都产生影响)
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());

 //URL url = new URL("https://www.baidu.com");
 URL url = new URL("https://kyfw.12306.cn/otn/");
 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
 InputStream in = conn.getInputStream();
 System.out.println(Util.inputstream2String(in));
 }

 /**
 * 自定义一个什么都不做的信任管理器,所有证书都不做校验,一律放行
 */
 private static class EmptyX509TrustManager implements X509TrustManager{
 @Override
 public void checkClientTrusted(X509Certificate[] chain, String authType)
 throws CertificateException {
 }

 @Override
 public void checkServerTrusted(X509Certificate[] chain, String authType)
 throws CertificateException {
 }

 @Override
 public X509Certificate[] getAcceptedIssuers() {
 return null;
 }
}