Làm thế nào để xử lý các chứng chỉ bằng Selenium?


84

Tôi đang sử dụng Selenium để khởi chạy trình duyệt. Làm cách nào để xử lý các trang web (URL) yêu cầu trình duyệt chấp nhận chứng chỉ hay không?

Trong Firefox, tôi có thể có một trang web như vậy yêu cầu tôi chấp nhận chứng chỉ của nó như sau:

Firefox

Trên trình duyệt Internet Explorer, tôi có thể nhận được một cái gì đó như sau:

Nhập mô tả hình ảnh tại đây

Trên Google Chrome:

Google Chrome

Tôi lặp lại câu hỏi của mình: Làm cách nào để tự động chấp nhận chứng chỉ của trang web khi tôi khởi chạy trình duyệt (Internet Explorer, Firefox và Google Chrome) với Selenium (ngôn ngữ lập trình Python) ?

Câu trả lời:


138

Đối với Firefox, bạn cần đặt accept_untrusted_certs FirefoxProfile()tùy chọn thành 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()

Đối với Chrome, bạn cần thêm đối số:--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()

Đối với Internet Explorer, bạn cần đặt acceptSslCertskhả năng mong muốn:

from selenium import webdriver

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

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

driver.close()

Trên thực tế, theo Desired Capabilitiestài liệu , acceptSslCertskhả năng đặt thành Truesẽ hoạt động cho tất cả các trình duyệt vì nó là khả năng đọc / ghi chung:

acceptSslCerts

boolean

Theo mặc định, phiên có chấp nhận tất cả chứng chỉ SSL hay không.


Bản demo làm việc cho Firefox:

>>> from selenium import webdriver

Cài đặt acceptSslCertsthành 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()

Cài đặt acceptSslCertsthành 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
Tôi không có khả năng để làm cho nó hoạt động trên IE 11, nó chỉ giữ hiển thị cho tôi trang Lỗi Certificate
estemendoza

Đối với firefox 48+ sử dụng geckodriver vẫn có vấn đề, đây là vấn đề mở trong geckodriver, họ vẫn không có ý tưởng cho nó, xem Issue Bug
Alter Hồ

6
Câu trả lời này không còn giá trị, sử dụng 'acceptInsecureCerts' thay
rtaft

2
Nhận xét này có thể rất muộn nhưng hữu ích cho những người đang tiếp cận câu hỏi ngay bây giờ. Tôi đã thử tất cả những điều trên và không có gì hiệu quả. Chỉ quản lý để vượt qua Lỗi với:driver.get("javascript:document.getElementById('overridelink').click()")
Diego F Medina

2
cho chromedriver tôi đã kết thúc đi qua tất cả bốn dây để options.add_argument -> allow-running-insecure-contentignore-certificate-errorsallow-insecure-localhostunsafely-treat-insecure-origin-as-secure(bạn có thể thử để tìm thêm bằng cách: strings /opt/google/chrome/chrome | grep insecurevà grepping tương tự)
pestophagous

8

Đối với Firefox:

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

Đối với Chrome, chúng tôi có thể sử dụng:

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

Đối với Internet Explorer, chúng ta có thể sử dụng:

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

4
Câu hỏi là về Python. Ít nhất bạn có thể viết ngôn ngữ đó là gì.
user1

1
Hãy cẩn thận, 'ProfilesIni' không được dùng nữa!
Happy Bird

Hy vọng rằng phiên bản java có thể giúp ích cho ChromeOptions options = new ChromeOptions (); tùy chọn .addArguments ("- ignore-ssl-error = yes", "--ignore-certificate-error"); Trình điều khiển ChromeDriver = ChromeDriver mới (tùy chọn);
Roberto Petrilli

6

Đối với Firefox Python:

Lỗi chứng chỉ tự ký của Firefox hiện đã được sửa: accept ssl cert với marionette firefox webdrive python splinter

