2012-08-12 16 views
24

RESTfulサービスのためにsslを有効にしているWebサイトがあります。私たちはRapidSSLに登録し、証明書をインストールして、RapidSSL checkerを渡します。私は問題なしでアンドロイドブラウザ(内蔵、Firefox、オペラなど)、警告なしなど、さまざまなブラウザでサイトにアクセスできます。私は私のAndroidアプリでそれにアクセスしようとしたときAndroid ssl:javax.net.ssl.SSLPeerUnverifiedException:ピア証明書がありません(もう一度)

はしかし、私は次の例外を取得:

08-11 20:04:05.586 363 381 E HttpProvider: Error executing request: No peer certificate 
08-11 20:04:05.586 363 381 E HttpProvider: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:259) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-11 20:04:05.586 363 381 E HttpProvider: at com.xxxxx.netlib.http.HttpProvider.executeRequest(HttpProvider.java:75) 

これはエミュレータ上と3.2タブレットでAndroid 2.3.3で発生します。私はこれについてたくさんのヒットを見てきましたが、私が見つけたものは何も問題を解決するのに役立ちません。

その他のデータ:

$ openssl s_client -CAfile www.xxxxx.com.pem -connect www.xxxxx.com:443 
CONNECTED(00000003) 
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority 
verify return:1 
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
verify return:1 
depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA 
verify return:1 
depth=0 serialNumber = 1-7wArtEjdTwJ94d5iVDooDmmC4mXyVj, OU = GT82425783, OU = See www.rapidssl.com/resources/cps (c)12, OU = Domain Control Validated - RapidSSL(R), CN = www.xxxxx.com 
verify return:1 
--- 
Certificate chain 
0 s:/serialNumber=1-7wArtEjdTwJ94d5iVDooDmmC4mXyVj/OU=GT82425783/OU=See www.rapidssl.com/resources/cps (c)12/OU=Domain Control Validated - RapidSSL(R)/CN=www.xxxxx.com 
    i:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA 
1 s:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA 
    i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
    i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
--- 
[snip] 

私はクライアントを設定するために実行しているコード:

public class HttpProvider implements INetworkProvider { 
    private static final String LOG = "HttpProvider"; 
    protected DefaultHttpClient client; 

    public HttpProvider() { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
    sslSocketFactory.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
    registry.register(new Scheme("https", sslSocketFactory, 443)); 

    client = new DefaultHttpClient(
     new ThreadSafeClientConnManager((new BasicHttpParams()), registry), new BasicHttpParams() 
    ); 
    } 
[snip] 

私もSTRICT_HOSTNAME_VERIFIERで試してもいない喜び。

私が理解したところでは、認定された証明書プロバイダに登録されているので、カスタムトラストストアまたはキーストアを設定する必要はありません。

私はsslで非常に新しく、私は3文字の頭字語の海で泳いでいるのを見つけました。そして、私はここにいる誰かが私に正しい方向に握手を与えることができると思っていました。

+0

システムトラストストアをダンプする方法を理解しましたが、そこにはRapidSSLが表示されません。私は自分のトラストストアを作り、何が起こるかを見ようとします。 – mvsjes2

+0

これを試す:https://stackoverflow.com/a/38598593/2301721(HttpsURLConnectionを使用) – ashishdhiman2007

答えて

18

掘削と実験の積み重ねの後、私は最終的に、私が使用していたURLにデフォルトで443の代わりにハードコードされたポート80があることを認識しました。

この質問の回答Trusting all certificates using HttpClient over HTTPSは、SSLの理解に非常に役立ちました。

関連する問題