SSH连接期间的CRL检查

时间:2018-01-12 10:37:04

标签: java android ssl tls1.2 certificate-revocation

我有一个Android应用程序,我使用HttpURLConnection与我的服务器进行SSL连接。服务器证书包含具有有效URI的CRL分发点。此证书已被撤销,并且URI的CRL包含此信息。但是我在握手期间没有收到任何异常,我可以从服务器接收任何信息。我使用Android 6和7。

我发现一些帖子,开发人员写道默认情况下Android会禁用吊销检查。另外,我看到一些例子,将PREFER_CRLS选项设置为PKIXRevocationChecker并将其设置为TrustManagerFactory,但似乎它仅适用于Java SE,当我在我的应用程序中尝试此代码时,我收到异常初始化TrustManagerFactory:

java.security.InvalidAlgorithmParameterException: Unsupported spec: javax.net.ssl.CertPathTrustManagerParameters@dccac9. Only android.security.net.config.RootTrustManagerFactorySpi$ApplicationConfigParameters supported
    at android.security.net.config.RootTrustManagerFactorySpi.engineInit(RootTrustManagerFactorySpi.java:44)

network_security_config.xml文件正确无误:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
     <base-config>
         <trust-anchors>
             <certificates src="@raw/ca_test"/>
         </trust-anchors>
     </base-config>
</network-security-config>

这是我的代码:

CertificateFactory cf = CertificateFactory.getInstance("X.509");
AssetManager am = getResources().getAssets();
Certificate ca;
try (InputStream caInput = am.open("ca_test.pem")) {
    ca = cf.generateCertificate(caInput);
    Log.d(LOG_TAG, "ca = " + ((X509Certificate) ca).getSubjectDN());
}

// Create a KeyStore containing our trusted CAs
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);

KeyManagerFactory kmf =  
KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");
PKIXRevocationChecker rc =(PKIXRevocationChecker)cpb.getRevocationChecker();
rc.setOptions(EnumSet.of(
    PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP
    PKIXRevocationChecker.Option.SOFT_FAIL)); // handshake should not fail when CRL is not available
PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(keyStore, new X509CertSelector());
pkixParams.addCertPathChecker(rc);
// Create a TrustManager that trusts the CAs in our KeyStore
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(new CertPathTrustManagerParameters(pkixParams));
kmf.init(keyStore, null);

所以我试着了解如何为我的应用启用CRL检查。 可以通过shell为root设备完成吗? 有没有办法覆盖您自己的密钥库的参数?或者有任何方法可以为系统android密钥库启用它?

另外,我在这里发现了这个错误:https://issuetracker.google.com/issues/36993981 但是我没有看到这个问题的任何更新。 有人知道Android应用开发者的任何解决方案吗?

0 个答案:

没有答案