Почему нет необходимости менять сертификат, закрепленный в приложении для Android, даже после обновления SSL-сертификата? - PullRequest
0 голосов
/ 04 июня 2018

Я использую SSL Certificate Pining в своем приложении для Android, теперь, когда я обновил SSL-сертификат, я подумал, что в моем Android-приложении я только делаю Certificate Pining, а не Public Key Pining, мне нужно будет изменить Сертификат в моем Androidпроект и снова обновить мое приложение в магазине Play, но дело в том, что мое приложение работает совершенно нормально без необходимости обновлять файл сертификата в моем проекте Android.

Может кто-нибудь сказать мне, это нормальное поведение??

Код

public Certificate findCertificate() throws CertificateException {
        CertificateFactory instance = CertificateFactory.getInstance("X.509");
        InputStream resourceAsStream = getResources().openRawResource(R.folder.certificate_name);
        InputStream bufferedInputStream = new BufferedInputStream(resourceAsStream);
        try {
            Certificate generateCertificate = instance.generateCertificate(bufferedInputStream);
            try {
                resourceAsStream.close();
            } catch (IOException e) {
            }
            return generateCertificate;
        } finally {
            try {
                bufferedInputStream.close();
            } catch (IOException e2) {
            }
            try {
                resourceAsStream.close();
            } catch (IOException e3) {
            }
        }
    }

    public SSLContext findSSLConfiguration(Context context) throws CertificateException, IOException,
            KeyStoreException, NoSuchAlgorithmException, KeyManagementException {

        CertificateFactory cf = null;
        cf = CertificateFactory.getInstance("X.509");

        Certificate ca = findCertificate();

        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, tmf.getTrustManagers(), null);

        return sslContext;
    }

    public void server_call() throws CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException {
        OkHttpClient okHttp = new OkHttpClient.Builder()
                .sslSocketFactory(findSSLConfiguration(getBaseContext()).getSocketFactory())
                .build();
    }
...