次のコードを使用して、Googleのサービスに接続しています。このコードは私のローカルマシン上でうまく働いた:Java SSLException:証明書のホスト名が一致しません
HttpClient client=new DefaultHttpClient();
HttpPost post = new HttpPost("https://www.google.com/accounts/ClientLogin");
post.setEntity(new UrlEncodedFormEntity(myData));
HttpResponse response = client.execute(post);
私はGoogle.comをブロックしていた本番環境でこのコードを置きます。リクエストに応じて、GoogleのIPの1つであるIP:74.125.236.52にアクセスできるようにして、Googleサーバーとの通信を許可しました。私はホストファイルを編集してこのエントリも追加しました。
まだ私はURLにアクセスできませんでした。なぜそれが不思議ですか?だから、私は上記のコードを置き換える:
javax.net.ssl.SSLException:
HttpPost post = new HttpPost("https://74.125.236.52/accounts/ClientLogin");
は今、私はこのようなエラーが出る証明書内のホスト名が一致しませんでした: <74.125.236.52>!= <www.google.com>
私は、Googleが複数のIPアドレスを持っているので、これがあると思います。ネットワーク管理者にこれらすべてのIPへのアクセスを許可することはできません。このリスト全体を取得することさえできないかもしれません。
どうすればいいですか? Javaレベルで回避策がありますか?それとも、それはネットワークの人の手に完全に入っていますか?
SSL証明書は通常、名前がそれを適用する* *特定のドメインが付属しており、その名前が一致しない場合名前を要求すると、クライアントは接続が正しく認証されていないことを警告します。クライアントが接続に対して明示的な証明書の上書きを指定できるかどうかを確認できます。 –
URLのホスト名は、証明書のホスト名と一致する必要があります。 hostsファイルを使って動作させてください。そうでない場合は、74.125.236.52のgoogle.comも受け入れるように証明書検証ルーチンを変更することができます(寛大すぎないようにしてください)。 – Thilo
@Thilo:検証ルーチンをオーバーライドする方法は? – WinOrWin