OpenSSL FIPS_mode_set 在 Python 加密库中不起作用

tri*_*nth 5 c python openssl compilation fips

根据 Python 加密库的文档 [1],可以使用静态链接的 OpenSSL 构建自定义加密轮。我尝试使用使用 FIPS 对象模块构建的 OpenSSL 安装来执行此操作,并且能够成功构建轮子,但发现它没有 FIPS 功能(无法设置 FIPS_mode_set=1)。

我创建了一个可以重现相同结果的 Dockerfile。最后的 Python 代码应该显示“1”和“OpenSSL 1.0.2t-fips 10 Sep 2019”,但却显示“0”和“OpenSSL 1.0.2t 10 Sep 2019”(无-fips指定)。

令我困惑的是,当我调用openssl version我构建的 CLI 时,它正确地显示了带有后缀的版本-fips。因为,我猜测我在构建密码学的过程中犯了错误。

感谢这里的任何帮助!

FROM centos

# Install build dependencies
RUN yum groupinstall -y  "Development Tools" && \
    yum install -y python-devel libffi-devel

# Install Python dependencies
RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
    python get-pip.py && \
    pip install virtualenv setuptools wheel pip

# Build Fips object module
RUN curl -O https://www.openssl.org/source/openssl-fips-2.0.16.tar.gz && \
    tar xvf openssl-fips-2.0.16.tar.gz && \
    cd openssl-fips-2.0.16 && \
    ./config && \
    make && \
    make install

# Build OpenSSL
RUN curl -O https://www.openssl.org/source/openssl-1.0.2t.tar.gz && \
    tar xvf openssl-1.0.2t.tar.gz && \
    cd /openssl-1.0.2t && \
    ./config fips no-shared -fPIC --prefix=/openssl-1.0.2t/openssl && \
    make depend && \
    make && \
    make install_sw

# Build cryptography
RUN CFLAGS="-I/openssl-1.0.2t/openssl/include" LDFLAGS="-L/openssl-1.0.2t/openssl/lib" pip wheel --no-cache --no-binary :all: cryptography && \
    pip install cryptography*.whl

# Test if fips is enabled
RUN python -c "\
from cryptography.hazmat.backends.openssl.backend import backend;\
print backend._lib.FIPS_mode_set(1);\
print ''.join([backend._lib.OPENSSL_VERSION_TEXT[i] for i in range(30)])"
Run Code Online (Sandbox Code Playgroud)

[1] https://cryptography.io/en/latest/installation/#static-wheels

编辑:通过添加-DOPENSSL_FIPS到加密构建中,我能够使输出变为,OPENSSL_VERSION_TEXTOpenSSL 1.0.2t-fips 10 Sep 20FIPS_mode_set(1) 的输出仍然为 0。

编辑2:使用ERR_get_error()显示以下内容:

>>> print backend._lib.FIPS_mode_set(1)
0
>>> print backend._lib.ERR_get_error()
755413103
Run Code Online (Sandbox Code Playgroud)

当我将其插入时,openssl errstr我得到:

openssl errstr 755413103
error:755413103:lib(85):func(1043):reason(259)
Run Code Online (Sandbox Code Playgroud)

根据一些 Google 搜索,这表明指纹不匹配 ( FIPS_R_FINGERPRINT_DOES_NOT_MATCH)。但不知道从这里去哪里。

Cri*_*ati 4

1. 概述

\n

首先,我想提一下,虽然我理解原因,但我并不完全同意Cryptography的愿景([Cryptography]:安装 - 静态轮子)。共享库已经存在了几十年,并且已经证明了它们的优越性。更不用说Python附带了2 个(标准)模块(_ssl_hashlib),它们动态链接到OpenSSL(无论系统上有什么)。顺便说一句,在Win上,2 个Python模块也用于静态链接到OpenSSL ,但从v 3.7开始,它们不再这样做。回到Nix:2 个OpenSSL版本被加载到同一个 ( Python ) 进程中。这看起来并没有什么坏处,但看起来很有趣。正如今天的情况(191009),有一堆v2.7v3.4.whl,但没有一个相当不错的(Python)环境:

