web-dev-qa-db-ja.com

--ignore-certificate-errorsにもかかわらずChromeDriver ERR_SSL_PROTOCOL_ERROR

ChromeDriverでSeleniumを使用して、ローカルホスト(HTTPSなし)で統合テストを実行しようとしています。

Chromeにはhttps証明書が必要ですが、 this の質問から、arg --ignore-certificate-errorsを使用してこれを回避できることを理解しています

これは適切な一連のアクションのように思えるので、自分の機能acceptInsecureCertsにも追加しました( docs

Chromedriverからの応答はまだ私が期待していたものではありません:

このサイトは、無効な応答を送信した安全な接続アプリを提供できません。 ERR_SSL_PROTOCOL_ERROR

私のコードは以下です:

from Selenium import webdriver
from Selenium.webdriver.chrome.options import Options

# make options (principally to ignore certificate)
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')

# add acceptInsecureCerts
capabilities = options.to_capabilities()
capabilities['acceptInsecureCerts'] = True

print(capabilities) # see below

driver = webdriver.Remote(
    command_executor=Selenium_HUB,
    desired_capabilities=capabilities
)
print(driver.__dict__) # see further below

app_login_url = 'http://app:8000/accounts/login/'

driver.get(app_login_url)

私の能力:

{'acceptInsecureCerts': True,
'browserName': 'chrome',
'goog:chromeOptions': {'args': ['--ignore-certificate-errors'],
                        'extensions': []},
'platform': 'ANY',
'version': ''}

これが私のドライバー情報です、acceptInsecureCerts引数のみが考慮されているようです:

{'_file_detector': <Selenium.webdriver.remote.file_detector.LocalFileDetector object at 0x7fb42bde10f0>,
'_is_remote': True,
'_mobile': <Selenium.webdriver.remote.mobile.Mobile object at 0x7fb42bb5e400>,
'_switch_to': <Selenium.webdriver.remote.switch_to.SwitchTo object at 0x7fb42bdd4898>,
'capabilities': {'acceptInsecureCerts': True,
                'acceptSslCerts': True,
                'applicationCacheEnabled': False,
                'browserConnectionEnabled': False,
                'browserName': 'chrome',
                'chrome': {'chromedriverVersion': '74.0.3729.6 '
                                                    '(255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29})',
                            'userDataDir': '/tmp/.com.google.Chrome.vc1ZvB'},
                'cssSelectorsEnabled': True,
                'databaseEnabled': False,
                'goog:chromeOptions': {'debuggerAddress': 'localhost:40815'},
                'handlesAlerts': True,
                'hasTouchScreen': False,
                'javascriptEnabled': True,
                'locationContextEnabled': True,
                'mobileEmulationEnabled': False,
                'nativeEvents': True,
                'networkConnectionEnabled': False,
                'pageLoadStrategy': 'normal',
                'platform': 'Linux',
                'proxy': {},
                'rotatable': False,
                'setWindowRect': True,
                'strictFileInteractability': False,
                'takesHeapSnapshot': True,
                'takesScreenshot': True,
                'timeouts': {'implicit': 0,
                            'pageLoad': 300000,
                            'script': 30000},
                'unexpectedAlertBehaviour': 'ignore',
                'version': '74.0.3729.169',
                'webStorageEnabled': True,
                'webdriver.remote.sessionid': '1cf77f237e966bac6ca15d4d9c107423'},
'command_executor': <Selenium.webdriver.remote.remote_connection.RemoteConnection object at 0x7fb42be0cf98>,
'error_handler': <Selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x7fb427d08a20>,
'session_id': '1cf77f237e966bac6ca15d4d9c107423',
'w3c': False}

なぜERR_SSL_PROTOCOL_ERRORがまだ表示されるのですか?

9
User632716

このエラーメッセージ...

This site can’t provide a secure connection app sent an invalid response. ERR_SSL_PROTOCOL_ERROR

...これは、ChromeDriverが新しいWebBrowserつまりChrome Browserローカルホストでのセッションを開始した.

ローカルホスト(HTTPSなし)でこの問題が発生しているため、this comment のようにargument--allow-insecure-localhostからchromeOptions()まで:

'goog:chromeOptions': {'args': ['--allow-insecure-localhost'],
            'extensions': []}

ただし、主な問題は機能にあるようです。ここでplatformを設定すると、次のようにs ANYが設定されます。

{'acceptInsecureCerts': True,
'browserName': 'chrome',
'goog:chromeOptions': {'args': ['--ignore-certificate-errors'],
            'extensions': []},
'platform': 'ANY',
'version': ''}

WebDriver-W3C Living DocumentplatformNameセクションで言及されているように、次のプラットフォーム名はよく理解されているセマンティクスで一般的に使用されており、機能を一致させると、それらを尊重することで最大の相互運用性を実現できます。よく知られたオペレーティングシステムの有効な同義語として:

Key         System
---         ------
"linux"     Any server or desktop system based upon the Linux kernel.
"mac"       Any version of Apple’s macOS.
"windows"   Any version of Microsoft Windows, including desktop and mobile versions.

Note:このリストは完全なものではありません。

新しいセッションから機能を返す場合、より具体的なplatformNameを返すことは有効であり、ユーザーはWebDriver実装が実行されているオペレーティングシステムを正しく識別できます。

したがって、desiredCapabilitiesオブジェクト内で"platform":"ANY"を渡す代わりに、より具体的な"platform":"linux"がより望ましいアプローチになります。

関連および関連するディスカッションは、 Curl error thrown for http POST to/session with params:{“ desiredCapabilities”:{“ browserName”:“ chrome”、“ platform”:“ ANY” with Selenium and PHPUnit


ChromeDriverChromeおよびSelenium Clientvrsionに関するいくつかの詳細情報は、問題をより適切に分析するのに役立ちました。ただし、ChromeDriverの履歴に従い、-証明書エラーの処理に関連する次の問題は、ChromeDriverの最後のいくつかのリリースで対処されました。

  • DevToolsによる証明書エラーの処理を許可する :ヘッドレスchromeはSSL証明書エラーのUI警告を表示できないため、エラーをDevToolsとして公開するために fix がリリースされましたイベントおよびDevToolsコマンドを介して実行するアクションを制御します。
  • ヘッドレスのChromedriver/Seleniumで証明書エラーを処理する機能を提供する :以前の特定の セキュリティ関連オプション ChromiumのUIバージョン(--ignore-certificate-errorsなど)のCLIスイッチを介して制御されていたが、黙って行われた無視され、devtoolsを介してのみ設定できます。そのため、ブラウザターゲットのDevToolsクライアントでcertificateErrorイベントをオーバーライドして処理する必要がありました。 fix がリリースされました。新しいDevToolsメソッドを使用して、ブラウザー全体で証明書エラー処理をオーバーライドし、ヘッドレスモードでも証明書エラーを無視できるようになりました。
  • DevToolsを介したグローバル証明書エラー処理 :以前のDevToolsでは、個々のターゲット/ WebContentsの証明書エラーの処理が許可されていましたが、新しいターゲットが作成されると(target = _blankリンクをクリックするなど)、多くの場合不可能でしたナビゲーションが試行される前に、Security.enable/Security.setOverrideCertificateErrorsコマンドを十分迅速に送信する。 fix は、より単純な「すべての証明書エラーを無視する」モードで公開されましたが、代わりに古いオーバーライドコマンドが廃止され、新しいsetIgnoreCertificateErrorsコマンドが優先され、ブラウザターゲットのセキュリティドメインも公開されます。このオーバーライドをブラウザー全体にグローバルに適用することを容易にします。

結論

  • 次の引数/機能が追加されていることを確認してください:
    • --allow-insecure-localhost
    • acceptInsecureCerts
    • --ignore-certificate-errors
  • 'chromedriverVersion': '74.0.3729.6'を使用しているときは、'chrome': '74.0'も使用していることを確認してください( ChromeDriver v74.0.3729.6 リリースノートに従って)
  • 最新リリースのSelenium v​​3.141.59クライアントを使用していることを確認してください。
7
DebanjanB

Fix "Aw、Snap!" page crashes and other page loading errors-Computer-Google Chrome Help (「ページの読み込みエラーコードと問題」セクションを展開してください) )、ChromeはERR_SSL_PROTOCOL_ERRORすべてのSSL関連エラー。これには以下が含まれます。

  • 証明書エラー
  • 接続パラメータのネゴシエーションの失敗(使用するTLSバージョンとストリーム暗号化など)
  • ピアによるプロトコル違反

Chromeからこれ以上詳細を取得できないため、別のアプリ(Firefoxなど、または openssl s_client )は、何が起こっているかについての詳細を示すことができます。

パケットをスニッフィングします。 Wireshark は、ネゴシエーションステージを含む接続の初期ステージを表示できます。サーバーが自分のものである(つまり、秘密鍵を持っている)場合は、 暗号化された部分を復号化する -で全体像を知ることもできます。

4
ivan_pozdeev

HTTPではなくHTTPSを介してページをリクエストしています。 Chromeは安全でないHTTPサーバーに接続しません。

これにより、TLS/SSLネゴシエーションが失敗します。

TCPポート8000​​でサーバーがHTTPSを実行していることを確認する必要があります。

とともに --ignore-certificate-errorsオプションでは、自己署名証明書を生成し、それをWebサーバーに適用できます。

次に、HTTPSを使用するようにURL行を変更します。

app_login_url = 'https://app:8000/accounts/login/'
0
Strom