首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MechanicalSoup证书验证失败

MechanicalSoup证书验证失败
EN

Stack Overflow用户
提问于 2019-12-11 22:58:19
回答 2查看 828关注 0票数 2

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

  1. 找到禁用SSL验证的方法。
  2. 告诉MechanicalSoup它在哪里可以找到pem文件(我使用"openssl s_connect .“创建了它)

到目前为止,我的代码如下所示:

代码语言:javascript
复制
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)

堆栈结束时的完全错误消息:

代码语言:javascript
复制
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')],)",),))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-11 23:30:37

也许你可以用:browser.open("https://" + args.server + ":" + args.port, verify=False)

票数 1
EN

Stack Overflow用户

发布于 2019-12-13 16:32:09

MechanicalSoup不对SSL证书做任何特定的操作,但是browser.open将其参数转发给requests.Session.request的构造函数,该构造函数除其他外公开如下:

验证-(可选)或者是布尔值,在这种情况下,它控制我们是验证服务器的TLS证书,还是字符串,在这种情况下,它必须是到CA包使用的路径。默认为True。 cert -(可选)如果字符串,路径到ssl客户端证书文件(.pem)。如果是元组,(‘cert’,‘key’)对。

因此,您可以按照另一个答案(不安全)使用verify=False,或者使用从网站下载证书并使用cert="/path/to/certificate.pem

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59295401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档