\n

图像0

\n

我记得前段时间有过类似的情况:除了2个标准模块之外,还使用了M2Crypto 。在这种情况下(我们完全发布了Python),2 个特定的(支持FIPS的)OpenSSL动态也被发布了,并且所有的Python模块都链接到了它们。它适用于各种(桌面)环境(其中有许多“异国情调”的环境):

\n
    \n
  • CPU架构 ( LE / BE ):x86AMD64IA64SPARCPPCzSeries
  • \n
  • 操作系统(有多个版本):WinLnxRHCentOSOELSuSEXenUbuntu)、SolarisAIXHP-UX(作为个人练习,我添加了OSX
  • \n
\n

[OpenSSL]:UserGuide-2.0.pdf - OpenSSL FIPS 对象模块 v2.0 用户指南(在URL更改时参考[OpenSSL]:FIPS-140)包含所需的所有详细信息。

\n

在进一步讨论之前,我将在整篇文章中使用以下一些术语:

\n
    \n
  • FOM - FIPS对象模块 ( fipscanister.o )

    \n
  • \n
  • FOME - FOM链接到的可执行文件(ELFWin上的PE))。请记住,它本身可以是可执行文件,也可以是.so ( .dll )。另外,如果它包含在静态库(.a)中,则它不会被链接(只是存档)。附带说明一下,当OpenSSL构建为共享时,FOMElibcrypto.so.*,而当静态构建时(如本例),它是与libcrypto.a链接的可执行文件(例如openssl可执行文件)

    \n
  • \n
\n

FOM位于OpenSSL(可能还有其他此类加密提供商,如LibreSSLWolfSSL等)之上,它旨在通过限制某些原本可用的功能来增强安全性(根据NIST标准)。一个这样的功能示例是md5哈希的使用,它被认为是弱的(我非常确定sha1也会在即将发布的下一个版本中遵循)。
这是(运行时)发生的情况的(非常简化的)版本:

\n
    \n
  1. FIPS模式开启:

    \n
      \n
    1. 检查是否满足附加约束:

      \n
        \n
      1. 是:继续(使用默认功能)

        \n
      2. \n
      3. 否:返回错误

        \n
      4. \n
      \n
    2. \n
    \n
  2. \n
  3. FIPS模式关闭:

    \n
      \n
    1. 回退到默认功能
    2. \n
    \n
  4. \n
\n

#1.1的一部分是自检。这包括:

\n
    \n
  • 计算FOME签名

    \n
  • \n
  • 将其与值(也存储在FOME中)进行比较

    \n
  • \n
\n

这恰好可以确保(或大大减少机会)没有人篡改(手动修改、反汇编……)FOME。为了更好地理解签名机制,让我们深入了解FOME构建过程:

