读OkHttp3源码(二):CertificatePinner(锁定证书)

okhttp3
public final class CertificatePinner extends Object

类介绍:

该类用于约束哪些证书是可信的。 锁定证书可以防止对证书颁发机构相关的攻击。 它还阻止通过用户已知或未知的中间证书颁发机构建立的连接。 这个类目前锁定了一个证书的主题公钥信息,如Adam Langley的博客所述。公钥不是HTTP公钥锁定(HPKP)中的base64 SHA-256哈希,就是Chromium静态证书中的SHA-1 base64哈希。 HTTP Public Key Pinning (HPKP)  Chromium静态证书 。
1.设置固定证书:
理解锁定主机最简单的方法是打开错误配置的锁定,并在连接失败时读取预期配置。 一定要在可信的网络上完成,不要使用像Charles或Fiddler这样的中间工具。 例如,要锁定https://publicobject.com,请从一个错误的配置开始

String hostname = "publicobject.com";
     CertificatePinner certificatePinner = new CertificatePinner.Builder()
         .add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
         .build();
     OkHttpClient client = new OkHttpClient();
     client.setCertificatePinner(certificatePinner);

     Request request = new Request.Builder()
         .url("https://" + hostname)
         .build();
     client.newCall(request).execute();

正如预期的那样,以一个证书锁定异常而失败了:

javax.net.ssl.SSLPeerUnverifiedException: Certificate pinning failure!
   Peer certificate chain:
     sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=: CN=publicobject.com, OU=PositiveSSL
     sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=: CN=COMODO RSA Secure Server CA
     sha256/grX4Ta9HpZx6tSHkmCrvpApTQGo67CYDnvprLg5yRME=: CN=COMODO RSA Certification Authority
     sha256/lCppFqbkrlJ3EcVFAkeip0+44VaoJUymbnOaEUk7tEU=: CN=AddTrust External CA Root
   Pinned certificates for publicobject.com:
     sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
   at okhttp3.CertificatePinner.check(CertificatePinner.java)
   at okhttp3.Connection.upgradeToTls(Connection.java)
   at okhttp3.Connection.connect(Connection.java)
   at okhttp3.Connection.connectAndSetOwner(Connection.java)
 

接下来,将异常中的公钥散列粘贴到证书pinner的配置中

CertificatePinner certificatePinner = new CertificatePinner.Builder()
       .add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
       .add("publicobject.com", "sha256/klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY=")
       .add("publicobject.com", "sha256/grX4Ta9HpZx6tSHkmCrvpApTQGo67CYDnvprLg5yRME=")
       .add("publicobject.com", "sha256/lCppFqbkrlJ3EcVFAkeip0+44VaoJUymbnOaEUk7tEU=")
       .build();

Pinning是每个主机名和/或每个通配符模式。要同时使用publicobject.com和www.publicobject.com,必须配置这两个主机名。

2.通配符模式规则:

  • 星号*只允许出现在最左边的域名标签中,并且必须是该标签(即,必须匹配整个最左边的标签)。例如,允许*.example.com,而*a.example.com, a*.example.com, a b.example.com, a.*.example.com不允许。
  • 星号@{code *}不能跨域名标签匹配。例如,*.example.com匹配test.example.com,但不匹配sub.test.example.com。
  • 不允许为单标签域名使用通配符模式。
  • 如果主机名直接或通过通配符模式锁定,将使用直接或通配符固定。 例如:*.example.com用pin1pin1固定,a.example.com用pin2固定,检查a.example.com将使用pin1和pin2

3.警告: 证书锁定是危险的!

锁定证书限制了服务器团队更新TLS证书的能力。通过锁定证书,可以增加操作复杂性,并限制在证书颁发机构之间迁移的能力。如果没有服务器的TLS管理员的许可,不要使用证书固定!

成员变量:

1.private final List<Pin> pins;

Pin是CertificatePinner的静态内部类。直接上源码:

static final class Pin {
        /**
         * 主机名,如example.com或如*.example.com的一种形式。
         */
        final String pattern;
        /**
         * 或者sha1/或者sha256/.
         */
        final String hashAlgorithm;
        /**
         * 使用{@link #hashAlgorithm}的固定证书的哈希。
         */
        fi
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值