¿Cómo lidiar con los certificados usando Selenium?


84

Estoy usando Selenium para iniciar un navegador. ¿Cómo puedo lidiar con las páginas web (URL) que le pedirán al navegador que acepte un certificado o no?

En Firefox, es posible que tenga un sitio web como el que me pide que acepte su certificado de esta manera:

Firefox

En el navegador Internet Explorer, puedo obtener algo como esto:

Ingrese la descripción de la imagen aquí

En Google Chrome:

Google Chrome

Repito mi pregunta: ¿Cómo puedo automatizar la aceptación del certificado de un sitio web cuando abro un navegador (Internet Explorer, Firefox y Google Chrome) con Selenium (lenguaje de programación Python) ?

Respuestas:


138

Para Firefox, debe configurar la accept_untrusted_certs FirefoxProfile()opción para 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()

Para Chrome, debe agregar un argumento:--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()

Para Internet Explorer, debe configurar la acceptSslCertscapacidad deseada:

from selenium import webdriver

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

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

driver.close()

En realidad, de acuerdo con la Desired Capabilitiesdocumentación , la acceptSslCertscapacidad de configuración Truedebería funcionar para todos los navegadores, ya que es una capacidad genérica de lectura / escritura:

acceptSslCerts

booleano

Si la sesión debe aceptar todos los certificados SSL de forma predeterminada.


Demostración funcional para Firefox:

>>> from selenium import webdriver

Ajuste acceptSslCertsa 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()

Ajuste acceptSslCertsa 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
No puedo hacerlo funcionar en IE 11, solo me sigue mostrando la página de Error de certificado
estemendoza

Para firefox 48+, el uso de geckodriver todavía tiene problemas, este es un problema abierto en geckodriver, todavía no tienen idea, consulte el Problema de error
Alter Hu

6
Esta respuesta ya no es válida, use 'acceptInsecureCerts' en su lugar
rtaft

2
Este comentario puede llegar muy tarde, pero es útil para las personas que llegan a la pregunta ahora. Probé todo lo anterior y nada funcionó. Solo logró pasar el Error con:driver.get("javascript:document.getElementById('overridelink').click()")
Diego F Medina

2
para chromedriver terminé pasando todas estas cuatro cadenas a options.add_argument -> allow-running-insecure-contenty ignore-certificate-errorsy allow-insecure-localhosty unsafely-treat-insecure-origin-as-secure(puede intentar encontrar más mediante: strings /opt/google/chrome/chrome | grep insecurey grepping similar)
pestophagous

8

Para Firefox:

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

Para Chrome podemos usar:

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

Para Internet Explorer podemos usar:

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

4
La pregunta era sobre Python. Al menos podrías escribir qué idioma es ese.
usuario1

1
¡Cuidado, 'ProfilesIni' está obsoleto!
Happy Bird

Espero que la versión de Java pueda ayudar a las opciones de ChromeOptions = new ChromeOptions (); opciones .addArguments ("- ignore-ssl-errors = yes", "--ignore-certificate-errors"); Controlador ChromeDriver = nuevo ChromeDriver (opciones);
Roberto Petrilli

6

Para Firefox Python:

El error del certificado autofirmado de Firefox ahora se ha solucionado: acepte el certificado ssl con marionette firefox webdrive python splinter

"acceptSslCerts" debe reemplazarse por "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
Y ahora Firefox 52 está activo. Actualice Firefox , actualice selenium a v3.3, descargue geckodriver a v0.15 y ya ni siquiera necesitará la ruta binaria.
Rémi Debette

4

Y en C # (.net core) usando Selenium.Webdrivery Selenium.Chrome.Webdriverasí:

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

3

Para las personas que responden a esta pregunta relacionada con el cromo sin cabeza a través de python selenium, puede encontrar https://bugs.chromium.org/p/chromium/issues/detail?id=721739#c102 útil.

Parece que puedes hacer

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

o algo similar a lo siguiente (es posible que deba adaptarse para 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
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y es posible que esas personas no sepan las razones de su sugerencia de código
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

Me encontré con el mismo problema con Selenium y Behat. Si desea pasar los parámetros a través behat.yml, este es el aspecto que debe tener:

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

1

Crear un perfil y luego un controlador nos ayuda a solucionar el problema del certificado en Firefox:

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

3
¿Qué pasa con Internet Explorer y Google Chrome?

1

En selenium python, debe establecerlo desired_capabilitiescomo:

desired_capabilities = {
    "acceptInsecureCerts": True
}

1

Para aquellos que tienen este problema usando Firefox y las soluciones anteriores no funcionan, pueden probar el código a continuación (mi respuesta original está aquí ).

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

Elimine todo menos el certificado necesario del almacén de certificados de su navegador y luego configure el navegador para seleccionar automáticamente el certificado cuando solo haya un certificado presente.


0

Solo una actualización sobre este tema.

Requerir controladores:

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)

Código

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

Pude hacer esto en .net c # con PhantomJSDriver con el controlador 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

Cada vez que me encuentro con este problema con los navegadores más nuevos, simplemente uso la edición AppRobotic Personal para hacer clic en coordenadas de pantalla específicas, o tabular los botones y hacer clic.

Básicamente, solo usa su funcionalidad macro, pero no funcionará en configuraciones sin cabeza.


0

Yo tuve exactamente el mismo problema. Sin embargo, cuando intenté abrir el sitio web manualmente en el navegador, el certificado era correcto, pero en los detalles el nombre era "DONOTTRUST".

La diferencia de certificado fue causada por Fiddler que se estaba ejecutando en segundo plano y descifrando todo el contenido HTTPS antes de volver a cifrarlo.

Para solucionar mi problema, simplemente cierre Fiddler en la máquina. Si necesita mantener Fiddler abierto, puede desmarcar Descifrar SSL en la configuración de Fiddler.


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

Lo he usado para Java con el navegador Chrome, funciona bien


1
Si bien este código puede resolver la pregunta, incluir una explicación de cómo y por qué esto resuelve el problema realmente ayudaría a mejorar la calidad de su publicación y probablemente resultaría en más votos a favor. Recuerde que está respondiendo la pregunta a los lectores en el futuro, no solo a la persona que pregunta ahora. Edite su respuesta para agregar explicaciones y dar una indicación de las limitaciones y suposiciones que se aplican.
David Buck

-3

Parece que todavía no tiene una decisión estándar de este problema. En otras palabras, todavía no puede decir "Está bien, haga una certificación, independientemente de si es Internet Explorer, Mozilla o Google Chrome". Pero encontré una publicación que muestra cómo solucionar el problema en Mozilla Firefox. Si te interesa, puedes consultarlo aquí .


Pero, ¿qué pasa con el código anterior hecho en Java? Se solicita a cada navegador que acepte el certificado del sitio web visitado actualmente. ¿No podemos hacer lo mismo en Python?
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.