\n
    \n
  1. 所有FOME源 + FOM都被编译(到目标文件中)

    \n
  2. \n
  3. 它们链接在一起(进入FOME)。这是正常构建结束的时间

    \n
  4. \n
  5. 正在计算FOME签名

    \n
      \n
    1. 来自 #1 的物品+ fips_premain.o被链接到(真实的,不是.dll)可执行文件(FPD

      \n
    2. \n
    3. FPD是针对FOME调用的(#1.)。它读取FOME.rodata部分并计算其sha1哈希值。请注意,它忽略位于特定地址的41字节区域(打孔)

      \n
    4. \n
    \n
  6. \n
  7. #3.1. 重复,但这次fips_premain.o被重新编译以包含上一步中的哈希值。现在很清楚上一步中的打孔,它是签名所在的位置:(sha哈希值的长度 ( 40 ) + nul)。这是最终的FOME

    \n
  8. \n
\n

注意:在Win上,情况略有不同。

\n

我已经成功重现了该问题。我将从测试脚本开始。

\n

代码00.py

\n
#!/usr/bin/env python\n\nimport sys\n\nimport cffi\n\nfrom cryptography.hazmat.backends.openssl.backend import backend\n\n\ndef main(*argv):\n    ffi = cffi.FFI()\n    lib = backend._lib\n    fmt = "OpenSSL version: {0:s}\\nFIPS_mode(): {1:d}\\nFIPS_mode_set(1): {2:d}\\nFIPS_mode(): {3:d}"\n    print(fmt.format(ffi.string(\n        lib.OPENSSL_VERSION_TEXT).decode(),\n        lib.FIPS_mode(),lib.FIPS_mode_set(1), lib.FIPS_mode()\n    ))\n    err = lib.ERR_get_error()\n    if err:\n        err_fmt = "error:[{0:d}]:[{1:s}]:[{2:s}]:[{3:s}]"\n        print(err_fmt.format(\n            err,\n            ffi.string(lib.ERR_lib_error_string(err)).decode(),\n            ffi.string(lib.ERR_func_error_string(err)).decode(),\n            ffi.string(lib.ERR_reason_error_string(err)).decode()\n        ))\n    else:\n        print("Success !!!")\n\n\nif __name__ == "__main__":\n    print("Python {:s} {:03d}bit on {:s}\\n".format(" ".join(elem.strip() for elem in sys.version.split("\\n")),\n                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))\n    rc = main(*sys.argv[1:])\n    print("\\nDone.")\n    sys.exit(rc)\n
Run Code Online (Sandbox Code Playgroud)\n

2. 设置

\n

我已经构建了FOM和支持FIPS的OpenSSL(与您的类似,但我自定义了它们的路径)。构建FOMOpenSSL时使用了${FIPSDIR}变量。

\n\n
\n
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q058228435]> ~/sopr.sh\n*** Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ***\n\n[064bit-prompt]> uname -a\nLinux cfati-ubtu16x64-0 4.15.0-65-generic #74~16.04.1-Ubuntu SMP Wed Sep 18 09:51:44 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux\n[064bit-prompt]> cat /etc/lsb-release | grep DESCR\nDISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"\n[064bit-prompt]> gcc --version | grep gcc\ngcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609\n[064bit-prompt]>\n[064bit-prompt]> echo ${FIPSDIR}\n/home/cfati/Work/Dev/Tools/zzz_Build/OpenSSL/int/openssl-fips-2.0.16\n[064bit-prompt]> tree ${FIPSDIR}\n/home/cfati/Work/Dev/Tools/zzz_Build/OpenSSL/int/openssl-fips-2.0.16\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fipsld\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 fips_standalone_sha1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 openssl\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 aes.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bn.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 buffer.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cmac.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 crypto.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 des.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 des_old.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dh.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dsa.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ebcdic.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ecdh.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ecdsa.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ec.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 e_os2.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 evp.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fips.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fips_rand.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fipssyms.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hmac.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 modes.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 opensslconf.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 opensslv.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ossl_typ.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 rsa.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sha.h\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 symhacks.h\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 lib\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fipscanister.o\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fipscanister.o.sha1\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 fips_premain.c\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 fips_premain.c.sha1\n\n4 directories, 32 files\n[064bit-prompt]>\n[064bit-prompt]> echo ${OPENSSL_DIR}\n/home/cfati/Work/Dev/Tools/openssl-1.0.2t-fips-2.0.16-static\n[064bit-prompt]> tree ${OPENSSL_DIR}/bin ${OPENSSL_DIR}/lib\n/home/cfati/Work/Dev/Tools/openssl-1.0.2t-fips-2.0.16-static/bin\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 c_rehash\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 openssl\n/home/cfati/Work/Dev/Tools/openssl-1.0.2t-fips-2.0.16-static/lib\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 engines\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libcrypto.a\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libssl.a\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pkgconfig\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libcrypto.pc\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 libssl.pc\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 openssl.pc\n\n2 directories, 7 files\n[064bit-prompt]>\n[064bit-prompt]> ldd ${OPENSSL_DIR}/bin/openssl\n    linux-vdso.so.1 =>  (0x00007ffeec045000)\n    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f12c19c2000)\n    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f12c15f8000)\n    /lib64/ld-linux-x86-64.so.2 (0x00007f12c1bc6000)\n[064bit-prompt]>\n[064bit-prompt]> ${OPENSSL_DIR}/bin/openssl version\nOpenSSL 1.0.2t-fips  10 Sep 2019\n[064bit-prompt]> ${OPENSSL_DIR}/bin/openssl sha1 ./code00.py\nSHA1(./code00.py)= ff122260b025103dbc03316e3d3e26cd683e7a12\n[064bit-prompt]> ${OPENSSL_DIR}/bin/openssl md5 ./code00.py\nMD5(./code00.py)= eac85e46734260c1bfcceb89d6a3bd32\n[064bit-prompt]> OPENSSL_FIPS=1 ${OPENSSL_DIR}/bin/openssl sha1 ./code00.py\nSHA1(./code00.py)= ff122260b025103dbc03316e3d3e26cd683e7a12\n[064bit-prompt]> OPENSSL_FIPS=1 ${OPENSSL_DIR}/bin/openssl md5 ./code00.py\nError setting digest md5\n140584610875032:error:060A80A3:digital envelope routines:FIPS_DIGESTINIT:disabled for fips:fips_md.c:180:\n
Run Code Online (Sandbox Code Playgroud)\n
\n

