2016-11-02 3 views

ответ

2

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

Вот и все!

Этот метод даст вам все ваши сертификаты во всей цепочке. Это выгодно, так как это безопаснее, поскольку только один сертификат в цепочке должен соответствовать запросу, чтобы добиться успеха. Вероятно, в какой-то момент в будущем ваши сертификаты будут обновлены, но пока вся цепочка не будет обновлена, ваше приложение не должно ломаться.

 Смежные вопросы

  • Нет связанных вопросов^_^