私たちがホストしているSSL Webサービスに接続しているAndroidアプリケーションがあります。 WebサーバーはApacheであり、作成した独自のCAと自己署名入りのSSL証明書を持っています。自己署名証明書とCAを使用したAndroid SSL HTTPリクエスト
セキュリティの[ユーザー信頼証明書]セクションでAndroidタブレットにCA証明書をインポートしました。ここで私は、Webサーバーへのアクセスをテストしているし、有効なものとして、Webサービスの証明書を示していることを確認することができ
(下のスクリーンショット)
は、セキュリティ設定の証明書です:
私のアプリケーションでWebサービスにアクセスしようとすると、「ピア証明書がない」例外が発生します。
これは簡略化されたSSLの実装です:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// allows network on main thread (temp hack)
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
SchemeRegistry schemeRegistry = new SchemeRegistry();
//schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
schemeRegistry.register(new Scheme("https", newSSLSocketFactory(), 443));
HttpParams params = new BasicHttpParams();
SingleClientConnManager mgr = new SingleClientConnManager(params, schemeRegistry);
HttpClient client = new DefaultHttpClient(mgr, params);
HttpPost httpRequest = new HttpPost("https://our-web-service.com");
try {
client.execute(httpRequest);
} catch (Exception e) {
e.printStackTrace(); //
}
}
/*
* Standard SSL CA Store Setup //
*/
private SSLSocketFactory newSSLSocketFactory() {
KeyStore trusted;
try {
trusted = KeyStore.getInstance("AndroidCAStore");
trusted.load(null, null);
Enumeration<String> aliases = trusted.aliases();
while (aliases.hasMoreElements()) {
String alias = aliases.nextElement();
X509Certificate cert = (X509Certificate) trusted.getCertificate(alias);
Log.d("", "Alias="+alias);
Log.d("", "Subject DN: " + cert.getSubjectDN().getName());
Log.d("", "Issuer DN: " + cert.getIssuerDN().getName());
}
SSLSocketFactory sf = new SSLSocketFactory(trusted);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
return sf;
} catch (Exception e) {
// TODO Auto-generated catch block
throw new AssertionError(e);
}
}
}
whileループだけで、証明書を出してくれると私はログに自分のCAを見ることができます。しかし、私はまだ "ピア証明書なし"の例外を取得します。
10-17 18:29:01.234:I /をSystem.out(4006):いいえピア証明書
私は手動でこの実装で何とか自分のCA証明書をロードする必要がありますか?
使用することによって解決
を、あなたは、この実装では、あなたのCA証明書をロードし、手動で試したことがありますか? – BON
http://www.startssl.com/からドメインの無料の&信頼できるSSL証明書を取得できます(一部のアプリで使用しています)。すべての端末でCAを追加する必要はありませんあなたのアプリを使いたい –