Selenium을 사용하여 인증서를 처리하는 방법은 무엇입니까?


84

내가 사용하고 셀레늄을 브라우저를 실행합니다. 브라우저에 인증서 수락 여부를 묻는 웹 페이지 (URL)를 어떻게 처리 할 수 ​​있습니까?

Firefox에서는 다음과 같은 인증서를 수락하도록 요청하는 웹 사이트가있을 수 있습니다.

Firefox

Internet Explorer 브라우저에서 다음과 같은 내용이 표시 될 수 있습니다.

여기에 이미지 설명 입력

Google 크롬에서 :

구글 크롬

내 질문을 반복합니다. Selenium (Python 프로그래밍 언어)을 사용하여 브라우저 (Internet Explorer, Firefox 및 Google Chrome)를 시작할 때 웹 사이트 인증서 승인을 자동화하려면 어떻게 해야합니까?

답변:


138

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

설정 acceptSslCertsFalse:

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

설정 acceptSslCertsTrue:

>>> 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 사용 48+ 파이어 폭스를 들어,이 geckodriver 열려 문제가있어, 그들은 여전히 아무 생각이 버그 문제
알터 후

6
이 답변은 더 이상 유효하지 않습니다. 대신 'acceptInsecureCerts'를 사용하십시오.
rtaft

2
이 의견은 매우 늦었지만 지금 질문에 도달하는 사람들에게 도움이 될 수 있습니다. 위의 모든 것을 시도했지만 아무것도 작동하지 않았습니다. 다음과 함께 오류를 통과했습니다.driver.get("javascript:document.getElementById('overridelink').click()")
Diego F Medina

2
chromedriver의 경우이 네 가지 문자열을 모두 options.add_argument-> allow-running-insecure-contentand ignore-certificate-errorsand allow-insecure-localhostand unsafely-treat-insecure-origin-as-secure(다음으로 더 찾아 볼 수 있습니다 : strings /opt/google/chrome/chrome | grep insecure및 비슷한 grepping)
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);

를 들어 인터넷 익스플로러 우리가 사용할 수 있습니다 :

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

4
질문은 파이썬에 관한 것이 었습니다. 적어도 어떤 언어인지 쓸 수 있습니다.
user1

1
주의하세요. 'ProfilesIni'는 더 이상 사용되지 않습니다!
Happy Bird

자바 버전이 ChromeOptions options = new ChromeOptions (); options .addArguments ( "-ignore-ssl-errors = yes", "--ignore-certificate-errors"); ChromeDriver 드라이버 = 새 ChromeDriver (옵션);
Roberto Petrilli

6

Firefox Python의 경우 :

Firefox 자체 서명 된 인증서 버그가 이제 수정되었습니다. 마리오네트 파이어 폭스 웹 드라이브 파이썬 스플린터로 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
이제 Firefox 52가 출시되었습니다. 업그레이드 파이어 폭스 , 업그레이드 셀레늄 V3.3에, 다운로드 geckodriver v0.15에 그리고 당신은 심지어 바이너리 경로를 더 이상 필요하지 않습니다!
Rémi Debette 2017 년

4

그리고 C # (.net core)에서 다음 Selenium.WebdriverSelenium.Chrome.Webdriver같이 사용합니다.

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

3

파이썬 셀레늄을 통해 헤드리스 크롬과 관련된이 질문에 오는 사람들을 위해 https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102를 찾을 수 있습니다. 가 유용 할 수 있습니다.

당신이 할 수있는 것 같습니다

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

또는 다음 줄을 따라 뭔가 (파이썬에 적응해야 할 수도 있음) :

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
이 코드 스 니펫은 질문을 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 큰 도움이됩니다. 앞으로 독자를위한 질문에 답하고 있고, 그 사람들은 코드 제안 이유를 모를 수도 있다는 점을 기억하십시오
Abhishek

2

자바 스크립트 :

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
Internet Explorer와 Google 크롬은 어떻습니까?

1

셀레늄 파이썬에서는 다음 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

브라우저의 인증서 저장소에서 필요한 인증서를 제외한 모든 인증서를 삭제 한 다음 인증서가 하나만있는 경우 인증서를 자동으로 선택하도록 브라우저를 구성합니다.


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

셀레늄 웹 드라이버 3.1을 사용하는 PhantomJSDriver를 사용하여 .net C #에서이 작업을 수행 할 수있었습니다.

 [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

나는 똑같은 문제가 있었다. 그러나 브라우저에서 수동으로 웹 사이트를 열었을 때 인증서는 정확했지만 세부 사항에서는 이름이 "DONOTTRUST"였습니다.

인증서의 차이는 백그라운드에서 실행 중이었고 다시 암호화하기 전에 모든 HTTPS 콘텐츠를 해독 한 Fiddler로 인해 발생했습니다.

내 문제를 해결하려면 컴퓨터에서 Fiddler를 닫으십시오. Fiddler를 열어 두어야하는 경우 Fiddler 설정에서 SSL 암호 해독을 선택 취소 할 수 있습니다.


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

Chrome 브라우저와 함께 Java에 사용했습니다.


1
이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 아마도 더 많은 찬성 투표를 받게됩니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 답변을 편집하여 설명을 추가하고 적용되는 제한 및 가정에 대한 표시를 제공하십시오.
David Buck

-3

이 문제에 대한 표준 결정이 아직없는 것 같습니다. 다시 말해, "인터넷 익스플로러, 모질라 또는 구글 크롬이든지 상관없이 인증을하세요"라고 말할 수 없습니다. 그러나 Mozilla Firefox에서 문제를 해결하는 방법을 보여주는 하나의 게시물을 찾았습니다. 관심이 있으시면 여기에서 확인할 수 있습니다 .


그러나 위의 코드는 Java로 수행되는 것은 어떻습니까? 현재 방문한 웹 사이트의 인증서를 수락하도록 각 브라우저에 요청합니다. 파이썬에서도 똑같이 할 수 없습니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.