免责声明:这个答案来自Jul 2015和用途Retrofit and OkHttp从那时候开始。
查看这个链接 https://inthecheesefactory.com/blog/retrofit-2.0/en有关 Retrofit v2 的更多信息和this one https://github.com/square/okhttp/wiki/HTTPS#customizing-trusted-certificates对于当前的 OkHttp 方法。
好的,我用它来工作Android 开发者指南 https://developer.android.com/training/articles/security-ssl.html#UnknownCa.
就像OP一样,我正在尝试使用Retrofit and OkHttp连接到启用 SSL 的自签名服务器。
这是使事情正常工作的代码(我已经删除了 try/catch 块):
public static RestAdapter createAdapter(Context context) {
// loading CAs from an InputStream
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream cert = context.getResources().openRawResource(R.raw.my_cert);
Certificate ca;
try {
ca = cf.generateCertificate(cert);
} finally { cert.close(); }
// creating a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
// creating a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
// creating an SSLSocketFactory that uses our TrustManager
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
// creating an OkHttpClient that uses our SSLSocketFactory
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setSslSocketFactory(sslContext.getSocketFactory());
// creating a RestAdapter that uses this custom client
return new RestAdapter.Builder()
.setEndpoint(UrlRepository.API_BASE)
.setClient(new OkClient(okHttpClient))
.build();
}
为了帮助调试,我还添加了.setLogLevel(RestAdapter.LogLevel.FULL)
到我的 RestAdapter 创建命令,我可以看到它连接并从服务器获取响应。
所需要的只是我的原创.crt文件保存在main/res/raw
.
The .crt文件(也称为证书)是使用以下命令创建证书时创建的两个文件之一openssl
。一般是.crt或.cert文件,另一种是.key文件。
Afaik,.crt 文件是你的公钥.key 文件是您的私钥。
正如我所看到的,你已经有了一个.cert文件,这是相同的,所以尝试使用它。
PS:对于那些将来读到它并且只有一个.pem文件,根据这个答案 https://stackoverflow.com/a/14484363/4261176,您只需要将一个转换为另一个:
openssl x509 -outform der -in your-cert.pem -out your-cert.crt
PS²:对于那些根本没有任何文件的人,您可以使用以下命令(bash)从任何服务器提取公钥(也称为证书):
echo -n | openssl s_client -connect your.server.com:443 | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/my_cert.crt
只需更换your.server.com
和端口(如果不是标准 HTTPS)并选择要创建的输出文件的有效路径。