【问题标题】:Selenium webdriver to access E-CAC using certificate A1Selenium webdriver 使用证书 A1 访问 E-CAC
【发布时间】:2021-08-27 23:12:24
【问题描述】:

我很难找到一种方法来使用 python 在网页上选择证书。我已经尝试了这些示例,但仍然无法正常工作。有没有人可以帮帮我?


从硒导入网络驱动程序

从 selenium.webdriver.common.keys 导入密钥

navegador = webdriver.Chrome("C:\Program Files\Google\Chrome\Application\chromedriver.exe")

navegador.get("https://cav.receita.fazenda.gov.br/ecac/")

navegador.find_element_by_id("login-dados-certificado").click()

navegador.find_element_by_id("cert-digital").click()

【问题讨论】:

  • 请将您的代码添加到代码括号中
  • 您遇到什么错误?将错误放在帖子中。
  • 这不是错误,我只是无法选择证书

标签: python selenium ssl webdriver certificate


【解决方案1】:

如果您想尝试使用注册表编辑器并使用 ChromeDriver,请尝试:

1-) 按 Windwos + R 并输入“regedit”。

2-) Rigth 点击“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies”,选择新建 -> 密钥并输入名称“Google”,然后在此密钥中添加密钥“Chrome”,然后在此密钥中添加名为“ AutoSelectCertificateForUrls”。完整路径必须是“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls”。

3-) 右击 AutoSelectCertificateForUrls,新建 -> 字符串值,并输入名称“1”。

4-) 右击“1”,修改后复制粘贴这个 JSON “{”pattern”:”https://urlFromTheSiteYouWantAccess”,”filter”:{“ISSUER”:{“CN”:“你的cn"},"SUBJECT":{"CN":"你的证书 cn"}}}".

如果您只想使用一个证书访问 E-CAC,您可以使用按钮发送证书的 url 手动编辑上面的 Json,以及您希望 chrome 为您选择的证书的颁发者和主题信息。

但如果想使用多重证书,您可以使用此 python 代码打开证书,获取有关颁发者和主题的信息,并更改注册表 AutoSelectCertificateForUrls 中 StringValue "1" 中的 Json。

进口。

from os import times
import winreg
from OpenSSL import crypto
from selenium import webdriver

开证方法:

def GetCertificate(pathOfCertificate, passwordOfCertifcate):
    pkcs12 = crypto.load_pkcs12(open(pathOfCertificate, 'rb').read(), passwordOfCertifcate)   
    return pkcs12.get_certificate()

更新注册表键“AutoSelectCertificateForUrls”中StringValue中Json的方法:

def UpdateStringValue(strigValueName,newValueOfStrinValue, stringValuePath):
  key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, stringValuePath, 0, winreg.KEY_ALL_ACCESS)
  winreg.SetValueEx(key, strigValueName, 0, winreg.REG_SZ, newValueOfStrinValue)
  winreg.CloseKey(key)

我为路径声明 2 个变量的主要部分是字符串值和字符串值的名称。在我的情况下是“1”:

pathOfstringValue = 'SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls'
stringValueName = '1'

获取证书及 Issuer 和 Subject 信息:

certificate = GetCertificate("C:\yourCrtificatePath\\Certificate.pfx", 'certificatePassword')
subject = certificate.get_subject()
issuer = certificate.get_issuer()

第一个 URL 是发送证书的地方,另一个是我们有证书登录按钮的页面:

url_where_certificate_will_be_send = "https://notacarioca.rio.gov.br/"
url = 'https://notacarioca.rio.gov.br/senhaweb/login.aspx'

构建json,(对不起,处理字符串的方式很丑)并调用方法来编辑字符串值注册表:

json = '{"pattern":"' + url_where_certificate_will_be_send + '","filter":{"ISSUER":{"CN":"' + issuer.CN + '","C":"' + issuer.C + '","O":"' + issuer.O + '"},"SUBJECT":{"CN":"' + subject.CN + '","C":"' + subject.C + '","O":"' + subject.O + '"}}}'
UpdateStringValue(stringValueName, json, pathOfstringValue)

最后是点击证书登录按钮的代码:

driver = webdriver.Chrome()

driver.get(url)

btn_certificate_login = driver.find_element_by_id('ctl00_cphCabMenu_imgLoginICP')
btn_certificate_login.click()
times.sleep(2.4)
driver.quit()

要下载代码,请访问我的 github here

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 抱歉,我是新来回答堆栈中的问题。我将编辑我的答案!感谢您的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2011-04-14
  • 2021-04-28
相关资源
最近更新 更多