Seleniumを使用して証明書を処理する方法は?


86

Seleniumを使用してブラウザを起動しています。ブラウザに証明書を受け入れるかどうかを要求するWebページ(URL)をどのように処理できますか?

Firefoxでは、次のような証明書を受け入れるように求めるWebサイトがある場合があります。

Firefox

Internet Explorerブラウザーでは、次のようなメッセージが表示される場合があります。

ここに画像の説明を入力してください

Google Chromeの場合:

グーグルクローム

質問を繰り返します。Selenium(Pythonプログラミング言語)でブラウザー(Internet Explorer、Firefox、およびGoogle Chrome)を起動したときに、Webサイトの証明書の受け入れを自動化するにはどうすればよいですか?

回答:


143

Firefoxの場合、accept_untrusted_certs FirefoxProfile()オプションをTrue次のように設定する必要があります。

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True

driver = webdriver.Firefox(firefox_profile=profile)
driver.get('https://cacert.org/')

driver.close()

Chromeの場合、引数を追加する必要があります。--ignore-certificate-errors ChromeOptions()

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument('ignore-certificate-errors')

driver = webdriver.Chrome(chrome_options=options)
driver.get('https://cacert.org/')

driver.close()

Internet Explorerの場合、必要acceptSslCertsな機能を設定する必要があります。

from selenium import webdriver

capabilities = webdriver.DesiredCapabilities().INTERNETEXPLORER
capabilities['acceptSslCerts'] = True

driver = webdriver.Ie(capabilities=capabilities)
driver.get('https://cacert.org/')

driver.close()

実際には、によるとDesired Capabilitiesドキュメンテーション、設定acceptSslCertsする機能True、それは一般的な読み取り/書き込み機能であるため、すべてのブラウザで動作するはずですが。

acceptSslCerts

ブール値

セッションがデフォルトですべてのSSL証明書を受け入れる必要があるかどうか。


Firefoxの作業デモ:

>>> from selenium import webdriver

設定acceptSslCertsしますFalse

>>> capabilities = webdriver.DesiredCapabilities().FIREFOX
>>> capabilities['acceptSslCerts'] = False
>>> driver = webdriver.Firefox(capabilities=capabilities)
>>> driver.get('https://cacert.org/')
>>> print(driver.title)
Untrusted Connection
>>> driver.close()

設定acceptSslCertsしますTrue

>>> capabilities = webdriver.DesiredCapabilities().FIREFOX
>>> capabilities['acceptSslCerts'] = True
>>> driver = webdriver.Firefox(capabilities=capabilities)
>>> driver.get('https://cacert.org/')
>>> print(driver.title)
Welcome to CAcert.org
>>> driver.close()

12
IE 11で動作させることができず、証明書エラーページが表示され続けます
estemendoza 2014

geckodriverを使用しているfirefox48 +の場合、まだ問題があります。これはgeckodriverの未解決の問題であり、まだわかりません。バグの問題
Alter Hu

6
この回答は無効になりました。代わりに「acceptInsecureCerts」を使用してください
rtaft 2017年

2
このコメントは非常に遅いかもしれませんが、今質問に到達する人々にとっては役に立ちます。上記のすべてを試しましたが、何も機能しませんでした。:だけでエラーを渡すために管理driver.get("javascript:document.getElementById('overridelink').click()")
ディエゴ・Fメディナ

3
chromedriverのために私はoptions.add_argumentにこれらの4つの文字列のすべてを渡すことになった- >allow-running-insecure-contentignore-certificate-errorsし、allow-insecure-localhostかつunsafely-treat-insecure-origin-as-secure(あなたがすることで、より見つけることを試みること:strings /opt/google/chrome/chrome | grep insecureと同様のgrepを)
pestophagous

8

Firefoxの場合:

ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("default");
myprofile.setAcceptUntrustedCertificates(true);
myprofile.setAssumeUntrustedCertificateIssuer(true);
WebDriver driver = new FirefoxDriver(myprofile);

以下のためにクロム我々は使用することができます。

DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability("chrome.switches", Arrays.asList("--ignore-certificate-errors"));
driver = new ChromeDriver(capabilities);

以下のためにInternet Explorerを我々は使用することができます。

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);      
Webdriver driver = new InternetExplorerDriver(capabilities);

4
質問はPythonについてでした。あなたは少なくともそれが何の言語であるかを書くことができます。
user1 2016

