首页 > 编程问答 >当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处理证书?

当我们创建一个在 https 服务器上获取和发送数据的 python 应用程序时,我们应该如何处理证书?

时间:2024-07-28 06:17:13浏览次数:12  
标签:python node.js server https urllib3

python 脚本使用 Urllib3,我的服务器是在 Node.js 上编写的脚本。 我担心(并且不清楚)证书:我是否需要将我的 python 应用程序上的证书另存为变量?

例如我这样做了,

http = urllib3.PoolManager(
    cert_reqs="CERT_REQUIRED",
    ca_certs='client-cert.pem')

并且我不知道这是否是正确的方法,就像它是安全的方法一样,或者如果黑客拿到了证书也没关系?

我成功地用 Node.js 设置了 python 应用程序,正如我所解释的那样,我期待黑客无法获取应用程序和服务器发送和接收的数据。


以下是处理 Python 应用程序与 HTTPS 服务器进行通信的证书时的一些注意事项,重点关注安全性:

1. 不要将证书硬编码到你的应用程序中。

  • 安全性风险: 将证书硬编码到你的脚本中会带来巨大的安全风险。任何访问你代码的人都可以提取证书,这会危及你的服务器和客户端之间的通信。
  • 解决方案:
    • 使用受信任的证书颁发机构 (CA): 让你的服务器使用 Let's Encrypt 等知名 CA 签发的证书。这使你的 Python 应用程序可以自动验证服务器证书,而无需任何嵌入式证书。
    • 如果使用自签名证书:
      • 安全存储: 将证书存储在应用程序环境之外的安全位置(例如,环境变量、密钥库)。
      • 在代码中加载路径: 在你的代码中引用证书的路径,而不是证书本身。

2. 正确验证证书。

  • 重要性: 证书验证可确保你的 Python 应用程序正在与预期服务器通信,而不是恶意服务器。
  • urllib3 中的默认值: 默认情况下, urllib3 不会自动验证证书。这是 不安全的
  • 启用验证: 始终使用 cert_reqs='CERT_REQUIRED' cert_reqs='CERT_NONE' 来启用验证。
  • 受信任的 CA 包: 确保你的系统具有最新的受信任根 CA 证书包。这允许 urllib3 验证服务器证书链。

3. 安全处理证书存储。

  • 避免直接嵌入: 正如前面提到的,不要将证书直接嵌入到你的代码中。
  • 环境变量: 一种选择是将证书路径存储为环境变量。
  • 密钥库: 对于更强大的解决方案,请考虑使用 HashiCorp Vault 或 AWS Secrets Manager 等密钥库。

改进后的代码示例(使用环境变量):

import os
import urllib3

# 从环境变量加载证书路径(不要硬编码)
CERT_PATH = os.environ.get("CLIENT_CERT_PATH") 

http = urllib3.PoolManager(
    cert_reqs="CERT_REQUIRED",  # 始终启用验证
    ca_certs=CERT_PATH          # 从安全位置加载证书路径
)

其他安全最佳实践:

  • 保持你的库更新: 定期更新 urllib3 和你的 Python 环境,以包含最新的安全补丁。
  • 最低权限原则: 你的 Python 应用程序应仅具有访问其所需资源的权限。
  • 安全编码实践: 遵循安全编码实践,以防止 SQL 注入和跨站点脚本 (XSS) 等漏洞。

请记住,安全性是一个持续的过程。 通过实施强大的安全措施并及时了解最新的安全最佳实践,保护你的应用程序和数据至关重要。

标签:python,node.js,server,https,urllib3
From: 78802343

相关文章

  • 使用 Python 进行 Web 抓取以获取数据 NoneType ERROR
    我正在努力为我的学校项目获取美元和价格。所以我决定为此使用网络抓取,但我有一个问题。当我尝试在服务器上使用我的代码时,它给我NoneType错误。它可以在googlecolab上使用,但我无法在我的电脑或服务器上使用。我该如何解决这个问题?网页抓取代码;defdolar():he......
  • Python 请求 - response.json() 未按预期工作
    我正在尝试从Python的requests模块调用API。在邮递员上,返回的响应标头中的Content-Type是application/json;charset=utf-8,响应json数据是我期望的样子。但是,在python上的API的get方法之后运行response.json()会抛出错误simplejson.errors......
  • Python 中的“样板”代码?
    Google有一个Python教程,他们将样板代码描述为“不幸的”,并提供了以下示例:#!/usr/bin/python#importmodulesusedhere--sysisaverystandardoneimportsys#Gatherourcodeinamain()functiondefmain():print'Hellothere',sys.argv[1]#Command......
  • Python 3.9.1 中的 collections.abc.Callable 是否有 bug?
    Python3.9包含PEP585并弃用typing模块中的许多类型,转而支持collections.abc中的类型,现在它们支持__class_getitem__例如Callable就是这种情况。对我来说,typing.Callable和collections.abc.Ca......
  • 列表子类的 Python 类型
    我希望能够定义列表子类的内容必须是什么。该类如下所示。classA(list):def__init__(self):list.__init__(self)我想包含键入内容,以便发生以下情况。importtypingclassA(list:typing.List[str]):#Maybesomethinglikethisdef__init__(self):......
  • Python 中类型友好的委托
    考虑以下代码示例defsum(a:int,b:int):returna+bdefwrap(*args,**kwargs):#delegatetosumreturnsum(*args,**kwargs)该代码运行良好,只是类型提示丢失了。在Python中使用*args,**kwargs来实现​​委托模式是很常见的。如果有一种方法可......
  • 使用 python 支持构建自定义 vim 二进制文件
    背景Debian11vim软件包不包含python3支持。请参阅标题为“Debian11vim中不支持python-证据”的部分下面我需要vim支持python3YouCompleteMevim插件为了构建一个新的,我将vim9.0tarball下载到v......
  • 如何在Python 3.12+中正确使用泛型来提高代码质量?
    我正在尝试使用泛型来改进FastAPI应用程序中的类型注释。我有一个抽象存储库类,在其中使用泛型:fromabcimportABC,abstractmethodfromtypingimportListclassAbstractRepository[T](ABC):@abstractmethodasyncdefadd_one(self,data:dict)->T:......
  • python中的while循环不退出
    我试图完成第一年的python商业课程作业,但我的while循环无法退出,有人能帮忙吗?commisionTable=[{"admin_fee":100,"comm_rate":0.10},{"admin_fee":125,"comm_rate":0.12},{"admin_fee":150,"comm_rate":......
  • python---json文件写入
    ​ 使用到的知识点:os模块执行linux指令、json.dump()、withopenasf代码实现importsysimportosimportjson #向json文件file中添加内容data,其中data的类型为字典defwrite_json(file,data):    #如果文件存在,则删除    if(os.path.exists(fi......