【发布时间】:2015-05-30 04:04:42
【问题描述】:
我正在创建一个使用https 与服务器通信的android 应用程序。我正在使用retrofit 和OkHttp 提出请求。这些适用于标准http 请求。以下是我遵循的步骤。
第 1 步: 使用命令从服务器获取证书文件
echo -n | openssl s_client -connect api.****.tk:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > gtux.cert
第 2 步: 使用以下命令将证书转换为 BKS 格式
keytool -importcert -v -trustcacerts -file "gtux.cert" -alias imeto_alias -keystore "my_keystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-146.jar" -storetype BKS
它要求我输入密码并且文件已成功创建。
第 3 步:
创建一个 OkHttpClient 并使用它来发出 https 请求
public class MySSLTrust {
public static OkHttpClient trustcert(Context context){
OkHttpClient okHttpClient = new OkHttpClient();
try {
KeyStore ksTrust = KeyStore.getInstance("BKS");
InputStream instream = context.getResources().openRawResource(R.raw.my_keystore);
ksTrust.load(instream, "secret".toCharArray());
// TrustManager decides which certificate authorities to use.
TrustManagerFactory tmf = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ksTrust);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
} catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | KeyManagementException e) {
e.printStackTrace();
}
return okHttpClient;
}
}
第 4 步:
必须创建 RestAdapter
RestAdapter.Builder()
.setRequestInterceptor(intercept)
.setEndpoint("https://api.****.tk")
.setClient(new OkClient(this))
.setLogLevel(RestAdapter.LogLevel.FULL)
.setLog(new AndroidLog("RETROFIT"))
.build();
但最后,当运行应用程序时,它把我扔了CertPathValidatorException : Trust anchor for certificate path not found。请帮我解决这个问题。谢谢你。
其他失败尝试: 试图在我的 Xperia Z2 中安装证书,它说文件已安装,但是当我运行应用程序时,抛出了相同的异常。
错误日志 这是我执行的错误日志...
贴在那里以便于阅读..
【问题讨论】:
标签: android ssl retrofit okhttp