我有一个要集成到android应用中的API。 API使用双向ssl握手。 我需要在我的应用程序TrustStore中添加服务器证书,并在Keystore中添加jks文件,以验证连接握手。
我在stackoverflow上进行了大量搜索,但对任何答案都不满意。
任何人都可以针对我的问题提供一些参考或解决方案。
编辑
我正在使用Http实现来建立连接。
public static SSLContext getSSLContext(Context context){
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream input_ca_main = new BufferedInputStream(context.getResources().openRawResource(R.raw.main));
Certificate ca_main;
ca_main = cf.generateCertificate(input_ca_main);
System.out.println("ca=" + ((X509Certificate) ca_main).getSubjectDN());
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca_main", ca_main);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext sslcontext = SSLContext.getInstance("TLS");
sslcontext.init(null, tmf.getTrustManagers(), null);
return sslcontext;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
这就是我用来在请求中包含证书的内容。但是在阅读了双向SSL的概念后,我发现服务器证书必须位于我们的信任库中。
答案 0 :(得分:0)
如果您正在寻找要添加到设备中受信任证书中的服务器证书。恐怕您必须使用信任库来遵循在其他示例中看到的内容。
如果您正在寻找一种向请求中添加证书的方法,请尝试以下代码(假设您使用的是volley):
KeyStore keyStore = KeyStore.getInstance("PKCS12"); // this will be your certificate files extension.
keyStore.load(
new ByteArrayInputStream(Base64Helper.decodeIntoByteArray(YOUR_CERTIFICATE_HERE),
YOUR_CERT_PASSWORD_HERE);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, YOUR_CERT_PASSWORD);
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(keyManagerFactory.getKeyManagers(), null, null);
HurlStack hurlStack = new HurlStack(null, sslContext.getSocketFactory());
requestQueue = Volley.newRequestQueue(EMISMobileApplication.getInstance().getAppContext(), hurlStack);
然后使用此请求队列连接回服务器。