問題タブ [httpsurlconnection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android HttpsUrlConnection javax.net.ssl.SSLException 接続がピア ハンドシェイク エラーによって閉じられました (ローカルのトラストストアを使用している場合)
オブジェクトを使用してAndroidを単純なOpenSSL
サーバーに接続するのに問題がありHttpsUrlConnection
ます(StackOverflowと一連のオンラインチュートリアルをくまなく調べ、例をほぼ1行ずつたどりましたが、なぜ私のものなのかまだわかりませんローカルのトラストストアを使用すると壊れます)。
現在、単純なサーバーに接続しようとする Android アクティビティがありますOpenSSL server
(OpenSSL クライアントを使用してサーバーに接続できます) 。 HttpsUrlConnection.connect()
javax.net.ssl.SSLException: Connection closed by peer" error during the SSL handshake.
注意事項:
- 現在、クライアントの承認はありません
- デフォルトの信頼ストアをロードするときにhttps://www.google.comに接続できます
- 自己署名証明書を使用してローカルホスト上のサーバーに接続できません
- すべての証明書を信頼したくない
- Apache HttpClient を使用したくない
- ローカルのトラストストアのみを使用したい
- バウンシーキャッスルを備えたローカルトラストストアを作成しました
- トラストストアを正しくロードできます
- プロキシ ファイアウォールの背後で、Android 仮想デバイスにプロキシが設定されています
- AVD を に設定
Android 4.1 API 16
。
私がすでに試したこと:
- 両方に接続
127.0.0.1 and 10.0.2.2
- 新しいものを使用して
SecureRandom() with the SSLContext.init()
- でURLを作成する
'URL u = new URL("https", "10.0.2.2", 443, "/");'
TrustManagerFactory.getDefaultAlgorithms()
「X509」の代わりに 使用"Unexpected response code error 503"
「ピアによって閉じられた接続」の代わりに与える
私の質問を確認するために時間を割いていただきありがとうございます!
次のコマンドで起動したシンプルなサーバー:
コマンドでテストされたクライアント接続:
Android アクティビティ コード (簡略化のために実行中のコードを完全に削除するように編集されています。さらにコードが必要な場合はお知らせください) - エラー出力はコードの下にあります。
https://www.google.comに正しく接続した場合の出力:
自己署名証明書を使用してサーバーに接続しようとしたときの出力:
再度、感謝します!!
java - HttpsURLConnection.getInputStream()は自動再試行を行いますか?
以下のコードのように、HttpsURLConnectionを使用してサーバーにサービスリクエストを行っています。
サービスに時間がかかる場合があるため、理想的にはタイムアウト例外を予期する必要がありますが、代わりにクライアントが再試行して同じ要求を再送信しています。あらゆる種類の再試行を明示的に無効にする方法はありますか?そして、設定されたタイムアウト方法が何か違いを生んでいるかどうかさえわかりません。
Java1.6を使用しています
更新
getInputStream()の代わりにconnect()とgetResponseCode()を試しましたが、動作は同じです。
これでも2つのリクエストを行っています。
UPDATEHttpClientは
問題を修正しました。HttpClientでは、再試行を明示的にfalseに設定できます
android - クッキーを共有設定に保存する
私はこれを理解しようとして髪を引っ張ってきました:私はHttpsURLConnectionを作成し、java.net.cookiemanagerを使用してCookieを管理しています(私が理解しているように、android.webkit.cookiemanagerをHttpUrlConnection/HttpsUrlConnectionに使用する方法はありませんか? )。長年の Cookie を後の接続に保存する必要があります。
悲しいことに、私はhttp://loopj.com/android-async-http/を使用できません。信頼できない証明書を許可する必要があるため、PersistentCookieStore です ( http://abhinavasblog.blogspot.se/2011/07/allow-untrustedを使用) -certificate-for-https.html )。PersistentCookieStore を単独で使用してみましたが、Apache Cookie を使用しており、Java.net Cookie を使用しています...
これは私が試したことです:
そして、次のアプリの起動時に Cookie を取得しているとき:
Cookie は cManager に追加されますが、サーバーによって認識されません。何らかの解析上の問題があると思います。誰かが解決策を得ましたか?
ssl - 別のjarのリソースを使用してキーストアをロードするにはどうすればよいですか?
私の問題は次のとおりです。mavenによってビルドされた2つのjarファイルがあります。1 つの jar には、URL のスキームが https の場合に、jave.net.ssl からいくつかのクラスをラップして https 要求を行うロジックが含まれています。 HttpsUrlConnection を取得した後、次のように SSLSocketFactory を取得しています。
上記のコードを含むものの親である jar からクラスで取得した後、このメソッドに渡された InputStream が含まれているため、部分 secConfig.getSslTrustStore() に注意してください。InputStream の取得は次のとおりです。
リソースが正常に配置され、InputStream が取得されます。しかし、最初のスニペットで trustStore.load() を実行すると、KeyStoreFormat が無効であるという奇妙な例外が発生します。KeyStoreFormat は有効です - これは確かです - この prepareSSLSocketFactory を含む jar からテスト メソッドを実行し、現在の jar のリソースにある同じキーストア ファイルをロードすると、例外はまったくなく、クライアントは SSL 経由で正常に通信します。
したがって、私の観察は次のとおりです。メソッドprepareSSLSocketFactoryを実行したjarにあるキーストアリソースからInputStreamを提供するトラストアをロードすると機能しますが、別のjarがprepareSSLSocketFactory()を含む依存jarにInputStream(キーストア付き)を提供する責任がある場合-それ例外をスローします。それに対処する方法がわからない。
リソースを提供するクラスと prepareSSLSocketFacory を含むクラスが、次の呼び出しによって同じ ClassLoader によってロードされているかどうかを確認したことに注意してください。
this.getClass().getClassLoader().equals(HttpConnector.class.getClassLoader()) - 大丈夫です。
キーストア InputStream を提供するクラスから、基になる https リクエスト作成クラスに。
ただし、HttpConnector.class.getClassLoader() によって返される ClassLoader が、実行時に最後に使用される HttpConnector をロードするものではない可能性があるかどうかはわかりません。
java - HttpsURLConnection.getServerCertificates() が Java6 と Java7 で異なる結果を返すのはなぜですか?
次のようなコードがあります。
Java 6 で特定の Web サイトに対してこのコードを実行すると、Java 7 で取得した証明書とは異なる証明書が取得されます。ホスト名が abc.myhost.com であるとします。
Java6で私は得る:
Java7 では次のようになります。
有効な日付を出力すると、それらも異なります。シリアルナンバーもそのまま。これらは異なる証明書です。
Java 7 では正しく見えます。Java 6 では、ホスト名と CN の間に不一致があります。証明書が間違っているようです。
このサーバーがプロキシの背後にある可能性は十分にあります。そのサーバーの所有者 (私が取り組んでいるプロジェクトのパートナー) が最近証明書を変更した可能性もあります。2 つの証明書が存在する可能性があります。1 つはプロキシ サーバー上にあり、もう 1 つはプロキシ サーバーの背後にあるサーバーにあります。私は彼らにこれを調べてもらいました。
私が持っている質問は、Java7 で Java6 と同じ結果が得られないのはなぜですか? Java は で何かを変更しましたHttpsURLConnection.getServerCertificates()
か?
好奇心旺盛な人にとっては、これは単なる診断作業です。実際のエラーは次のとおりです。
この場合の問題は通常、証明書のホスト名と CN の間の不一致です。私は意見の不一致を確認しましたが、Java 6 でのみです。Java6 と Java7 が異なる理由を理解したいと思います。
EDIT : Python 2.7.1 スクリプトは、Java6 と同じ証明書を返します。
SSLConnection.get_peer_cert()
CN が一致しない証明書を表示します。
android - Android 4.x での SSL クライアント認証
サーバーに接続するアプリを作成したいと思います。このサーバーは SSL クライアント認証を使用します。アプリのユーザーは、ブラウザー アプリに実装されているように、証明書を選択して使用できるようにする必要があります。
ブラウザ アプリでは認証が期待どおりに機能しているため、使用する証明書は有効です。
アプリで接続しようとすると、次のエラーが発生します。
私は自分の実装のためにAndroidのドキュメントに従おうとしました。
サンプルアクティビティのコードは次のとおりです。
例外がスローされますurlConnection.getInputStream();
これは、サーバーとクライアント間のハンドシェイクのキャプチャです。
提案やヒントをありがとう。
android - HttpsUrlConnection を介して投稿を送信しようとすると、予期しない IOException が発生する
私の Android コードは常にデータを送信し、まったく予期しない IOException がスローされてすべてがフリーズするまで機能しているようです。例外がほぼランダムに表示されるまで、問題なく複数の投稿リクエストを送信できる理由がわかりません。これが私のコードです:
繰り返しますが、コードは多くのポスト送信の後まで機能し、IO 例外が原因でクラッシュします。さらに、サーバーは問題ありません。コードに問題があります。
エラー スタック トレース全体を次に示します。
android - カスタム証明書を使用した Android https 接続
p12 パックにあるカスタム証明書を使用して https 接続を確立したいと考えています。私はすでにiPhoneでそれを行っています(したがって、証明書、サーバーなどですべてが正常であることを確認できます)が、Androidにはいくつかの問題があります.
認証にクライアント証明書が必要な URL を要求する方法に従って回答しましたが、結果として次の例外が発生します。
12-13 12:32:44.545: W/System.err(4407): javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。12-13 12:32:44.545: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:374) で 12-13 12:32:44.545: W/System.err(4407): libcore.net.http.HttpConnection.setupSecureSocket(HttpConnection.java:209) 12-13 12:32:44.545: W/System.err(4407): libcore.net.http で.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) 12-13 12:32:44.545: W/System.err(4407): libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:433) で12-13 12:32:44.545: W/System.err(4407): libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java: 856) 12-13 12:32:44.555: W/System.err(4407): 原因: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkTrusted (TrustManagerImpl.java:192) で 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.TrustManagerImpl.checkServerTrusted(TrustManagerImpl.java:163) 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.verifyCertificateChain(OpenSSLSocketImpl.java:573) 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet で。 provider.jsse.NativeCrypto.SSL_do_handshake(ネイティブ メソッド) 12-13 12:32:44.560: W/System.err(4407): org.apache.harmony.xnet で。provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:371) 12-13 12:32:44.560: W/System.err(4407): ... 18 より 12-13 12:32:44.560: W/System. err(4407): 原因: java.security.cert.CertPathValidatorException: 証明書パスのトラスト アンカーが見つかりません。12-13 12:32:44.560: W/System.err(4407): ... 23 詳細
私の接続コードは次のようになります。
乾杯、マルシン
android - 同じミリ秒でAndroid HttpsUrlConnection重複リクエスト
私は問題があります。一度だけ会った。私のコード アルゴリズムは、1 回だけ要求するように設計されています。しかし、リクエストはサーバーによって 2 回受信されました。私は解決策を生み出さなければなりません。この問題はこの URL
が好きだと思いますが、httpurlconnection について何か (バグや質問) を見つけることができませんか?
デバイスの Android バージョンは 4.0.3 で、接続方法は GET です。
java - Java クライアント アプリでの双方向の相互ネゴシエーション
オンライン ショッピング用の Java デスクトップ アプリを作成しようとしています。これまでのところ、ログインして製品を選択し、httpsurlconnect を使用してチェックアウトを選択できます。ただし、チェックアウト サイトが銀行の支払いゲートウェイにリダイレクトされた後。そして、リダイレクト後にリクエストを処理できないという応答が常に返されます。これは、支払いゲートウェイが双方向の相互ネゴシエーションを使用しているためだと思います (よくわかりません)。では、4 番目の要求で双方向の相互ネゴシエーションを作成するにはどうすればよいでしょうか。
インターネットで少し調べてみました。keystore.jks と truststore.jks が必要であることがわかりました。JDKには、サーバー証明書を受け入れることができるCAトラストストアが付属していると思います。クライアントキーと証明書を含む keystore.jks ファイルが必要です。自己署名証明書を作成すると、サーバーはそれを受け入れますか? サーバーユーザーは CA 証明書を検証済みであり、私はサーバーを制御できません。クライアントの keystore.jks を取得して、4 番目のリクエストでハンドシェイクを実装するにはどうすればよいですか。私の実装のサンプルコードを以下に示します。
接続方法: