在SO上询问一个SSL固定问题似乎是在呼喊空洞,但这里有......
我需要在Android上实施SSL固定,并且我正在使用一些要求/约束:
根据Google的教程,我提出了以下用于创建SSLSocketFactory的实现:
CertificateFactory factory = CertificateFactory.getInstance("X.509");
final KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("leaf_cert", getCertificate(factory, R.raw.leaf_cert));
keyStore.setCertificateEntry("interm_cert1", getCertificate(factory, R.raw.interm_cert1));
keyStore.setCertificateEntry("interm_cert2", getCertificate(factory, R.raw.interm_cert2));
keyStore.setCertificateEntry("root_cert", getCertificate(factory, R.raw.root_cert));
final TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
final SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());
return sslContext.getSocketFactory();
当我创建新的HttpStack
实例时,将使用此SSLSocket工厂。请注意,我按照他们在链上的位置顺序列出了证书。
要验证此代码,我通过修改nogotofail
中的代码来利用Google的NoSslCertificateChainOfTrustCheckTest
Android演示应用。似乎钉扎工作正常,但实际上我只需要在leaf_cert
中加入KeyStore
。使用openssl
,我验证了服务器只发回了叶证书。在这一点上,事情变得非常奇怪:
leaf_cert
或者 iterm_cert1
。总而言之,我需要回答以下问题:
nogotofail
?