【问题标题】:Exoplayer. How to validate server certificate?外挂。如何验证服务器证书?
【发布时间】:2018-10-03 00:26:08
【问题描述】:

我正在尝试通过 https 连接到服务器,Android 无法将证书识别为“受信任”,因此出现以下异常:

javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:
Trust anchor for certification path not found.

为了解决这个问题,我在应用程序(资产文件夹)中包含了证书,并使用它来验证服务器证书。

我使用一个名为 CustomSSLSocketFactory 的类来执行此操作,它在其中读取证书并在 https 连接期间进行验证过程没有问题。

link in Spanish

link in English

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(CustomSSLSocketFactory.getSSLSocketFactory(context));

现在我不得不重复这个过程但是使用exoplayer2播放hlsvideo,经过几天的调查我没有实现。

private MediaSource buildMediaSourceHlsMedia(Uri uri) throws MalformedURLException {

    String UserAgent = Util.getUserAgent(getContext (), getResources().getString(R.string.app_name));
    int minLoadableRetryCount;
    DefaultHttpDataSourceFactory dataSourceFactory =new DefaultHttpDataSourceFactory( UserAgent,BANDWIDTH_METER,DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS, DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,true);
    dataSourceConHeader(dataSourceFactory,uri.toString(),mParam4);
    MediaSource ms= new HlsMediaSource.Factory(dataSourceFactory).setMinLoadableRetryCount(5).createMediaSource(uri);
    return ms;

}

我想有必要编写一个自定义数据源,但几天后,我无法实现。我不知道怎么做。 我想我必须包含在自定义数据源中,(以及其余必要的代码):
conn.setSSLSocketFactory(CustomSSLSocketFactory.getSSLSocketFactory(context));

有人可以指导我吗?谢谢

【问题讨论】:

    标签: ssl datasource exoplayer sslhandshakeexception


    【解决方案1】:

    我使用带有本地 URL 的 exoplayer,例如“https://10.10.10.xx/file.flv”。

    我这样做是为了忽略检查验证。

    private static void disableSSLCertificateVerify() {
        TrustManager[] trustAllCerts = new TrustManager[] {
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        X509Certificate[] myTrustedAnchors = new X509Certificate[0];
                        return myTrustedAnchors;
                    }
    
                    @Override
                    public void checkClientTrusted(X509Certificate[] certs, String authType) {}
    
                    @Override
                    public void checkServerTrusted(X509Certificate[] certs, String authType) {}
                }
        };
    
        try {
            SSLContext sc = SSLContext.getInstance("SSL");
    
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
    

    我知道也许为时已晚。但希望对您有所帮助。

    【讨论】:

    • 感谢您的回复,但在这种情况下无法避免检查验证。
    • 不要对您已发布的应用执行此操作,Google Play 会发现并希望您删除此代码。
    猜你喜欢
    • 1970-01-01
    • 2010-09-09
    • 2015-05-13
    • 2021-11-11
    • 2011-07-07
    • 2019-05-13
    • 2012-11-14
    • 2018-10-20
    • 2013-06-17
    相关资源
    最近更新 更多