如何使用OkHttp实现证书锁定

3
如何在Android / Java应用程序中使用OkHttp启用证书固定?
1个回答

6
OkHttp文档为我们提供了一种明确的方法来实现此操作,并附带示例代码。如果该链接失效,以下是复制的内容: 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客户端:

请确保正确配置您的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();

就是这样了!

这种方法将为您提供整个证书链中的所有证书。这是有利的,因为只需要匹配链中的一个证书即可使请求成功,这样更加安全。未来可能会更新您的证书,但只要整个链不被更新,您的应用程序就不会出现问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接