Как установить SSL-сертификат для Google Maps Android API UrlTileProvider? - PullRequest
0 голосов
/ 08 мая 2018

Я хочу установить собственный сертификат SSL для моего UrlTileProvider из Google Maps Android API. В моем подклассе UrlTileProvider я устанавливаю URL для WMS моего Geoserver по https.

Можете ли вы сказать мне, как установить SSLContext с помощью UrlTileProvider для использования моего SSL-сертификата?

1 Ответ

0 голосов
/ 08 мая 2018

Я нашел решение!

если я не устанавливаю SocketFactory напрямую для определенного соединения - я могу определить фабрику сокетов как DefaultSSLSocketFactory для HttpsURLConnections в целом.

См: Вместо применения этой функции:

urlConnection.setSSLSocketFactory(sslContext.getSocketFactory());

Я могу добавить Socket Factory по умолчанию:

// Load CAs from an InputStream
                // (could be from a resource or ByteArrayInputStream or ...)
                CertificateFactory cf = CertificateFactory.getInstance("X.509");

                InputStream caInput = mContext.get().getAssets().
                        open("mycert.crt");
                Certificate ca;
                try {
                    ca = cf.generateCertificate(caInput);
                    System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
                } finally {
                    caInput.close();
                }

                // Create a KeyStore containing our trusted CAs
                String keyStoreType = KeyStore.getDefaultType();
                KeyStore keyStore = KeyStore.getInstance(keyStoreType);
                keyStore.load(null, null);
                keyStore.setCertificateEntry("ca", ca);

                // Create a TrustManager that trusts the CAs in our KeyStore
                String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
                TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
                tmf.init(keyStore);

                sslContext = SSLContext.getInstance("TLSv1.2");
                sslContext.init(null, tmf.getTrustManagers(), null);
                HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
...