私のアプリでは、異なる HTTPS サーバーに接続する必要があり、サーバーごとに異なる検証者 (組織、CN を確認します) が必要です。
私のSSLベリファイアは次のようになります。
public class SSLVerifier implements X509HostnameVerifier {
public SSLVerifier(String pCN, String pO) {
mCN = pCN;
mO = pO;
}
// here I override various verify() methods and check certificate values
// agains values I set in constructor
}
アプリケーションのさまざまな部分に HTTP クライアントの 2 つのインスタンスがあり、両方の部分でベリファイアをインスタンス化し、次の方法でアタッチします。
mHttpClient = new DefaultHttpClient();
final SSLVerifier verifier = new SSLVerifier(SOME_CN, SOME_ORG);
ClientConnectionManagerFactory factory = new ClientConnectionManagerFactory() {
@Override
public ClientConnectionManager newInstance(HttpParams pParams, SchemeRegistry pScheme) {
if (verifier != null) {
SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
socketFactory.setHostnameVerifier(verifier);
pScheme.register(new Scheme("https", socketFactory, 443));
}
return new ThreadSafeClientConnManager(pParams, pScheme);
}
};
mHttpClient.getParams().setParameter(ClientPNames.CONNECTION_MANAGER_FACTORY, factory);
このコードを 2 つの場所で呼び出し、SOME_CN と SOME_ORG は場所ごとに異なる値を持ちます。
HttpClient の2 番目のインスタンスを作成し、そのインスタンスに対応するベリファイアを設定した後、HttpClient の最初のインスタンスが2 番目のインスタンスからベリファイアを使用し始めたことに気付きました。検証者はある種のグローバルのようです。
異なる HttpClient インスタンスごとに異なるベリファイアを使用することは何とか可能ですか?