(これはこの質問の続きで、ある問題を解決して別の問題を見つけました)。
WireMock プロキシ経由で wget を使用して HTTPS Web サイトを取得しています。以下は、安全なデモ サイトを指すフェッチ コマンドです。
wget -e use_proxy=yes -e https_proxy=localhost:8100 \
https://www.rottentomatoes.com/
これが私のプロキシ設定です:
java -jar wiremock-standalone-2.5.1.jar \
--port 8081 --https-port 8100 \
--proxy-all https://www.rottentomatoes.com/ \
--record-mappings \
--root-dir ./proxy-cache \
--verbose
WireMock の画面上のログには、次のように記載されています。
2017-03-27 12:08:09.066 Verbose logging enabled
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
2017-03-27 12:08:09.827 Verbose logging enabled
2017-03-27 12:08:09.892 Recording mappings to ./proxy-cache/mappings
/$$ /$$ /$$ /$$ /$$ /$$
| $$ /$ | $$|__/ | $$$ /$$$ | $$
| $$ /$$$| $$ /$$ /$$$$$$ /$$$$$$ | $$$$ /$$$$ /$$$$$$ /$$$$$$$| $$ /$$
| $$/$$ $$ $$| $$ /$$__ $$ /$$__ $$| $$ $$/$$ $$ /$$__ $$ /$$_____/| $$ /$$/
| $$$$_ $$$$| $$| $$ \__/| $$$$$$$$| $$ $$$| $$| $$ \ $$| $$ | $$$$$$/
| $$$/ \ $$$| $$| $$ | $$_____/| $$\ $ | $$| $$ | $$| $$ | $$_ $$
| $$/ \ $$| $$| $$ | $$$$$$$| $$ \/ | $$| $$$$$$/| $$$$$$$| $$ \ $$
|__/ \__/|__/|__/ \_______/|__/ |__/ \______/ \_______/|__/ \__/
port: 8081
https-port: 8100
https-keystore: jar:file:(removed)/wiremock-standalone-2.5.1.jar!/keystore
proxy-all: https://www.rottentomatoes.com/
preserve-host-header: false
enable-browser-proxying: false
record-mappings: true
match-headers: []
no-request-journal: false
verbose: true
結果は次のとおりです。
--2017-03-27 12:08:25-- https://www.rottentomatoes.com/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:8100... connected.
Failed reading proxy response: Success
Retrying.
--2017-03-27 12:08:26-- (try: 2) https://www.rottentomatoes.com/
Connecting to localhost (localhost)|127.0.0.1|:8100... connected.
Failed reading proxy response: Success
Retrying.
^C
ご覧のとおり、フェッチは失敗し、自動的に再試行され、終了するにはキャンセルする必要があります。
--preserve-host-header
WireMock コマンド (スタンドアロン ドキュメントはこちら) で試しましたが、結果は同じです。
有効な HTTPS 証明書ストアを指す必要があるため、プロキシが内部的に失敗しているのだろうか? そうは言っても、実行中のプロキシが何か (エラーも含む) を出力していると思いますが、呼び出しをまったく処理していないようです。同等の HTTP 呼び出しは正常に機能します。
Wget が失敗する理由を確認するためにできることはありますか? エラー メッセージはあまり役に立ちません。私の知る限り、これ以上詳細にすることはできません (詳細設定は wget でデフォルトでオンになっています)。
この動作は、Alpine 3.4 (Docker コンテナー内) と Ubuntu 14.04 VM で実行されている間で同じです。また、WireMock 2.4.1、2.5.0、および 2.5.1 でも同じです。
証明書を試す
ブラウザ (Firefox) の HTTPS プロキシ設定を WireMock を指すように切り替えようとしましたが、取得しようとしている Web サイトで証明書が正しくないために失敗します。興味深いことに、Firefox がリモート サーバーに接続しているように見えても、WireMock は stdout に何も出力しません。
Wiremock の組み込みのキーストアが古くなっているのか、それとも空なのか疑問に思っていたので、「実際の」証明書ストアを指定する方法を学ぶことが、おそらく次に試す価値のあることでした。これらの手順を使用してブラウザの証明書ファイルを JKS 形式に変換しましたが、これは Wget でも Firefox でも違いはありませんでした。
新しく作成したキーストアは 955 バイトですが、元の PEM 証明書ファイルは ~260K であるため、すべての証明書が追加されたわけではないことは明らかです (最初の証明書が追加されただけなのでしょうか?)。FWIW私はこのコマンドを使用しました:
keytool -import -v -trustcacerts -alias endeca-ca \
-file cacert.pem -keystore truststore.ks
プロキシに到達していることを確認しています
HTTPS プロキシが必要なときに何かが発生していることを証明するために、呼び出しに-verbose
and-verbose:jni
スイッチを追加しました。java
Wget コマンドを実行すると、実際のエッセイが出力されるので、HTTPS プロキシがヒットしていると確信しています。Wget は、HTTP モードでも正常にフェッチされます。
スタンドアロンの Jar ファイルで何が起こっているかをログに記録する方法は?
私はあらゆる種類のことをやみくもに試すことができる段階にあり、Java システムが失敗する理由を最初に確認するために、Java システムからある程度の情報を取得する必要があると思います。私の推測では、Wget ではなく Wiremock が問題であると思われます。
文書化されていない Wiremock の機能を見つけました。これは次の機能--print-all-network-traffic
を提供します。
2017-03-27 17:36:51.287 Opened Socket[addr=/127.0.0.1,port=54140,localport=8100]
2017-03-27 17:36:51.397 Incoming bytes: CONNECT www.rottentomatoes.com:443 HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Host: www.rottentomatoes.com:443
2017-03-27 17:36:51.398 Closed Socket[addr=/127.0.0.1,port=54140,localport=8100]
2017-03-27 17:36:51.399 Closed Socket[addr=/127.0.0.1,port=54140,localport=8100]
2017-03-27 17:36:52.400 Opened Socket[addr=/127.0.0.1,port=54142,localport=8100]
2017-03-27 17:36:52.483 Incoming bytes: CONNECT www.rottentomatoes.com:443 HTTP/1.1
User-Agent: Wget/1.15 (linux-gnu)
Host: www.rottentomatoes.com:443
2 番目のセクションは、wget が再試行する回数だけ繰り返されますが、ここでも有用なものは何もありません。なぜ失敗するのか知りたいです。
に追加できるログ パラメータjava -jar
はありますか? または、参照できる Java のシステム全体のエラー ログはありますか? VisualVM をインストールしましたが、さまざまな出力があまり関連していないようです。私は例外に最も興味があると思いますか?