Как включить привязку сертификата с помощью OkHttp для моего приложения Android/Java?Как включить фиксацию сертификата с помощью OkHttp
ответ
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();
Вот и все!
Этот метод даст вам все ваши сертификаты во всей цепочке. Это выгодно, так как это безопаснее, поскольку только один сертификат в цепочке должен соответствовать запросу, чтобы добиться успеха. Вероятно, в какой-то момент в будущем ваши сертификаты будут обновлены, но пока вся цепочка не будет обновлена, ваше приложение не должно ломаться.