使用okHttp固定证书



这个问题可能与"如何使用Square OKHTTP固定证书"重复?但既然还不清楚,我就再问一次。我必须将SSL证书附加到我的http客户端。我使用的是改装版2.2.0和okHttp版3.6.0

我有.crt格式的证书。目前我正在做证书固定,如图所示。但我不知道它是否合适。以下是我的代码

static void pinCertificate(Context context, OkHttpClient.Builder builder) {
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream cert = context.getResources().openRawResource(R.raw.certificate);
Certificate ca;
ca = cf.generateCertificate(cert);
// creating a KeyStore containing our trusted CAs
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);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
builder.sslSocketFactory(sslContext.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
}
}

这是用okHttp固定.crt证书的正确方法吗?我们如何测试它是否正确地进行了握手?如果是错误的,有人能出示一个样本代码来正确地固定证书吗?我看到了一些样本和像这样的文档学家https://medium.com/@develodroid/android-ssl-pnning-ung-http-ca1239065616

但它与我所实现的完全不同。他们在任何地方都没有使用crt文件。

如果有人能分享一个关于证书固定的更好的解释,以及如何在okHttp中完成它,那将是非常有帮助的。提前感谢!!

请参阅此处的示例https://square.github.io/okhttp/https/#certificate-固定kt java

private val client = OkHttpClient.Builder()
.certificatePinner(
CertificatePinner.Builder()
.add("publicobject.com", "sha256/afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=")
.build())
.build()

提醒:未经服务器TLS管理员许可,请勿使用证书固定!

这是证书固定。这是正确的方式。您可以使用fiddlercharles测试它,方法是在手机中安装https证书。若请求不成功,则固定工作正常。通过禁用ssl钉扎来测试它。在这种情况下,请求将成功,您将能够在fiddler或charles 中看到请求+数据

你也可以使用公钥钉扎,这将钉扎证书内的公钥的sha

我已经实现了以下方式

InputStream cert = context.getResources().openRawResource(R.raw.certificate);            
CertificateFactory cf=CertificateFactory.getInstance("X.509", "BC");
InputStream caInput = new BufferedInputStream(cert);
X509Certificate ca = (X509Certificate) cf.generateCertificate(caInput);
caInput.close();
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
keyStore.setCertificateEntry(ca.getSubjectX500Principal().getName(), ca);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(keyStore, null);
KeyManager[] keyManagers = kmf.getKeyManagers();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext context1 = SSLContext.getInstance("TLS");
context1.init(keyManagers, tmf.getTrustManagers(), null);
builder.sslSocketFactory(context1.getSocketFactory());

你的做法是正确的。我也以与您相同的方式执行了此操作。这是很好的去它。快乐编码:)

最新更新