如何为Python打包的libcrypto和libssl启用FIPS模式?

2024-02-07

我有一个 python 应用程序,它与 Python 和 Libcrypto 以及 LibSSL 共享对象一起打包。该应用程序是使用 Openssl Fips Module 2.0 构建的。这些共享对象由 Python 的 request 模块和 urllib3 在底层使用来发出 TLS 请求。

我启用了OPENSSL_FIPS在我构建应用程序的环境中标记。现在,如果我想检查共享对象是否启用了 fips 模式,当我将它们从开发环境中取出并放入另一台机器时,我该怎么做?

如何检查 fips 模式是否启用?如果不是,我如何为这些共享对象启用 fips 模式?

可能有帮助的其他详细信息:

OpenSSL 版本:1.0.2h(从源代码构建)

Fips 模块:2.0.12(从源代码构建)

蟒蛇:3.6

操作系统:Ubuntu 16.04 LTS

如果需要任何其他详细信息,请告诉我。

Thanks!


我已经建立了OpenSSL-FIPS使用常规标志的模块(例如:no-asm, shared,一些古老的密码被禁用):

[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q049320993]> ~/sopr.sh
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###

[064bit-prompt]> ls ssl/build/bin ssl/build/lib
ssl/build/bin:
c_rehash  openssl

ssl/build/lib:
engines  libcrypto.a  libcrypto.so  libcrypto.so.1.0.0  libssl.a  libssl.so  libssl.so.1.0.0  pkgconfig

并开始玩弄它:

[064bit-prompt]> ssl/build/bin/openssl version
OpenSSL 1.0.2h-fips  3 May 2016 (Library: OpenSSL 1.0.2g  1 Mar 2016)

请注意“(库:OpenSSL 1.0.2g 2016 年 3 月 1 日)”部分。(存在)表明openssl可执行文件正常(预期版本),但它使用wrong 加密库(这是系统默认安装的 - 在/lib- 通常情况下,它不是用FIPS支持)。
必须加载our库,这是通过设置完成的LD_LIBRARY_PATH(同样的行为也可以通过在构建时设置环境变量来实现OpenSSL这将设定rpath in the openssl可执行文件,但我忘记了,而且我不想再次构建它):

[064bit-prompt]> LD_LIBRARY_PATH=ssl/build/lib ssl/build/bin/openssl version
OpenSSL 1.0.2h-fips  3 May 2016

现在,设置成功了,让我们深入了解一下OPENSSL_FIPS env var:

[064bit-prompt]> LD_LIBRARY_PATH=ssl/build/lib ssl/build/bin/openssl md5 ./code00.py
MD5(./code00.py)= 47fb26ec5d1ca16d3537fe7fd12ea529
[064bit-prompt]> LD_LIBRARY_PATH=ssl/build/lib ssl/build/bin/openssl sha1 ./code00.py
SHA1(./code00.py)= 5188a221ba61309e78e70004285bc6fd148701b6
[064bit-prompt]> OPENSSL_FIPS=1 LD_LIBRARY_PATH=ssl/build/lib ssl/build/bin/openssl sha1 ./code00.py
SHA1(./code00.py)= 5188a221ba61309e78e70004285bc6fd148701b6
[064bit-prompt]> OPENSSL_FIPS=1 LD_LIBRARY_PATH=ssl/build/lib ssl/build/bin/openssl md5 ./code00.py
Error setting digest md5
139778679649944:error:060A80A3:digital envelope routines:FIPS_DIGESTINIT:disabled for fips:fips_md.c:180:

从上面可以看出,md5哈希行为受以下因素影响OPENSSL_FIPS env var (when FIPS模式已打开,不允许使用)。

Notes:

  • 最有可能的是,较新的OpenSSL-FIPS版本还将有sha1禁用,因为它被认为是弱的,所以不变量应该切换到其中之一sha2哈希函数系列(例如sha256)或者甚至更好,sha3 (older OpenSSL版本可能没有它)

  • From my PoV这有点太严格了,因为在某些情况下,可能需要哈希算法来实现不关心安全性的目的,并且仍然必须使用更复杂(并且也耗时)的允许算法

Since OPENSSL_FIPS env var处理于openssl可执行级别,这将被绕过(如加密库会直接使用),对于目前的情况来说没有用,所以我们必须深入。这些是控制的函数FIPS模式在一个loaded 加密库实例:

  • [OpenSSL.Wiki]:FIPS 模式() https://wiki.openssl.org/index.php/FIPS_mode()

  • [OpenSSL.Wiki]:FIPS 模式设置() https://wiki.openssl.org/index.php/FIPS_mode_set()

