ssl Selenium webdriver使用证书A1访问E-CAC

zwghvu4y  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(391)

我很难找到一种方法来选择在网页上的证书,使用python。我试过这些例子,但仍然不起作用。有人能帮我吗?

from selenium import webdriver
from selenium.webdriver.common.keys import 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()
wh6knrhe

wh6knrhe1#

如果你想尝试使用注册表编辑器和使用ChromeDriver尝试:
1-)按Windwos + R并键入“regedit”。
2-)右键点击“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies”,选择new -> Key并输入名称“Google”,然后在此键中添加密钥“Chrome”,并在此键中添加名为“AutoSelectCertificateForUrls”的密钥。完整路径必须是“Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\AutoSelectCertificateForUrls”。
3-)右键点击AutoSelectCertificateForUrls,new -> String Value,并输入名称“1”。
4-)右键点击“1”,修改后复制粘贴此JSON“{“pattern”:“https://urlFromTheSiteYouWantAccess”,“filter”:{“ISSUER”:{“CN”:“your cn”},“SUBJECT”:{“CN”:“your certificate cn”}}}"。
如果您只想使用一个证书访问E-CAC,您可以手动编辑上面的JSON,其中包含按钮发送证书的URL以及您希望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'

获取证书及签发人、主体信息:

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

相关问题