3.密码模块

\n
\n
[064bit-prompt]> ls\ncode00.py  cryptography-2.7.tar.gz\n[064bit-prompt]> mkdir build\n[064bit-prompt]> cd build\n[064bit-prompt]>\n[064bit-prompt]> CFLAGS="-I${OPENSSL_DIR}/include -DOPENSSL_FIPS=1" LDFLAGS="-L${OPENSSL_DIR}/lib" python3 -m pip wheel --no-cache --no-binary :all: ../cryptography-2.7.tar.gz\nProcessing /home/cfati/Work/Dev/StackOverflow/q058228435/cryptography-2.7.tar.gz\n  Installing build dependencies ... done\n  Getting requirements to build wheel ... done\n    Preparing wheel metadata ... done\nCollecting asn1crypto>=0.21.0 (from cryptography==2.7)\n  Downloading https://files.pythonhosted.org/packages/d1/e2/c518f2bc5805668803ebf0659628b0e9d77ca981308c7e9e5564b30b8337/asn1crypto-1.0.1.tar.gz (115kB)\n     |\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 122kB 801kB/s\nCollecting cffi!=1.11.3,>=1.8 (from cryptography==2.7)\n  Downloading https://files.pythonhosted.org/packages/93/1a/ab8c62b5838722f29f3daffcc8d4bd61844aa9b5f437341cc890ceee483b/cffi-1.12.3.tar.gz (456kB)\n     |\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 460kB 1.8MB/s\nCollecting six>=1.4.1 (from cryptography==2.7)\n  Downloading https://files.pythonhosted.org/packages/dd/bf/4138e7bfb757de47d1f4b6994648ec67a51efe58fa907c1e11e350cddfca/six-1.12.0.tar.gz\nCollecting pycparser (from cffi!=1.11.3,>=1.8->cryptography==2.7)\n  Downloading https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz (158kB)\n     |\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88\xe2\x96\x88| 163kB 4.5MB/s\nBuilding wheels for collected packages: cryptography, asn1crypto, cffi, six, pycparser\n  Building wheel for cryptography (PEP 517) ... done\n  Stored in directory: /home/cfati/Work/Dev/StackOverflow/q058228435/build\n  Building wheel for asn1crypto (setup.py) ... done\n  Stored in directory: /home/cfati/Work/Dev/StackOverflow/q058228435/build\n  Building wheel for cffi (setup.py) ... done\n  Stored in directory: /home/cfati/Work/Dev/StackOverflow/q058228435/build\n  Building wheel for six (setup.py) ... done\n  Stored in directory: /home/cfati/Work/Dev/StackOverflow/q058228435/build\n  Building wheel for pycparser (setup.py) ... done\n  Stored in directory: /home/cfati/Work/Dev/StackOverflow/q058228435/build\nSuccessfully built cryptography asn1crypto cffi six pycparser\nWARNING: You are using pip version 19.1.1, however version 19.2.3 is available.\nYou should consider upgrading via the \'pip install --upgrade pip\' command.\n[064bit-prompt]>\n[064bit-prompt]> ls\nasn1crypto-1.0.1-py3-none-any.whl        cryptography-2.7-cp35-cp35m-linux_x86_64.whl  six-1.12.0-py2.py3-none-any.whl\ncffi-1.12.3-cp35-cp35m-linux_x86_64.whl  pycparser-2.19-py2.py3-none-any.whl\n[064bit-prompt]>\n[064bit-prompt]> for f in $(ls *.whl); do unzip ${f} > /dev/null; done\n[064bit-prompt]> ls\nasn1crypto                         cffi-1.12.3-cp35-cp35m-linux_x86_64.whl        cryptography-2.7-cp35-cp35m-linux_x86_64.whl  pycparser-2.19-py2.py3-none-any.whl\nasn1crypto-1.0.1.dist-info         cffi-1.12.3.dist-info                          cryptography-2.7.dist-info                    six-1.12.0.dist-info\nasn1crypto-1.0.1-py3-none-any.whl  _cffi_backend.cpython-35m-x86_64-linux-gnu.so  pycparser                                     six-1.12.0-py2.py3-none-any.whl\ncffi                               cryptography                                   pycparser-2.19.dist-info                      six.py\n[064bit-prompt]> PYTHONPATH=.:${PYTHONPATH} python3 ../code00.py\nPython 3.5.2 (default, Jul 10 2019, 11:58:48) [GCC 5.4.0 20160609] 64bit on linux\n\nOpenSSL version: OpenSSL 1.0.2t-fips  10 Sep 2019\nFIPS_mode(): 0\nFIPS_mode_set(1): 0\nFIPS_mode(): 0\nerror:[755413103]:[FIPS routines]:[FIPS_check_incore_fingerprint]:[fingerprint does not match]\n\nDone.\n
Run Code Online (Sandbox Code Playgroud)\n
\n