1
注意してください、「ProfilesIni」は非推奨です!
ハッピーバード

JavaバージョンがChromeOptionsoptions = new ChromeOptions();に役立つことを願っています。options .addArguments( "-ignore-ssl-errors = yes"、 "--ignore-certificate-errors"); ChromeDriverドライバー=新しいChromeDriver(オプション);
RobertoPetrilli20年

6

Firefox Pythonの場合:

Firefoxの自己署名証明書のバグが修正されました: マリオネットfirefox webdrive pythonsplinterでssl証明書を受け入れる

「acceptSslCerts」は「acceptInsecureCerts」に置き換える必要があります

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

caps = DesiredCapabilities.FIREFOX.copy()
caps['acceptInsecureCerts'] = True
ff_binary = FirefoxBinary("path to the Nightly binary")

driver = webdriver.Firefox(firefox_binary=ff_binary, capabilities=caps)
driver.get("https://expired.badssl.com")

1
そして今、Firefox52が稼働しています。アップグレードFirefoxのアップグレードセレンV3.3には、ダウンロードgeckodriverをv0.15にし、あなたももうバイナリのパスを必要としません!
レミDebette

4

そして、C#(。net core)ではSelenium.Webdriver、次のSelenium.Chrome.Webdriverように使用します。

ChromeOptions options = new ChromeOptions();
options.AddArgument("--ignore-certificate-errors");
using (var driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),options))
{ 
  ...
}

3

Pythonセレンを介してヘッドレスクロームに関連するこの質問に来る人々にとって、https://bugs.chromium.org/p/chromium/issues/detail?id = 721739#c102が役立つかもしれません。

どちらでもできるようです

chrome_options = Options()
chrome_options.add_argument('--allow-insecure-localhost')

または次のようなもの(Pythonに適応する必要があるかもしれません):

ChromeOptions options = new ChromeOptions()
DesiredCapabilities caps = DesiredCapabilities.chrome()
caps.setCapability(ChromeOptions.CAPABILITY, options)
caps.setCapability("acceptInsecureCerts", true)
WebDriver driver = new ChromeDriver(caps)

3
    ChromeOptions options = new ChromeOptions().addArguments("--proxy-server=http://" + proxy);
    options.setAcceptInsecureCerts(true);

1
このコードスニペットは質問を解決する可能性がありますが、説明を含めると、投稿の品質を向上させるのに役立ちます。あなたは将来読者のために質問に答えていることを忘れないでください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません
Ak 4720年

2

Javascript:

const capabilities = webdriver.Capabilities.phantomjs();
capabilities.set(webdriver.Capability.ACCEPT_SSL_CERTS, true);
capabilities.set(webdriver.Capability.SECURE_SSL, false);
capabilities.set('phantomjs.cli.args', ['--web-security=no', '--ssl-protocol=any', '--ignore-ssl-errors=yes']);
const driver = new webdriver.Builder().withCapabilities(webdriver.Capabilities.chrome(), capabilities).build();

2

私はSeleniumとBehatで同じ問題に遭遇しました。を介してパラメータを渡したい場合behat.ymlは、次のようになります。

default:
    extensions:
        Behat\MinkExtension:
            base_url: https://my-app.com
            default_session: selenium2
            selenium2:
                browser: firefox
                capabilities:
                    extra_capabilities:
                        acceptInsecureCerts: true

1

プロファイルを作成してからドライバーを作成すると、Firefoxでの証明書の問題を回避するのに役立ちます。

var profile = new FirefoxProfile();
profile.SetPreference("network.automatic-ntlm-auth.trusted-uris","DESIREDURL");
driver = new FirefoxDriver(profile);

3
InternetExplorerとGoogleChromeはどうですか?

1

セレンPythonでは、次のように設定する必要がありますdesired_capabilities

desired_capabilities = {
    "acceptInsecureCerts": True
}

1

Firefoxを使用してこの問題が発生し、上記の解決策が機能しない場合は、以下のコードを試してみてください(私の元の答えはここにあります)。

from selenium import webdriver

profile = webdriver.FirefoxProfile()
profile.DEFAULT_PREFERENCES['frozen']['marionette.contentListener'] = True
profile.DEFAULT_PREFERENCES['frozen']['network.stricttransportsecurity.preloadlist'] = False
profile.DEFAULT_PREFERENCES['frozen']['security.cert_pinning.enforcement_level'] = 0
profile.set_preference('webdriver_assume_untrusted_issuer', False)
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.dir", temp_folder)
profile.set_preference("browser.helperApps.neverAsk.saveToDisk",
                   "text/plain, image/png")