"acceptSslCerts" phải được thay thế bằng "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
Và bây giờ Firefox 52 đã hoạt động. Nâng cấp Firefox , nâng cấp selenium lên v3.3, tải xuống geckodriver lên v0.15 và bạn thậm chí không cần đường dẫn nhị phân nữa!
Rémi Debette

4

Và trong C # (lõi .net) bằng cách sử dụng Selenium.WebdriverSelenium.Chrome.Webdrivernhư thế này:

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

3

Đối với những người có câu hỏi liên quan đến rôm sảy không đầu qua python selen này, bạn có thể thấy https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 hữu ích.

Có vẻ như bạn có thể làm

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

hoặc một cái gì đó dọc theo những dòng sau (có thể cần phải điều chỉnh cho 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
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn
Abhishek

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

Tôi đã gặp phải vấn đề tương tự với Selenium và Behat. Nếu bạn muốn chuyển các tham số qua behat.yml, đây là những gì nó cần trông như thế nào:

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

1

Tạo hồ sơ và sau đó là trình điều khiển giúp chúng tôi giải quyết vấn đề chứng chỉ trong Firefox:

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

3
Internet Explorer và Google Chrome thì sao?

1

Trong trăn selen, bạn cần đặt desired_capabilitieslà:

desired_capabilities = {
    "acceptInsecureCerts": True
}

1

Đối với những người gặp sự cố này bằng cách sử dụng Firefox và các giải pháp trên không hoạt động, bạn có thể thử mã bên dưới (câu trả lời ban đầu của tôi là ở đây ).

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

Xóa tất cả trừ chứng chỉ cần thiết khỏi kho chứng chỉ của trình duyệt và sau đó định cấu hình trình duyệt để tự động chọn chứng chỉ khi chỉ có một chứng chỉ.


0

Chỉ là một bản cập nhật liên quan đến vấn đề này.

Yêu cầu trình điều khiển:

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

Tôi đã có thể thực hiện việc này trên .net c # với PhantomJSDriver với trình điều khiển web selenium 3.1

 [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

Bất cứ khi nào tôi gặp sự cố này với các trình duyệt mới hơn, tôi chỉ cần sử dụng phiên bản AppRobotic Personal để nhấp vào tọa độ màn hình cụ thể hoặc chuyển qua các nút và nhấp.

Về cơ bản, nó chỉ sử dụng chức năng macro của nó, nhưng sẽ không hoạt động trên các thiết lập không có đầu.


0

Tôi đã có vấn đề chính xác cùng. Tuy nhiên, khi tôi thử mở trang web theo cách thủ công trong trình duyệt thì chứng chỉ đúng, nhưng trong chi tiết tên là "DONOTTRUST".

Sự khác biệt của chứng chỉ là do Fiddler đang chạy trong nền và giải mã tất cả nội dung HTTPS trước khi mã hóa lại.

Để khắc phục sự cố của tôi, chỉ cần đóng Fiddler trên máy. Nếu bạn cần tiếp tục mở Fiddler, thì bạn có thể bỏ chọn Giải mã SSL trong Cài đặt Fiddler.


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

Tôi đã sử dụng nó cho Java với trình duyệt Chrome, nó hoạt động tốt


1
Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do tại sao điều này giải quyết vấn đề sẽ thực sự giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều phiếu bầu hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những giới hạn và giả định áp dụng.
David Buck

-3

Có vẻ như nó vẫn chưa có một quyết định tiêu chuẩn cho vấn đề này. Nói cách khác - bạn vẫn không thể nói "Được rồi, hãy làm chứng nhận, bất cứ điều gì nếu bạn là Internet Explorer, Mozilla hay Google Chrome". Nhưng tôi đã tìm thấy một bài đăng hướng dẫn cách khắc phục sự cố trong Mozilla Firefox. Nếu bạn quan tâm đến nó, bạn có thể kiểm tra nó tại đây .


Nhưng những gì về đoạn mã trên được thực hiện bằng Java? Nó yêu cầu mỗi trình duyệt chấp nhận chứng chỉ của trang web visted hiện tại. Chúng ta có thể làm điều tương tự trong Python không?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.