正如你所看到的,我和你差不多。

\n

4. 更深入的研究

\n

经过长时间(有些人可能认为很痛苦)的调试、试验……,我得出了一个结论。考虑到:

\n
    \n
  • 篡改FOM中的任何内容(${FIPSDIR}的内容),将不会有资格获得FIPS验证。坦率地说,这也没有,因为有具体的说明,在构建FOM时,只有系统管理员应该将工件复制到安全位置....,bla,bla,bla。这对我来说似乎偏执,但这些都是事实。顺便说一句,早在 2013 年,当我们第一次接触FIPS(可能是为了防止任何可能的攻击(例如MITM)),FOMCD从美国运送到ROU :)))
  • \n
  • 默认Python版本是静态构建的(再次:)),这意味着${PYTHONCORE}Python解释器)驻留在python可执行文件中,而不是位于可以链接到的.so ( libpython*.so* ) 中(并且蟒蛇在共享构建的情况下执行)
  • \n
  • 密码学_openssl扩展模块(_openssl.abi*.so )需要来自${PYTHONCORE}的符号(例如PyLong_FromLong),但是没关系,因为目前它将被加载到(Python)进程中(从前面提到的可执行文件),它会找到它们(这是Nix上的常见做法
  • \n
  • 构建步骤#3.2。:可执行文件(FPD - 必须运行)找不到符号,因此失败
  • \n
\n

这是一个僵局(无论一个约束留下的房间,都会被其他房间关闭),所以它根本无法完成!(至少,目前)。时期!!!X(

\n

5.替代方案

\n

我打算建议这是一个优雅的替代方案(包括OpenSSL .so s(任何(.so)客户端的rpath设置为“there”)在.whl中,位于_openssl.abi3.so旁边链接到它们) ,但显然这是唯一的方法(至少我找到了)。

\n

第一步是构建共享OpenSSL版本(FOME将为libcrypto.so.*

\n
\n
[064bit-prompt]> ls\ncode00.py  cryptography-2.7.tar.gz\n[064bit-prompt]> export OPENSSL_DIR=/home/cfati/Work/Dev/Tools/openssl-1.0.2t-fips-2.0.16\n[064bit-prompt]> ldd ${OPENSSL_DIR}/bin/openssl\n        linux-vdso.so.1 =>  (0x00007ffe62faf000)\n        libssl.so.1.0.0 => /home/cfati/Work/Dev/Tools/openssl-1.0.2t-fips-2.0.16/lib/libssl.so.1.0.0 (0x00007fe33c06f000)\n        libcrypto.so.1.0.0 => /home/cfati/Work/Dev/Tools/openssl-1.0.2t-fips-2.0.16/lib/libcrypto.so.1.0.0 (0x00007fe33bb92000)\n        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe33b7c8000)\n        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe33b5c4000)\n        /lib64/ld-linux-x86-64.so.2 (0x00007fe33c2e3000)\n[064bit-prompt]>\n[064bit-prompt]> ${OPENSSL_DIR}/bin/openssl version\nOpenSSL 1.0.2t-fips  10 Sep 2019\n[064bit-prompt]> ${OPENSSL_DIR}/bin/openssl md5 ./code00.py\nMD5(./code00.py)= eac85e46734260c1bfcceb89d6a3bd32\n[064bit-prompt]> OPENSSL_FIPS=1 ${OPENSSL_DIR}/bin/openssl md5 ./code00.py\nError setting digest md5\n139796140275352:error:060A80A3:digital envelope routines:FIPS_DIGESTINIT:disabled for fips:fips_md.c:180\n
Run Code Online (Sandbox Code Playgroud)\n
\n

经过另一次深入研究(多次失败的尝试)后,我能够让它发挥作用。然而,采取了很多行动:

\n
    \n
  • 人工干预
  • \n
  • 黑客
  • \n
  • (蹩脚)解决方法(gainarii
  • \n
\n

我担心如果我把所有东西都放在这里,它会远远超过30K 字符的限制([SE.Meta]:了解你的限制:问题标题、帖子、图像和链接的最大长度是多少?)。

\n

不过,我在 [GitHub] 上发布了.whl :CristiFati/Prebuilt-Binaries - (master) Prebuilt-Binaries/Cryptography/v2.7。到目前为止,它仅适用于Python 3.564 位),因为它是Ubuntu 16上的默认版本。如果您使用另一个(较新的)版本,请告诉我,我会得到它(也许我自己构建它),并为该版本构建 .whl 无论如何我都会这样做)。