它们将用于读/写FIPS模式。为了测试是否FIPS模式确实已设置,md5将使用哈希(来自上面的示例)。

代码00.py:

#!/usr/bin/env python


import ctypes as cts
import ssl
import sys


libcrypto = cts.CDLL("libcrypto.so.1.0.0")

#ssleay = libcrypto.SSLeay
#ssleay.argtypes = ()
#ssleay.restype = cts.c_ulong

fips_mode = libcrypto.FIPS_mode
fips_mode.argtypes = ()
fips_mode.restype = cts.c_int

fips_mode_set = libcrypto.FIPS_mode_set
fips_mode_set.argtypes = (cts.c_int,)
fips_mode_set.restype = cts.c_int


def main(*argv):
    text = b""

    print("OPENSSL_VERSION: {:s}".format(ssl.OPENSSL_VERSION))
    enable_fips = len(sys.argv) > 1

    print("FIPS_mode(): {:d}".format(fips_mode()))
    if enable_fips:
        print("FIPS_mode_set(1): {:d}".format(fips_mode_set(1)))
    print("FIPS_mode(): {:d}".format(fips_mode()))
    #print("SSLeay: {:X}".format(ssleay()))

    import hashlib
    print("SHA1: {:s}".format(hashlib.sha1(text).hexdigest()))
    print("MD5: {:s}".format(hashlib.md5(text).hexdigest()))


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.")
    sys.exit(rc)

Notes:

  • Set argtypes and restype对于 2 个函数。查看[SO]:通过 ctypes 从 Python 调用的 C 函数返回不正确的值(@CristiFati 的答案) https://stackoverflow.com/a/58611011/4788546更多细节

  • The md5哈希算法位于Python水平由[Python.Docs]:hashlib - 安全哈希和消息摘要 https://docs.python.org/library/hashlib.html#module-hashlib

  • 重要的: the import hashlib语句位于after设置FIPS模式(而不是在文件开头,因为它应该是),因为hashlib做一些缓存在导入时,所以它捕获了FIPS导入时的值,不关心之后是否改变

Output:

[064bit-prompt]> LD_LIBRARY_PATH=ssl/build/lib ./code00.py
Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] 064bit on linux

OPENSSL_VERSION: OpenSSL 1.0.2h-fips  3 May 2016
FIPS_mode(): 0
FIPS_mode(): 0
SHA1: da39a3ee5e6b4b0d3255bfef95601890afd80709
MD5: d41d8cd98f00b204e9800998ecf8427e

Done.
[064bit-prompt]> LD_LIBRARY_PATH=ssl/build/lib ./code00.py 1
Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] 064bit on linux

OPENSSL_VERSION: OpenSSL 1.0.2h-fips  3 May 2016
FIPS_mode(): 0
FIPS_mode_set(1): 1
FIPS_mode(): 1
SHA1: da39a3ee5e6b4b0d3255bfef95601890afd80709
fips_md.c(149): OpenSSL internal error, assertion failed: Digest Final previous FIPS forbidden algorithm error ignored
Aborted (core dumped)

如图所示,设置FIPS模式通过CTypes, really设置它。
我不知道为什么SegFaults,但是md5相关代码仅用于测试目的,因此在生产中不需要它。

我记得在一些Nix版本(可能是RH基于),FIPS还可以通过编辑某些条目(在系统全局范围内)来设置模式/proc?),但我不记得了。

A more elegant approach would be to expose Python wrappers for the 2 functions.
Check [Python.Bugs]: FIPS_mode() and FIPS_mode_set() functions in Python (ssl) https://bugs.python.org/issue27592, I've also submitted a patch for Python 3.4 (where they were exposed by the ssl module), but it was rejected based on the following arguments (out of which the 1st 2 are relevant):

  1. FIPS是一个糟糕的标准

  2. OpenSSL将放弃对其的支持

  3. 它打破了普遍性

您可以将其应用到Python 3.6(我认为这不会起作用OOTB,因为行号很可能发生变化),并且(显然)你必须构建Python从来源。

底线:

  • 有一个big之间的区别FIPS working and FIPS已验证,我确信您已经阅读过[OpenSSL]:OpenSSL FIPS 对象模块 v2.0 用户指南 https://www.openssl.org/docs/fips/UserGuide-2.0.pdf

  • [AskUbuntu]:在 ubuntu 中启用 FIPS 140-2 https://askubuntu.com/q/903127/452474可能还包含一些有用的信息

