git clone https://github.com/red-keys/cpython.git(支持NTLS功能的在3.12_ntls分支)
编译 cpython 需要的依赖软件
apt install -y \
build-essential \
pkg-config \
libssl-dev \
libffi-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
zlib1g-dev \
libncurses5-dev \
libgdbm-dev \
libnss3-dev \
liblzma-dev \
uuid-dev
apt-get install autoconf-archive
编译步骤
bash
autoreconf -ivf -Werror
export LD_LIBRARY_PATH=/usr/local/tongsuo/lib64:$LD_LIBRARY_PATH
export LDFLAGS="-L/usr/local/tongsuo/lib64 -Wl,-rpath=/usr/local/tongsuo/lib64"
export CPPFLAGS="-I/usr/local/tongsuo/include"
./configure --prefix=/usr/local/python312 --with-openssl=/usr/local/tongsuo --enable-ntls-version
make -j$(nproc)
make install
验证安装
bash
/usr/local/python312/bin/python3 --version
输出示例:Python 3.12.12+ (Openssl=Tongsuo 8.5.0)
新的宏定义
c
{"load_sign_cert_chain", _PyCFunction_CAST(_ssl__SSLContext_load_sign_cert_chain), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_sign_cert_chain__doc__},
{"load_enc_cert_chain", _PyCFunction_CAST(_ssl__SSLContext_load_enc_cert_chain), METH_FASTCALL|METH_KEYWORDS, _ssl__SSLContext_load_enc_cert_chain__doc__},
实现步骤
1. 在 Modules/_ssl.c 中添加 clinic 输入
参考 load_cert_chain 的 clinic 定义 _ssl.c:4533-4540:
c
/*[clinic input]
@critical_section
_ssl._SSLContext.load_sign_cert_chain
certfile: object
keyfile: object = None
password: object = None
[clinic start generated code]*/
/*[clinic input]
@critical_section
_ssl._SSLContext.load_enc_cert_chain
certfile: object
keyfile: object = None
password: object = None
[clinic start generated code]*/
2. 实现函数