\n

替换原来的.whl后用我构建的

\n
\n
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q058228435/build]> ll\ntotal 2936\ndrwxrwxr-x 2 cfati cfati    4096 Oct  9 21:40 .\ndrwxrwxr-x 4 cfati cfati    4096 Oct  9 21:28 ..\n-rw-rw-r-- 1 cfati cfati  108067 Oct  9 08:43 asn1crypto-1.0.1-py3-none-any.whl\n-rw-rw-r-- 1 cfati cfati  318045 Oct  9 08:43 cffi-1.12.3-cp35-cp35m-linux_x86_64.whl\n-rw-rw-r-- 1 cfati cfati 2438739 Oct  9 21:40 cryptography-2.7-cp35-cp35m-linux_x86_64.whl\n-rw-rw-r-- 1 cfati cfati  112066 Oct  9 08:43 pycparser-2.19-py2.py3-none-any.whl\n-rw-rw-r-- 1 cfati cfati   12099 Oct  9 08:43 six-1.12.0-py2.py3-none-any.whl\n[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q058228435/build]> for f in $(ls *.whl); do unzip ${f} > /dev/null; done\n[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q058228435/build]> ls\nasn1crypto                         cffi-1.12.3-cp35-cp35m-linux_x86_64.whl        cryptography-2.7-cp35-cp35m-linux_x86_64.whl  pycparser-2.19-py2.py3-none-any.whl\nasn1crypto-1.0.1.dist-info