【问题标题】:Python Requests 'Permission denied' but works with sudoPython 请求“权限被拒绝”但与 sudo 一起使用
【发布时间】:2018-02-14 06:34:49
【问题描述】:

我正在使用 Python Requests 库连接到 REST 服务器,方法是使用 .pem 证书来验证我要建立连接的身份,以便我可以开始收集数据、解析数据等。当我通过 Eclipse 或终端,我得到这个错误:

[('system library', 'fopen', 'Permission denied'), ('BIO routines', 'FILE_CTRL', 'system lib'), ('SSL routines', 'SSL_CTX_use_certificate_file', 'system lib')]

但是,如果我以“sudo”身份运行 - 请求库按预期工作并且我能够检索数据。不幸的是,作为“sudo”运行有副作用,即默认 Python 解释器是根解释器,即 Python2。但是,Anaconda 需要很多库依赖项。

对于上下文,这是我用来建立连接的函数:

PEM_FILE = os.path.expanduser("path/to/pem/file.pem")   #Path is to a folder in root level
    def set_up_connection(self):

    #URL's to request a connection with
    rest_auth = 'https://www.restwebsite.com/get/data'

    ip_address = self.get_ip_address()

    body = json.dumps({'userid':'user', 'password':'pass', 'ip_address':ip_address})

    try:
        resp = self.session.post(rest_auth, data=body, cert=PEM_FILE, verify=False)
        values = resp.json()
        token = values['token']

    except Exception as e:
        print(e)
        token = None

    return token, ip_address

TLDR;使用“python rest_connector.py”会导致错误。以 sudo 的方式运行该命令。

证书上下文:.pem 证书权限设置为 600 (rw-------)。

为了尝试解决我作为 sudo 运行的问题,我启动了一个终端并运行“sudo -Es”,它将终端设置为以 root 身份运行并使用 Anaconda 作为我的默认解释器,但我最终遇到了握手错误:

[('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert unknown ca'), ('SSL routines', 'ssl3_read_bytes', 'ssl handshake failure')]

如果有人可以帮助我以这种方式解决它,这将是一个很好的临时修复,但我仍然需要能够在没有 sudo 的情况下运行它。

谢谢,提前。

【问题讨论】:

  • 谁拥有 .pem 文件?
  • 能否将文件~/path/to/pem/file.pem的所有者更改为运行脚本的用户?
  • 根拥有该文件。我只是尝试使用“sudo chown username file.pem”将所有者更改为我自己。仍然出现握手错误。
  • 尝试 chmod 400 ~/path/to/pem/file.pem
  • @DmgCtrl-b.net:以脚本用户身份执行cat path/to/pem/file.pem。如果由于缺少权限而失败,则文件本身不可读或上面的任何目录都不可执行。这意味着仅对文件进行权限或所有权更改可能是不够的,但您必须更改文件所在的目录、该目录所在的目录等。

标签: python linux ubuntu ssl python-requests


【解决方案1】:

用户名需要能够读取文件。您可以通过运行ls path_to_file.pem 进行验证。

如果您更改了文件的所有权,您可能仍然缺少对包含该文件的目录的可执行权限。

您可以通过 chmod -R +x ~/path/to_directory_containing_perm 解决这个问题

【讨论】:

  • 我使用该命令更改了文件的权限,但没有运气。仍然出现握手错误。
  • 所以,更改权限后异常现在有所不同。抱歉,我昨晚没有注意到这一点,但在我以 'sudo -Es' 运行后,它现在看起来像是异常:[('SSL routines', 'ssl3_read_bytes', 'tlsv1 alert unknown ca'), ('SSL routines', 'ssl3_read_bytes', 'ssl handshake failure')]
【解决方案2】:

好的,所以我设法解决了这个问题,我将发布我所做的事情,以防其他人遇到类似问题。

certs 和 pem 文件的权限设置为 600,所有权设置为 root,并执行 openssl 哈希函数,唯一的问题是证书放置在子目录中的位置。

虽然我将证书放入“etc/pki/tls/certs”,但它们实际上属于“etc/ssl/certs”。 .pem 文件也是如此,除了 .pem 将放置在受限制的文件夹“私人”中。将文件移动到正确的文件夹后。然后我可以将请求的验证参数设置为 cert_path 并且一切都像我需要的那样工作。

resp = self.session.post(rest_auth, data=body, cert=PEM_FILE, verify=cert_path)

'etc/pki/tls/certs' 是 Fedora 发行版 Linux 的目录。 'etc/ssl/certs' 是 Ubuntu 发行版的 Linux 目录。

我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2016-11-12
    • 2020-03-29
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多