¿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) ?

Peter Mortensen
fuente

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()
Alecxe
fuente
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);
Susanta Adhikary
fuente
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")
Rémi Debette
fuente
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))
{ 
  ...
}
Sgedda
fuente
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)
oxer
fuente
3
    ChromeOptions options = new ChromeOptions().addArguments("--proxy-server=http://" + proxy);
    options.setAcceptInsecureCerts(true);
Vasista TVN
fuente
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();
Jamil Aryan
fuente
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
Chris
fuente
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);
usuario2062360
fuente
3
¿Qué pasa con Internet Explorer y Google Chrome?
1

En selenium python, debe establecerlo desired_capabilitiescomo:

desired_capabilities = {
    "acceptInsecureCerts": True
}
nattster
fuente
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)
C. Feng
fuente
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.

código elegante
fuente
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();
TIENE
fuente
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);
    }
usuario2728409
fuente
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.

James
fuente
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.

glautrou
fuente
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

Ritesh
fuente
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í .

Stanimir Yakimov
fuente
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?