📜  python selenium firefox 处理 ssl 绕过 - Python (1)

📅  最后修改于: 2023-12-03 15:19:00.239000             🧑  作者: Mango

Python Selenium Firefox 处理 SSL 绕过

SSL 协议是安全加密传输的 HTTPS 协议的基础,然而某些情况下,这会成为开发和测试中一种非常棘手的问题。例如,SSL 证书验证不通过,或者被中间人攻击等问题。针对这些情况,我们需要使用 Python Selenium Firefox 处理 SSL 绕过,保证程序的正常运行。

SSL 绕过

SSL 绕过是指关闭 SSL 认证,从而允许测试过程中进行 HTTP 请求。在 Python Selenium Firefox 中,我们可以通过设置 certain preferences 来完全绕过 SSL 验证。

from selenium import webdriver

firefox_profile = webdriver.FirefoxProfile()
firefox_profile.set_preference("webdriver_accept_untrusted_certs", True)
firefox_profile.set_preference("webdriver_assume_untrusted_issuer", True)
driver = webdriver.Firefox(firefox_profile=firefox_profile)

在上述代码中,我们设置了 webdriver_accept_untrusted_certswebdriver_assume_untrusted_issuer 为 True,意味着它们会接受未被信任的 SSL 证书以及未被信任的证书颁发机构。这将完全关闭的 SSL 认证。

使用 Firefox 自带的证书

在某些情况下,我们可能需要使用 Firefox 自带的证书来绕过 SSL 认证。Firefox 自带了一个名为 cert8.db 的证书库,其中存储了 Firefox 浏览器本身使用的 SSL 证书,我们可以通过这个证书库来解决 SSL 认证问题。

import os
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver

fp = webdriver.FirefoxProfile()
fp.set_preference("security.enable_ssl3", False)
fp.set_preference("security.ssl.allow_unrestricted_renego_everywhere__temporarily_available_pref", True)
fp.set_preference("security.ssl.renego_unrestricted_hosts", "")
fp.set_preference("security.ssl.enable_false_start", True)
fp.set_preference("security.OCSP.enabled", 0)
fp.set_preference("security.enable_tls ", True)
fp.set_preference("security.default_personal_cert", "Select Automatically")
fp.set_preference("network.http.prompt-temp-redirect", False)
fp.set_preference("network.automatic-ntlm-auth.trusted-uris", "")
fp.set_preference("network.negotiate-auth.delegation-uris", "")
fp.set_preference("network.negotiate-auth.trusted-uris", "")
fp.set_preference("network.ntlm.send-lm-response", False)
fp.set_preference("network.proxy.type", 0)

dir_path = os.path.dirname(os.path.realpath(__file__))
cert_file = os.path.join(dir_path, "cert8.db")
if os.path.isfile(cert_file):
    fp.set_preference("security.enterprise_roots.enabled", True)
    fp.set_preference("security.enterprise_roots.mozilla", True)
    fp.set_preference("security.enterprise_roots.enabled", True)
    fp.set_preference("security.cert_override_flags", 32)
    fp.set_preference("security.OCSP.enabled", 0)
    fp.set_preference("security.OCSP.require", False)
    fp.set_preference("security.cert_override_issuer", False)
    fp.set_preference("security.OCSP.GET.enabled", False)
    fp.set_preference("security.OCSP.require", False)
    fp.set_preference("security.OCSP.timeout", 0)
    fp.set_preference("security.OCSP.soft_fail", True)
    fp.set_preference("security.OCSP.stapling", False)
    fp.set_preference("security.ssl3.ecdh_ecdsa_rc4_128_sha", False)
    fp.set_preference("security.ssl3.rsa_rc4_128_md5", False)
    fp.set_preference("security.ssl3.rsa_rc4_128_sha", False)
    fp.set_preference("security.OCSP.enabled", 0)
    fp.set_preference("security.OCSP.require", False)
    fp.set_preference("security.disable_button.show_warning_after_disabled", False)
    fp.set_preference("security.default_personal_cert", "Ask Every Time")

driver = webdriver.Firefox(firefox_profile=fp)

driver.get("https://www.example.com")
elem = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//*[@id='hplogo']")))
driver.quit()

在上述代码中,我们设置了一些 preferences,以及寻找证书库文件并将其加入 Firefox 认证机制。需要注意的是,这里有一些 preferences 不仅仅是为了处理 SSL 绕过,还有其他用途。

总结

Python Selenium Firefox 处理 SSL 绕过是 Python 爬虫开发中的一项重要技能。我们可以通过关闭 SSL 验证或者引入 Firefox 自带的证书库来绕过 SSL 认证,确保测试或爬取代码的稳定运行。