certificate - 如何使用 OkHttp 启用证书固定

标签 certificate ssl-certificate okhttp

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

最佳答案

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

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

例如,固定 https://publicobject.com , 从 splinter 开始 配置:

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

就是这样!

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

关于certificate - 如何使用 OkHttp 启用证书固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40389150/

相关文章:

.net - SSL 证书验证 - 是否涉及缓存?

android - java.lang.IllegalStateException 因为 okhttp 异步 HTTP POST 请求中的 onResponse 代码

java - 如何使用 okhttp 添加适当的内容长度 header ?

docker - docker 容器中的 terraform init 出现错误 -- x509 : certificate signed by unknown authority

iphone - 从头开始申请iphone开发者证书?

python-3.x - 无法安装 python 包 - 找不到合适的 TLS 证书包

安全证书安装

java - 如何给已经构建好的OkHttp请求对象添加header?

javascript - 在 JavaScript 中检查 SSL 证书是否有效

python - 如何从包含 EAP 的 Radius sniffertrace 中提取证书