aiohttp 和客户端 SSL 证书

2024-01-08

我最近搬离flask + requests onto aiohttp及其异步 http 客户端。

在我的场景中,我需要通过以下方式调用 APIHTTPS(使用自定义证书)并发送客户端证书。

对于第一部分(验证自定义证书),支持很明确文档中清楚地记录了 http://aiohttp.readthedocs.io/en/stable/client.html#ssl-control-for-tcp-sockets而且效果很好。

另一方面,对于第二部分,我似乎无法找到一种简单的方法来附加自定义 SSL 客户端证书来授权客户端。

你们知道该怎么做吗?非常感谢 !


EDIT: 我已经提交了PR https://github.com/aio-libs/aiohttp/pull/1849更新了有关该主题的 aiohttp 文档,并且它已被合并。

对于将来可能遇到此问题的任何人..

TL:DR

import ssl
import aiohttp    

ssl_ctx = ssl.create_default_context(cafile='/path_to_client_root_ca')
ssl_ctx.load_cert_chain('/path_to_client_public_key.pem', '/path_to_client_private_key.pem')

conn = aiohttp.TCPConnector(ssl_context=ssl_ctx)
session = aiohttp.ClientSession(connector=conn)

# session will now send client certificates..

长话短说 - 我已经了解了它是如何在请求中实现的(它整齐地记录了 APIhere http://docs.python-requests.org/en/master/user/advanced/#client-side-certificates),显然它是在内部实现的urllib3.

urllib3 滴下来cert参数一直到其HTTPS连接 https://github.com/shazow/urllib3/blob/master/urllib3/connection.py#L208对象,最终调用此函数:

...
self.sock = ssl_wrap_socket(
    sock=conn,
    keyfile=self.key_file,
    certfile=self.cert_file,
    ssl_context=self.ssl_context,
)
...

它的作用是:

...
if ca_certs or ca_cert_dir:
    try:
        context.load_verify_locations(ca_certs, ca_cert_dir)
    except IOError as e:  # Platform-specific: Python 2.6, 2.7, 3.2
        raise SSLError(e)
    # Py33 raises FileNotFoundError which subclasses OSError
    # These are not equivalent unless we check the errno attribute
    except OSError as e:  # Platform-specific: Python 3.3 and beyond
        if e.errno == errno.ENOENT:
            raise SSLError(e)
        raise
elif getattr(context, 'load_default_certs', None) is not None:
    # try to load OS default certs; works well on Windows (require Python3.4+)
    context.load_default_certs()

if certfile:
    context.load_cert_chain(certfile, keyfile)
if HAS_SNI:  # Platform-specific: OpenSSL with enabled SNI
    return context.wrap_socket(sock, server_hostname=server_hostname)
...

这里有趣的调用是load_cert_chain- 这意味着如果我们创建一个ssl.SSLContext(这是一个标准库接口)对象和调用load_cert_chain使用这样的客户端证书,aiohttp 的行为将与 requests\urllib3 相同。

因此,尽管 aiohttp 的文档没有告诉你这一点,但他们确实指定你可以加载自己的ssl.SSLContext.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

aiohttp 和客户端 SSL 证书 的相关文章

随机推荐

  • pandas 数据帧上的矢量化查找

    我有两个 DataFrame df1是一个表 我需要使用从 df2 中的多个列检索的索引 列对来提取值 我看到有一个函数get value当给定索引和列值时 它可以完美地工作 但是当尝试向量化此函数以创建新列时 我失败了 df1 pd Da
  • 如何将我的 Android 应用程序 Google 地图半径圆替换为如图所示的蓝色半透明圆?

    如何将我的 Android 应用程序 Google 地图半径圆替换为蓝色半透明圆 如图所示 还有带有蓝色圆的蓝色标记 我可以使圆圈具有特定的轮廓并填充 但它看起来并不像下图所示的那么好 我怎么做 到目前为止我的代码也在下面 Code pri
  • VS 2012 发布:找不到有效的 AspnetMergePath

    我刚刚安装了 Visual Studio 2012 的 Update 2 它引入了一个新的 发布 对话框 我试图让它做以前做的事情 在发布之前预编译网站 但我遇到了错误 Can t find the valid AspnetMergePat
  • Android M startActivity电池优化

    我正在开发一个应用程序 如果用户靠近某个地方 它应该提醒用户 当然 如果手机处于空闲状态 也必须这样做 现在有了 DOZE 我明白我必须将我的应用程序列入白名单 并且为了做到这一点 我看到我可以通过操作请求启动一个意图 这要归功于 Budd
  • 在 Selenium 中为 Chrome 驱动程序设置代理

    我正在使用 Selenium Webdriver 在 Chrome 浏览器中使用 C 进行自动化 我需要检查我的网页是否在某些地区 某些 IP 范围 被阻止 所以我必须在 Chrome 浏览器中设置代理 我尝试了下面的代码 正在设置代理 但
  • iOS UIActionSheet 从按钮上的长按手势呈现,错误地需要双击按钮才能关闭

    我有一个选项卡栏应用程序 在其中一个选项卡中我有一个 MKMapView 在此视图中 我的 viewDidLoad 正在初始化 UIButton 的长按手势识别器 当按下此按钮并帮助时 它会显示一个包含 5 个按钮 取消按钮的 UIActi
  • ReactJS 中使用箭头函数或 onClick 函数有什么区别?

    我在 ReactJS 中构建了一个简单的计数器应用程序 代码如下 import React useState from react import styles css export default function App const co
  • jQuery - 如何测试选择器是否匹配任何内容?

    假设我有以下内容 foo 我想知道该选择器是否匹配任何内容 我该如何测试这个 if foo length gt 0 do things 应该这样做
  • jQuery mobile - 对于每个实时点击事件都应该有一个等效的点击事件吗?

    我已将 jQuery 实时点击事件替换为 jQuery 移动点击事件以提高响应能力 出于兼容性原因 我感觉这是一个坏主意 是否有必要同时拥有这两个事件 有没有办法为同一个函数编写这两个事件 如 点击 点击 比利的答案非常完整 而且在我使用它
  • 为什么我的渐进式移动网络应用程序的初始屏幕和渲染内容之间存在白屏,有没有办法删除它?

    我已将移动网络应用程序安装到 Android 手机的主屏幕上 当我启动应用程序时 将显示初始屏幕 其中包含我的应用程序中定义的应用程序图标 名称和背景颜色 manifest json文件 启动画面消失后 白屏短暂闪烁 然后显示预期的 htm
  • Adobe AIR 和 iPhone - 工作原理如何?

    有人知道 Adob e AIR 应用程序如何转换为 iPhone 应用程序吗 我看到两种方法 要么 Adob e AIR 虚拟机必须成为每个应用程序的一部分 要么必须以某种方式将所有 ActionScript 调用转换为 Cocoa Tou
  • Google App Engine 代理[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在为 Google App Engine 寻找一个基本的开源 http 代理服务器 最好用Pyth
  • 在资产管道中加载订单 JavaScript 文件

    我正在使用 Rails 4 应用程序 我在 vendor assets javascripts 中安装了一些 JavaScript 插件文件 在 app assets javascripts 中安装了一些 JavaScript 插件文件 其
  • 禁用 Slick 网格中的特定单元格编辑

    有没有办法禁用单元格编辑 我们可以在列级别定义编辑器 但是我们可以为特定行禁用该编辑器吗 grid onBeforeEditCell subscribe function e args if isCellEditable args row
  • 在 Jersey 中解析 JSON

    我有一个 JSON 字符串 其中包含多个键值对和几个单个对象 如下所示 我正在使用 Jersey 编写一个资源类 它将读取此 JSON 并将其转换为 Java 对象 但我无法这样做 谁能帮我编写相应的Java对象以及如何解析JSON来填充这
  • 仅使用 SAS 令牌连接到 Azure 存储帐户?

    有没有办法仅使用 SAS 令牌和该存储帐户的端点连接到存储帐户或容器 我已经完成了演示 示例 它正在使用连接字符串 有效 但我不知道如何仅使用 SAS 连接到我的存储 有没有例子如何在java中做到这一点 我在门户上为我的特定 blob 生
  • 如何在 React-Native 中生成 HMAC?

    我需要使用私钥从字符串创建 HmacSHA256 我使用react native crypto js 但我不能使用它的HmacSHA256方法 它不断出现 未定义函数 错误 这是我的代码 const signature CryptoJS H
  • 如何更改 UITextView 中文本的颜色?

    如何更改 UITextView 中文本的颜色 yourTextView textColor UIColor redColor 在文档中查找 UITextView 会立即给出这一点
  • 如何使 VIM 成为一个成熟的 IDE [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何通过使用 YUI JQuery 和 git 集成等不同受支持的插件 使 VIM 成为一个成熟的 IDE http vim wiki
  • aiohttp 和客户端 SSL 证书

    我最近搬离flask requests onto aiohttp及其异步 http 客户端 在我的场景中 我需要通过以下方式调用 APIHTTPS 使用自定义证书 并发送客户端证书 对于第一部分 验证自定义证书 支持很明确文档中清楚地记录了