【问题标题】:how to ignore ssl error on android volley http request?如何忽略 android volley http 请求上的 ssl 错误?
【发布时间】:2019-07-22 11:11:23
【问题描述】:

我正在制作一个通过 HTTPS 请求 m3u8 文件的电视应用程序。当我在 Android 4.4 上运行它时,我在 logcat 中看到一些“握手失败”。我怀疑它与 SSL 验证问题有关。我可以知道如何忽略这些错误吗?

我看到有一些方法,比如通过扩展 X509TrustManager 来编写我自己的 HTTPSTrustManager。但是代码是在JAVA中的。我的应用程序在 Kotlin 中。我是 Android 开发的新手。有人可以帮我解决这个问题吗?

谢谢。

【问题讨论】:

  • 尝试使用http而不是https
  • @JuanDanielOrnella no... m3u8 文件不受我控制。如果我能控制它,我会尝试修复所有 HTTPS 错误 LOL
  • 有人可以签出我的项目并看看吗?它在 Lollipop 及更高版本上运行良好,但在 Kitkat 4.4 上运行良好。我认为这是由于 HTTPS 错误,但我怀疑...github.com/y2kbug-hk/dev.thematrix.tvhk
  • "但是代码是 JAVA 的,我的应用是 Kotlin 的。" Android Studio 的 kotlin 插件可以帮你把 Java 代码转换成 Kotlin。尽管在不理解错误含义的情况下忽略错误听起来不是一个好主意。

标签: android kotlin android-volley


【解决方案1】:

您可以使用 Volley 使用自签名证书

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    RequestQueue rq = Volley.newRequestQueue(this, new HurlStack(null, getSocketFactory()));


    StringRequest s = new StringRequest(Request.Method.GET,  "https://192.168.1.10:443",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String s) {

                    Log.e("RESULT",s);

                }
            }, 

           new Response.ErrorListener() {
               @Override
               public void onErrorResponse(VolleyError volleyError) {
                     Log.e("RESULTfailder",volleyError.getMessage()); }
          } );

    rq.add(s);
 }


private SSLSocketFactory getSocketFactory() {

       CertificateFactory cf = null;
       try {
           cf = CertificateFactory.getInstance("X.509");
           InputStream caInput = getResources().openRawResource(R.raw.server);
           Certificate ca;
           try {
               ca = cf.generateCertificate(caInput);
               Log.e("CERT", "ca=" + ((X509Certificate) ca).getSubjectDN());
           } finally {
               caInput.close();
           }


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


           HostnameVerifier hostnameVerifier = new HostnameVerifier() {
               @Override
               public boolean verify(String hostname, SSLSession session) {

                    Log.e("CipherUsed", session.getCipherSuite());
                    return hostname.compareTo("192.168.1.10")==0; //The Hostname of your server

               }
           };


           HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
           SSLContext context = null;
           context = SSLContext.getInstance("TLS");

           context.init(null, tmf.getTrustManagers(), null);
           HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());

           SSLSocketFactory sf = context.getSocketFactory();


           return sf;

       } catch (CertificateException e) {
           e.printStackTrace();
       } catch (NoSuchAlgorithmException e) {
           e.printStackTrace();
       } catch (KeyStoreException e) {
           e.printStackTrace();
       } catch (FileNotFoundException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       } catch (KeyManagementException e) {
           e.printStackTrace();
       }

       return  null;
   }

}

【讨论】:

  • 我已经评论了我的问题。你可以看看吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多