【发布时间】:2018-04-28 07:47:45
【问题描述】:
我在我的代码中使用这一行来确保我的应用程序使用我在原始文件夹中的证书文件对服务器进行身份验证。
HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
问题是,如果我添加此行 Google Maps stop loading,如果我删除此行,地图会加载,但我的应用无法连接到 https://XXX.com/ 上的 API登录
当谷歌地图停止加载时,我没有收到任何错误消息。否则,如果我删除上面的行,我会收到 SSLHandshake 错误。我正在使用 Volley 来处理我的网络请求。不知道从这里去哪里。寻求帮助社区!
代码
private SSLSocketFactory getSocketFactory() {
CertificateFactory cf = null;
try {
cf = CertificateFactory.getInstance("X.509");
InputStream caInput = getResources().openRawResource(R.raw.catchme);
Certificate ca;
try {
ca = cf.generateCertificate(caInput);
Log.e("sslAuth", "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("sslAuth", "CipherUsed "+session.getCipherSuite());
Log.e("sslAuth", "hostname "+hostname);
if(hostname.compareTo("xxxxxx.com")==0)
return true;
else if(hostname.compareTo("google.com")==0)
return true;
else
return false;
}
};
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 RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
//mRequestQueue = Volley.newRequestQueue (getApplicationContext ());
mRequestQueue = Volley.newRequestQueue(this, new HurlStack(null, getSocketFactory()));
}
return mRequestQueue;
}
【问题讨论】:
-
为什么要使用静态 SSL 证书?
-
只是说您的后端开发人员要正确链接证书。你不需要添加静态。
-
使用此链接检查您的后端是否支持android。ssllabs.com/ssltest
-
你的意思是我在我的 Raw 文件夹中的证书文件,我应该在 android 代码中根本没有这个文件吗?有没有其他更好的方法来做到这一点?不知道为什么启用此代码后 Google 地图会停止加载...
标签: android google-maps ssl https