一些可能有用的参考文献(尽管最后的参考文献可能有点太“深”):

  • [SO]:如何使用 SSL 在 RHEL 上编译 python3? SSL无法导入(@CristiFati的回答) https://stackoverflow.com/a/69670925/4788546

  • [SO]:如何在Python 3.6的ssl模块中实现FIPS_mode()和FIPS_mode_set()? (@CristiFati 的回答) https://stackoverflow.com/a/49494549/4788546

  • [SO]:OpenSSL FIPS_mode_set 无法在 Python 加密库中工作(@CristiFati 的回答) https://stackoverflow.com/a/58311407/4788546

  • [SO]:OpenSSL 3.0.8:FIPS 功能无法与自定义路径中的 libcrypto 库一起使用(@CristiFati 的回答) https://stackoverflow.com/a/75917800/4788546



Update #0

你所遇到的行为让我震惊[SO]:无法使用 Python ctypes 调用 libcrypto.so 的 FIPS_mode_set() [重复] https://stackoverflow.com/q/49381134/4788546也可能与wrong 加密库正在加载(检查openssl version测试有/无LD_LIBRARY_PATH从一开始就)。
A non FIPS有能力的OpenSSL仍然会导出这 2 个函数,但它们都只是返回 0。

[064bit-prompt]> ./code00.py 1
Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] 064bit on linux

OPENSSL_VERSION: OpenSSL 1.0.2g  1 Mar 2016
FIPS_mode(): 0
FIPS_mode_set(1): 0
FIPS_mode(): 0
SHA1: da39a3ee5e6b4b0d3255bfef95601890afd80709
MD5: d41d8cd98f00b204e9800998ecf8427e

Done.

所以,请确保通过指定加载正确的库LD_LIBRARY_PATH! (还有其他方法,但这是最直接的方法)。

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

如何为Python打包的libcrypto和libssl启用FIPS模式? 的相关文章

  • 使用python查找txt文件中字母出现的次数

    我需要从 txt 文件中读取该字母并打印 txt 文件中出现的次数 到目前为止 我已经能够在一行中打印内容 但计数有问题 有人可以指导吗 infile open grades txt content infile read for char
  • 按边距(“全部”)值列对 Pandas 数据透视表进行排序

    我试图根据 pandas 数据透视表中的行总和对最后一列 边距 aggrfunc 进行降序排序 我知道我在这里错过了一些简单的东西 但我无法弄清楚 数据框 数据透视表 WIDGETS DATE 2 1 16 2 2 16 2 3 16 Al
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • Series.sort() 和 Series.order() 有什么区别?

    s pd Series nr randint 0 10 5 index nr randint 0 10 5 s Output 1 3 7 6 2 0 9 7 1 6 order 按值排序并返回一个新系列 s order Output 2 0
  • 尝试在 Anaconda 上安装 pygame 时,Python 3.x 降级为 Python 2.7

    我正在使用 Anaconda Python 3 我正在尝试安装 pyOpenGL Vpython 和 pygame 安装 pyOpenGL 和 Vpython 就可以使用conda install 当我尝试安装 Pygame 时 使用con
  • Python Tkinter 模块不显示输出

    我正在尝试学习 Python 并尝试使用 Python 中的 GUI 并遇到了这个 Tkinter 模块 我的代码运行 但运行时窗口没有出现 我的代码如下 from Tkinter import to create a root windo
  • 如何使用 openSSL 函数验证 PEM 证书的密钥长度

    如何验证以这种方式生成的 PEM 证书的密钥长度 openssl genrsa des3 out server key 1024 openssl req new key server key out server csr cp server
  • Python将文本文件解析为嵌套字典

    考虑以下数据结构 HEADER1 key value key value HEADER2 key value key value HEADER3 key value HEADER4 key value key value 原始数据中没有缩进
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • python中basestring和types.StringType之间的区别?

    有什么区别 isinstance foo types StringType and isinstance foo basestring 对于Python2 basestring是两者的基类str and unicode while type
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 如何指示 urwid 列表框的项目数多于当前显示的项目数?

    有没有办法向用户显示 urwid 列表框在显示部分上方 下方有其他项目 我正在考虑类似滚动条的东西 它可以显示条目的数量 或者列表框顶部 底部的单独栏 如果这个行为无法实现 有哪些方法可以实现这个通知 在我的研究过程中 我发现这个问题 ht
  • 检测是否从psycopg2游标获取?

    假设我执行以下命令 insert into hello username values me 我跑起来就像 cursor fetchall 我收到以下错误 psycopg2 ProgrammingError no results to fe
  • 为什么python+sqlite3特别慢?

    我尝试使用 Python 2 7 4 sqlite3 和 Firefox SQLite Manager 0 8 0 处理对同一数据库的相同请求 在小型数据库 8000 条记录 上 Python 和 Firefox 都运行得很快并且给出了相同
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar

随机推荐