首页 > 解决方案 > python3安全问题,os.system('wget...') vs urllib.request.urlopen(...)

问题描述

今天我在无头驱动的打印服务器(RaspPi / python3)中遇到了一个奇怪的行为。

我需要从 Web 服务器下载 PDF 或渲染的 python 脚本。到目前为止,我确实使用过:

src = "https://ssl.server.tld/path/to/file.pdf"
target = "/path/to/saved.pdf"

os.system("wget -O "+target+" "+src)

从现在开始,我使用:

with urllib.request.urlopen(src) as response, open(target, 'wb') as out_file:
    data = response.read()
    out_file.write(data)

问题是:几天后显然 SSL 证书已经过时了。该os.system()版本抛出一个非 Python 错误

https://ssl.***.de/config_page.py
Auflösen des Hostnamen »ssl.***.de (ssl.***s.de)«... 176.***.***.10
Verbindungsaufbau zu ssl.***.de (ssl.***.de)|176.***.***.10|:443... verbunden.
FEHLER: Dem Zertifikat von »ssl.***.de« wird nicht vertraut.
FEHLER: Das Zertifikat von »ssl.***.de« ist abgelaufen.

正如我所提到的,没有 python 错误或异常,正在下载我想要的文件,但大小为 0 字节。只有调试器在控制台输出中显示上面引用的文本。

urllib版本按需要运行,没有错误,没有控制台输出,并且文件正确。

我错过了什么?这是一种特殊的安全行为os.system()吗?

感谢您的回答。

标签: pythonpython-3.xsecurityurllibos.system

解决方案


如您所知,wget正在验证证书而urlopen不是。

如果要wget跳过检查证书,请添加参数--no-check-certificate


推荐阅读