Как отключить проверку SSL-сертификата в ExoPlayer

Я пытаюсь установить соединение с https://10.10.10.10/file.mp4 (DNS через Https) и отправить домен в виде заголовка «HOST» вместе с запросом. Однако я получаю сообщение об ошибке:

        `E/ExoPlayerImplInternal: Playback error at com.google.android.exoplayer2.ExoPlaybackException: Source error
    at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:554)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:223)
    at android.os.HandlerThread.run(HandlerThread.java:67)
 Caused by: com.google.android.exoplayer2.upstream.HttpDataSource$HttpDataSourceException: Unable to connect
    at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:309)
    at com.google.android.exoplayer2.upstream.StatsDataSource.open(StatsDataSource.java:84)
    at com.google.android.exoplayer2.source.ProgressiveMediaPeriod$ExtractingLoadable.load(ProgressiveMediaPeriod.java:1013)
    at com.google.android.exoplayer2.upstream.Loader$LoadTask.run(Loader.java:415)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)
 Caused by: javax.net.ssl.SSLPeerUnverifiedException: Hostname 10.10.10.10 not verified:
      certificate: sha1/xyzxyzxyzETC.=
      DN: CN=domain.example.com
      subjectAltNames: [domain.example.com]
    at com.android.okhttp.internal.io.RealConnection.connectTls(RealConnection.java:205)
    at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:153)
    at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:116)
    at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:186)
    at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:128)
    at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:97)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:289)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:232)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:465)
    at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:131)
    at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.connect(DelegatingHttpsURLConnection.java:90)
    at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:30)
    at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:589)
    at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.makeConnection(DefaultHttpDataSource.java:493)
    at com.google.android.exoplayer2.upstream.DefaultHttpDataSource.open(DefaultHttpDataSource.java:307)
          ... 6 more`

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

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

Обратите внимание, что на самом деле я использую пакет better_player и запускаю Flutter, но я не думаю, что это должно иметь значение.

Мой код:

      void setDataSource(
        Context context, String key, String dataSource, String formatHint, Result result,
        Map<String, String> headers, boolean useCache, long maxCacheSize, long maxCacheFileSize) {
    this.key = key;

    isInitialized = false;

    Uri uri = Uri.parse(dataSource);
    DataSource.Factory dataSourceFactory;


    if (isHTTP(uri)) {
        DefaultHttpDataSourceFactory defaultHttpDataSourceFactory =
                new DefaultHttpDataSourceFactory(
                        "ExoPlayer",
                        null,
                        DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
                        DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,
                        true);
        if (headers != null) {
            defaultHttpDataSourceFactory.getDefaultRequestProperties().set(headers);
        }

        if (useCache && maxCacheSize > 0 && maxCacheFileSize > 0) {
            dataSourceFactory =
                    new CacheDataSourceFactory(context, maxCacheSize, maxCacheFileSize, defaultHttpDataSourceFactory);
        } else {
            dataSourceFactory = defaultHttpDataSourceFactory;
        }
    } else {
        dataSourceFactory = new DefaultDataSourceFactory(context, "ExoPlayer");
    }

    MediaSource mediaSource = buildMediaSource(uri, dataSourceFactory, formatHint, context);
    exoPlayer.prepare(mediaSource);

    result.success(null);
}

Куда мне вставить приведенный выше код?

Спасибо от продвинутого!

0 ответов

Другие вопросы по тегам