6

我正在尝试学习如何在 Android 应用程序中进行证书固定。我在这里找到了教程。我想澄清一下我怀疑我是否基于我对这段代码的测试。

我使用的代码如下:

public class CertificatePinning {

  static SSLSocketFactory constructSSLSocketFactory(Context context) {

    SSLSocketFactory sslSocketFactory = null;

    try {
        AssetManager assetManager = context.getAssets();
        InputStream keyStoreInputStream = assetManager.open("myapp.store");
        KeyStore trustStore = KeyStore.getInstance("BKS");

        trustStore.load(keyStoreInputStream, "somepass".toCharArray());

        sslSocketFactory = new SSLSocketFactory(trustStore);
        sslSocketFactory.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
    }
    catch(Exception e){

        Log.d("Exception", e.getLocalizedMessage());
    }

    return sslSocketFactory;
}

public static HttpClient getNewHttpClient(Context context) {

    DefaultHttpClient httpClient = null;

    try {

        SSLSocketFactory sslSocketFactory = constructSSLSocketFactory(context);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sslSocketFactory, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        httpClient = new DefaultHttpClient(ccm, params);

    } catch (Exception e) {

        Log.d("Exception", e.getLocalizedMessage() );

        return null;
    }

    return httpClient;
}

}

引用该教程中的声明:

On the client side, you simply need to distribute the signing certificate 
with your app and validate against it.

在我的 Web 服务器上,我有自己的 CA,它是使用开放 SSL 创建的,用于为与我的应用程序一起使用的不同域名签署证书。

此声明表明本教程适用于我拥有的 CA 证书。我使用 ca.pem(来自我的 CA 的 crt 文件)测试了代码,它工作正常。

但是我也用我用那个 CA 签名的证书测试了相同的代码,例如 server.pem(来自签名的 server.crt),它仍然有效。

我做错了什么,或者这段代码是为了固定:

1) CA 证书(涵盖该 CA 签署的所有证书)或

2) 特定证书(由某些 CA 签名)?

4

0 回答 0