【问题标题】:How to enable certificate pinning with OkHttp如何使用 OkHttp 启用证书固定
【发布时间】:2016-11-02 20:25:24
【问题描述】:

如何使用 OkHttp 为我的 Android / Java 应用程序启用证书固定?

【问题讨论】:

    标签: certificate ssl-certificate okhttp okhttp3


    【解决方案1】:

    OkHttp documentation 为我们提供了一个清晰的方法来完成此操作并提供示例代码。如果它消失了,它会粘贴在下面:

    1.添加损坏的CertificatePinner 并提出请求。 任何请求都可以,即使它不存在。您可以在您的 Android 应用程序中执行此操作,或者只是创建一个虚拟 Java 应用程序并运行它。

    例如,要固定 https://publicobject.com,请从损坏的 配置:

    String hostname = "publicobject.com";
    CertificatePinner certificatePinner = new CertificatePinner.Builder()
        .add(hostname, "sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=")
        .build();
    OkHttpClient client = OkHttpClient.Builder()
        .certificatePinner(certificatePinner)
        .build();
    
    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)
    

    2。正确配置 OkHttp 客户端:

    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();
    

    仅此而已!

    此方法将为您提供整个链中的所有证书。这是有利的,因为它更安全,因为链中只有一个证书必须匹配才能使请求成功。很可能在未来的某个时候,您的证书会被更新,但只要整个链没有更新,您的应用程序就不会中断。

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 2014-07-23
      • 2017-12-17
      • 2021-02-04
      • 2018-01-19
      • 1970-01-01
      • 2015-07-21
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多