Python 使用MechanicalGroup验证证书失败

Python 使用MechanicalGroup验证证书失败,python,python-3.x,ssl,ssl-certificate,mechanicalsoup,Python,Python 3.x,Ssl,Ssl Certificate,Mechanicalsoup,我想使用MechanicalSoup从路由器检索一些数据。然而,当我尝试时,我得到“证书验证失败”。在我看来,我有两个选择 找到一种禁用SSL验证的方法 告诉MechanicalSoup在哪里可以找到pem文件(我使用“openssl s_connect…”创建了它) 到目前为止,我的代码如下所示: import argparse import mechanicalsoup from getpass import getpass parser = argparse.ArgumentParser

我想使用MechanicalSoup从路由器检索一些数据。然而,当我尝试时,我得到“证书验证失败”。在我看来,我有两个选择

  • 找到一种禁用SSL验证的方法
  • 告诉MechanicalSoup在哪里可以找到pem文件(我使用“openssl s_connect…”创建了它)
  • 到目前为止,我的代码如下所示:

    import argparse
    import mechanicalsoup
    from getpass import getpass
    
    parser = argparse.ArgumentParser(description="Get data from router")
    parser.add_argument("-u", "--username", help="User", type=str,
                        required=True)
    parser.add_argument("-s", "--server", help="server", type=str,
                        required=True)
    parser.add_argument("-p", "--port", help="Port", type=str,
                        required=False, default="8443")
    parser.add_argument("-v", "--verbose", help="Verbose output. Add " +
                        "additional v to increase level.",
                        action="count", default=0)
    args = parser.parse_args()
    
    args.password = getpass("Password:")
    
    browser = mechanicalsoup.StatefulBrowser(
        soup_config={'features': 'lxml'},
        raise_on_404=True,
        user_agent='getdata.py/0.1',
    )
    
    browser.set_verbose(args.verbose)
    
    browser.open("https://" + args.server + ":" + args.port)
    
    来自堆栈末尾的完整错误消息:

    Traceback (most recent call last):
      File "perfcreate.py", line 33, in <module>
        browser.open("https://" + args.server + ":" + args.port)
      File "/home/andyw/mypy_env/lib/python3.6/site-packages/mechanicalsoup/stateful_browser.py", line 133, in open
        resp = self.get(url, *args, **kwargs)
      File "/home/andyw/mypy_env/lib/python3.6/site-packages/mechanicalsoup/browser.py", line 124, in get
        response = self.session.get(*args, **kwargs)
      File "/home/andyw/mypy_env/lib/python3.6/site-packages/requests/sessions.py", line 546, in get
        return self.request('GET', url, **kwargs)
      File "/home/andyw/mypy_env/lib/python3.6/site-packages/requests/sessions.py", line 533, in request
        resp = self.send(prep, **send_kwargs)
      File "/home/andyw/mypy_env/lib/python3.6/site-packages/requests/sessions.py", line 646, in send
        r = adapter.send(request, **kwargs)
      File "/home/andyw/mypy_env/lib/python3.6/site-packages/requests/adapters.py", line 514, in send
        raise SSLError(e, request=request)
    requests.exceptions.SSLError: HTTPSConnectionPool(host='192.168.1.1', port=8443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))
    
    回溯(最近一次呼叫最后一次):
    文件“perfcreate.py”,第33行,在
    browser.open(“https://“+args.server+”:“+args.port”)
    打开文件“/home/andyw/mypy_env/lib/python3.6/site packages/mechanicalsoup/stateful_browser.py”,第133行
    resp=self.get(url、*args、**kwargs)
    get中的文件“/home/andyw/mypy_env/lib/python3.6/site packages/mechanicalsoup/browser.py”,第124行
    response=self.session.get(*args,**kwargs)
    get中的文件“/home/andyw/mypy_env/lib/python3.6/site packages/requests/sessions.py”,第546行
    返回self.request('GET',url,**kwargs)
    文件“/home/andyw/mypy_env/lib/python3.6/site packages/requests/sessions.py”,请求中的第533行
    resp=自我发送(准备,**发送)
    文件“/home/andyw/mypy_env/lib/python3.6/site packages/requests/sessions.py”,第646行,在send中
    r=适配器.send(请求,**kwargs)
    文件“/home/andyw/mypy_env/lib/python3.6/site packages/requests/adapters.py”,第514行,在send中
    raise SSLError(e,请求=请求)
    requests.exceptions.SSLError:HTTPSConnectionPool(host='192.168.1.1',port=8443):url:/(由SSLError引起(SSLError(“错误握手:错误([('SSL例程','tls\进程\服务器\证书','证书验证失败]),),,),)
    
    也许您可以使用:
    浏览器。open(“https://“+args.server+”:“+args.port,verify=False)
    MechanicalSoup不会对SSL证书执行任何特定的操作,但是
    浏览器。open
    将其参数转发给的构造函数,其中包括:

    验证–(可选)一个布尔值,在这种情况下它控制我们是否验证服务器的TLS证书,或者一个字符串,在这种情况下它必须是要使用的CA捆绑包的路径。默认为True

    证书–(可选)如果为字符串,则为ssl客户端证书文件(.pem)的路径。如果是元组,('cert','key')对


    因此,您可以按照另一个答案的建议使用
    verify=False
    (不安全),或者使用
    cert=“/path/to/certificate.pem

    GAH!我以前试过,但它不起作用。只是再试一次,现在它起作用了。我想我在某个地方输入了一个错误。就像其他人的额外参考:verify=“certfile”也起作用。