driver = webdriver.Firefox(firefox_profile=profile)

0

ブラウザの証明書ストアから必要な証明書を除くすべてを削除し、証明書が1つしかない場合に証明書を自動的に選択するようにブラウザを構成します。


0

この問題に関する最新情報です。

ドライバーが必要:

Linux: Centos 7 64bit, Window 7 64bit

Firefox: 52.0.3

Selenium Webdriver: 3.4.0 (Windows), 3.8.1 (Linux Centos)

GeckoDriver: v0.16.0 (Windows), v0.17.0 (Linux Centos)

コード

System.setProperty("webdriver.gecko.driver", "/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver");

ProfilesIni ini = new ProfilesIni();


// Change the profile name to your own. The profile name can 
// be found under .mozilla folder ~/.mozilla/firefox/profile. 
// See you profile.ini for the default profile name

FirefoxProfile profile = ini.getProfile("default"); 

DesiredCapabilities cap = new DesiredCapabilities();
cap.setAcceptInsecureCerts(true);

FirefoxBinary firefoxBinary = new FirefoxBinary();

GeckoDriverService service =new GeckoDriverService.Builder(firefoxBinary)
    .usingDriverExecutable(new 
File("/home/seleniumproject/geckodrivers/linux/v0.17/geckodriver"))
    .usingAnyFreePort()
    .usingAnyFreePort()
    .build();
try {
    service.start();
} catch (IOException e) {
    e.printStackTrace();
}

FirefoxOptions options = new FirefoxOptions().setBinary(firefoxBinary).setProfile(profile).addCapabilities(cap);

driver = new FirefoxDriver(options);
driver.get("https://www.google.com");

System.out.println("Life Title -> " + driver.getTitle());
driver.close();

0

セレンWebドライバー3.1を搭載したPhantomJSDriverを使用して.netc#でこれを行うことができました

 [TestMethod]
    public void headless()
    {


        var driverService = PhantomJSDriverService.CreateDefaultService(@"C:\Driver\phantomjs\");
        driverService.SuppressInitialDiagnosticInformation = true;
        driverService.AddArgument("--web-security=no");
        driverService.AddArgument("--ignore-ssl-errors=yes");
        driver = new PhantomJSDriver(driverService);

        driver.Navigate().GoToUrl("XXXXXX.aspx");

        Thread.Sleep(6000);
    }

0

新しいブラウザでこの問題が発生するたびに、AppRobotic Personalエディションを使用して特定の画面座標をクリックするか、ボタンをタブで移動してクリックします。

基本的にはマクロ機能を使用しているだけですが、ヘッドレスセットアップでは機能しません。


0

私はまったく同じ問題を抱えていました。しかし、ブラウザで手動でWebサイトを開こうとすると、証明書は正しいのですが、詳細では名前は「DONOTTRUST」でした。

証明書の違いは、バックグラウンドで実行されていたFiddlerが、再暗号化する前にすべてのHTTPSコンテンツを復号化したことが原因でした。

問題を解決するには、マシンでFiddlerを閉じます。Fiddlerを開いたままにする必要がある場合は、Fiddlerの設定で[SSLの復号化]のチェックを外すことができます。


0
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--ignore-certificate-errors");
driver = new ChromeDriver(options);

Chromeブラウザを搭載したJavaで使用しましたが、うまく機能しています


1
このコードは問題を解決する方法と理由の説明含めて質問を解決するかもしれませんが、投稿の品質を向上させるのに本当に役立ち、おそらくより多くの賛成票をもたらすでしょう。あなたは今尋ねている人だけでなく、将来読者のために質問に答えていることを忘れないでください。回答を編集して説明を追加し、適用される制限と前提条件を示してください。
デビッドバック

-3

この問題についての標準的な決定はまだないようです。言い換えれば、「Internet Explorer、Mozilla、Google Chromeのいずれであっても、認定資格を取得する」とは言えません。しかし、MozillaFirefoxの問題を回避する方法を示す投稿を1つ見つけました。興味のある方はこちらでチェックできます


しかし、Javaで行われた上記のコードはどうですか?現在アクセスしているWebサイトの証明書を受け入れるように各ブラウザに要求しています。Pythonでも同じことができませんか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.