EP24-对SSL的理解

对SSL的理解

SSL和证书

几年前我曾经做过一个对短信内容进行加密的app,当时就发现非对称加密(比如AES)的耗时要比对称加密(比如DES)长得多。我们知道http使用「三次握手」建立连接,客户端发送SYN,服务端发回SYN/ACK,客户端再发回ACK,连接就建立了。SSL建立连接的过程是四次握手:

  1. 客户端发出请求,内容包含
  • 支持的协议
  • 一个用于生成session key的随机数
  • 支持的加密算法
  • 支持的压缩算法
  1. 服务端回应
  • 确认协议版本(双方必须一致)
  • 一个用于生成session key的随机数
  • 确认使用的加密方法
  • 服务器证书
  1. 客户端回应
    从服务器拿到了证书,客户端要先检查证书颁发机构是是否可信,证书中的域名是否与实际域名一致,证书是否过期。

    好了,验证了证书之后就从里面取出公钥,现在往回发:

  • 一个用公钥加密过的随机数(这是第三个随机数了,这3个随机数生成Session Key来加密传输内容, 随机数保证了Session Key不会每次都一样)
  • 编码改变通知(接下来通信用新的加密方法来通信了)
  • 客户端握手结束通知
  1. 服务器最后回应
  • 编码改变通知
  • 握手结束通知

握手结束之后,客户端和服务端进行的通信就是普通的HTTP通信了,只不过传输的内容都是用前面的Session Key加密过的,你在fiddler里看到的都将是加密过的数据。啊对了,这时候用的加密算法就是对称加密了,速度很快。频繁地建立SSL session的话会对服务器造成很大负担。

又要拿12306举例子。。访问12306的时候chrome会提示「您的连接不是私密连接」,这是因为12306的SSL证书不是CA颁布的,而是自己用keytool生成的。

Android应用程序中验证证书

比如,股神的证书验证是这样的:
创建一个X509TrustManager,覆写其中的验证本地/服务器证书的方法:

//父类引用指向子类对象。。。但是父类引用不能访问子类独有的方法哦
TrustManager tm = new X509TrustManager() {
            public void checkClientTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
            }

            public void checkServerTrusted(X509Certificate[] chain,
                                           String authType) throws CertificateException {
                if (mPublicKeyWangYin == null) {
                    throw new CertificateException(
                            "checkServerTrusted: publickey is null");
                }

                // 对比
                boolean expected = Arrays.equals(mPublicKeyWangYin, chain[0]
                        .getPublicKey().getEncoded());
                assert (expected);
                if (expected) {
                    return;
                }
                ...

注意,这里验证本地证书的方法没有重写,因为只有某些特别的场合,比如某些网络要求特定的设备才能连接的情况下才需要重写这个方法。
然后就可以把这个TrustManager塞进SSLontext:

            mSSLContext.init(null, new TrustManager[] { tm }, null);

注意,上面的mPublicKeyWangYin是保存在本地的证书中提取的公钥的字符串。

另外,checkServerTrusted这个方法是查不到调用者的,这个就像onClickListener一样,是系统触发的。我们把验证的方法塞进去就行了。


此外,关于对称和分对称加密可以看看下面这个故事,很逗:
http://zhihu.com/question/21518760/answer/19698894

Reference:
[1]http://blog.csdn.net/mr_jj_lian/article/details/6860845
[2]http://blog.csdn.net/lmj623565791/article/details/48129405

你可能感兴趣的:(EP24-对SSL的理解)