如何忽略android volley http请求上的ssl错误?
我正在制作一个通过HTTPS请求m3u8文件的电视应用程序。当我在Android 4.4上运行它时,我在logcat中看到一些“握手失败”。我怀疑这与SSL验证问题有关。我可以知道如何忽略这些错误吗 我看到了一些方法,比如通过扩展X509TrustManager来编写自己的HTTPSTrustManager。但是代码是用JAVA编写的。我的申请书在科特林。我是Android开发新手。谁能帮我一下吗如何忽略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
谢谢。您可以使用截图使用自签名证书
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。虽然忽略错误甚至不理解它们的意思听起来不是个好主意。我已经对我的问题发表了评论。你能看一下吗?谢谢