如何忽略android volley http请求上的ssl错误?

如何忽略android volley http请求上的ssl错误?,android,kotlin,android-volley,Android,Kotlin,Android Volley,我正在制作一个通过HTTPS请求m3u8文件的电视应用程序。当我在Android 4.4上运行它时,我在logcat中看到一些“握手失败”。我怀疑这与SSL验证问题有关。我可以知道如何忽略这些错误吗 我看到了一些方法,比如通过扩展X509TrustManager来编写自己的HTTPSTrustManager。但是代码是用JAVA编写的。我的申请书在科特林。我是Android开发新手。谁能帮我一下吗 谢谢。您可以使用截图使用自签名证书 public class MainActivity exten

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

我看到了一些方法,比如通过扩展X509TrustManager来编写自己的HTTPSTrustManager。但是代码是用JAVA编写的。我的申请书在科特林。我是Android开发新手。谁能帮我一下吗


谢谢。

您可以使用截图使用自签名证书

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

}
public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RequestQueue rq=Volley.newRequestQueue(这是一个新的HurlStack(null,getSocketFactory());
StringRequests=新的StringRequest(Request.Method.GET)https://192.168.1.10:443",
新的Response.Listener(){
@凌驾
公共void onResponse(字符串s){
Log.e(“结果”,s);
}
}, 
新的Response.ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
Log.e(“resultfailer”,volleyError.getMessage());}
} );
rq.添加(s);
}
私有SSLSocketFactory getSocketFactory(){
CertificateFactory cf=null;
试一试{
cf=CertificateFactory.getInstance(“X.509”);
InputStream caInput=getResources().openRawResource(R.raw.server);
证书ca;
试一试{
ca=cf.generateCertificate(caInput);
Log.e(“CERT”、“ca=“+((X509Certificate)ca).getSubjectDN());
}最后{
caInput.close();
}
字符串keyStoreType=KeyStore.getDefaultType();
KeyStore KeyStore=KeyStore.getInstance(keyStoreType);
load(null,null);
密钥库设置认证尝试(“ca”,ca);
字符串tmfAlgorithm=TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf=TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(密钥库);
HostnameVerifier HostnameVerifier=新的HostnameVerifier(){
@凌驾
公共布尔验证(字符串主机名、SSLSession会话){
Log.e(“CipherUsed”,session.getCipherSuite());
返回hostname.compareTo(“192.168.1.10”)==0;//服务器的主机名
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
SSLContext context=null;
context=SSLContext.getInstance(“TLS”);
context.init(null,tmf.getTrustManagers(),null);
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
SSLSocketFactory sf=context.getSocketFactory();
返回sf;
}捕获(证书例外e){
e、 printStackTrace();
}捕获(无算法异常){
e、 printStackTrace();
}捕获(KeyStoreException e){
e、 printStackTrace();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(密钥管理异常e){
e、 printStackTrace();
}
返回null;
}
}

尝试改用httphttps@JuanDanielOrnella不我无法控制m3u8文件。如果我能控制它,我会尝试修复所有HTTPS错误。有人可以签出我的项目并看一看吗?它在棒棒糖和更高版本上运行良好,但在Kitkat 4.4上运行不好。我认为这是由于HTTPS错误,但我怀疑。。。“但是代码是用JAVA编写的。我的应用程序是用Kotlin编写的。”Android Studio的Kotlin插件可以为您将JAVA代码转换为Kotlin。虽然忽略错误甚至不理解它们的意思听起来不是个好主意。我已经对我的问题发表了评论。你能看一下吗?谢谢