资讯详情

资讯详情

OpenSSL 1.1.1f 源码编译安装与多版本共存实践指南

简介OpenSSL 1.1.1f 源代码包面向需要在 Linux、Unix 等平台自行编译部署安全通信组件的开发者与服务器管理员用于解决 SSL/TLS 协议实现、加密算法调用及 X.509 证书管理等底层安全需求。包内为 OpenSSL 1.1.1f 完整源码涵盖 RSA、AES、SHA 系列等加密算法实现SSL 3.0 至 TLS 1.3 协议栈证书生成与验证逻辑以及 s_client、s_server、genpkey 等命令行工具和可供应用集成的库函数接口便于按目标平台裁剪编译选项。压缩包约 9.34MB文件总数与类型明细上游暂未提供。该版本在安全漏洞修复、加密性能、TLS 1.3 特性支持与 API 易用性上均有改进并增强了跨系统与编译器的兼容性。资源已有 618 人学习下载适合需要深入理解 OpenSSL 源码结构、定制编译或排查协议与证书问题的中高级开发者参考。1. 从一次编译报错说起为什么我还在装 openssl-1.1.1f上周帮同事复现一个老项目的构建环境./configure刚跑完就甩出一行error: OpenSSL 1.1.1 or later is required系统里明明装着 3.x可项目源码里写死了OPENSSL_VERSION_NUMBER 0x10101000L的判断编译直接卡死。这种场景太常见了老代码、老中间件、老语言运行时对 OpenSSL 的版本要求精确到小版本号装新了不认装旧了缺符号。openssl-1.1.1f 就是这样一个被大量存量项目钉死的版本它属于 1.1.1 系列支持 TLS 1.3API 与 1.1.1 全系兼容但又不像 3.x 那样改了 provider 架构。装不好会怎样轻则libssl.so.1.1: cannot open shared object file重则整个服务起不来还查不到日志。这篇笔记面向的是需要在一台机器上把 1.1.1f 从源码装起来、并且不污染系统自带库的开发者下面按我实际操作的顺序走一遍。2. 装前把环境列清楚版本、依赖与安装路径的取舍2.1 先确认系统自带的 OpenSSL 是什么状态动手之前别急着解压先摸清底细。系统自带的 OpenSSL 大概率被包管理器管着ssh、curl、apt都依赖它直接覆盖安装是血泪教训里最常见的一种翻车方式。我一般先跑三条命令看清楚openssl version -a which openssl ldconfig -p | grep libssl第一条输出当前openssl可执行文件的版本和编译参数重点看OPENSSLDIR指向哪个目录第二条确认命令来自/usr/bin还是/usr/local/bin第三条列出动态链接器能找得到的libssl库。三条对完你就知道系统库在/usr/lib/x86_64-linux-gnu还是/lib64后面配置--prefix时心里有数。常见做法是把新版本装到/usr/local/openssl-1.1.1f这种独立目录绝不碰系统路径需要用的项目通过环境变量或编译参数指过去。2.2 编译依赖和工具链的版本底线openssl-1.1.1f 是 2020 年前后的源码编译它需要一套能用的 C 工具链。最低要求是 gcc 4.8 以上、make、perl 5.x另外zlib开发头文件建议装上否则编译时会跳过 zlib 压缩支持。不同发行版的包名不一样我按常见两类列一下# Debian / Ubuntu 系 sudo apt-get install -y build-essential perl zlib1g-dev # RHEL / CentOS 系 sudo yum install -y gcc gcc-c make perl zlib-develbuild-essential里包含 gcc、g、make、libc 开发头文件是编译的基础zlib1g-dev或zlib-devel提供zlib.h没有它./config阶段会提示zlib support disabled虽然不致命但后面某些依赖压缩的协议特性会缺。perl 必须装因为 OpenSSL 的构建系统大量用 perl 脚本生成配置。装完用gcc --version和perl -v各确认一次版本太老比如 gcc 4.4会在编译crypto/目录时报一堆语法错误那时候再回头换工具链就晚了。2.3 安装路径和共享库策略装哪里、要不要 --openssldir路径规划是这套环境里最值得花五分钟想清楚的事。--prefix决定可执行文件和库装到哪--openssldir决定配置文件openssl.cnf和证书目录放哪。我一般让两者一致避免以后找配置文件找半天参数我常用的值作用--prefix/usr/local/openssl-1.1.1f安装根目录bin/lib/include 都在其下--openssldir/usr/local/openssl-1.1.1f/ssl配置文件和默认证书路径shared启用生成.so动态库供其他程序链接zlib启用开启压缩支持带版本号的目录好处是以后装 1.1.1w 或 3.x 可以并存切换只改环境变量。shared一定要加很多语言运行时比如某些 Python 扩展、Node 原生模块链接的是动态库只编静态库会报cannot find -lssl。zlib加上省得后面补。这套组合我在多台机器上用过没出过链接层面的玄学问题。3. 从源码到安装openssl-1.1.1f 的完整编译步骤3.1 解压与目录检查拿到openssl-1.1.1f.tar.gz后先校验再解压。校验用 sha256官方发布页会给对应哈希手里没有的话至少确认压缩包完整tar -tzf openssl-1.1.1f.tar.gz /dev/null echo archive ok tar -xzf openssl-1.1.1f.tar.gz cd openssl-1.1.1f ls Configure config Makefile第一条tar -tzf只做列表测试不落盘能正常结束说明压缩包没坏第二条真正解压第三条确认目录里有Configure大写主配置脚本、config包装脚本和Makefile模板。如果ls报No such file多半是解压到了嵌套目录cd进去再找。这一步看着琐碎但我遇到过压缩包传输截断导致Configure缺失的情况早发现比编译到一半报错强。3.2 配置参数./config 与 ./Configure 的区别OpenSSL 有两个配置入口./config是给普通用户用的包装脚本会自动探测平台./Configure是底层脚本需要显式指定目标平台如linux-x86_64。日常安装用./config就够了参数照下面这样给./config \ --prefix/usr/local/openssl-1.1.1f \ --openssldir/usr/local/openssl-1.1.1f/ssl \ shared zlib \ -Wl,-rpath,/usr/local/openssl-1.1.1f/lib逐项说--prefix和--openssldir对应上一节的路径规划shared生成动态库zlib开压缩最后那个-Wl,-rpath,...是传给链接器的把新库目录写进二进制的运行时搜索路径这样装完后openssl命令自己就能找到同目录的libssl.so.1.1不用每次export LD_LIBRARY_PATH。这个 rpath 参数是我踩过坑之后固定加上的——不加的话装完执行openssl version可能报error while loading shared libraries因为系统链接器先找到了旧库。配置跑完会打印一段摘要确认Shared library: True、zlib: True再往下走。3.3 make 编译与安装并行度与权限配置通过后开始编译。源码树不小单核跑要十几分钟用-j按核数并行nproc make -j$(nproc)nproc先看核数make -j$(nproc)按核数开并行。内存小的机器比如 2G 的云主机别开满-j4就够开太多会 OOM 把编译进程杀掉报gcc: internal compiler error: Killed那就是内存不够的信号。编译完成后安装需要写/usr/local普通用户得加 sudosudo make install安装过程会把bin/openssl、lib/libssl.so.1.1、lib/libcrypto.so.1.1、include/openssl/*.h铺到 prefix 下。装完先别急着改全局环境下一章专门讲怎么让它生效而不影响系统。4. 让新版本生效环境变量、动态库与多版本共存4.1 PATH 与 LD_LIBRARY_PATH 的正确写法装完直接敲openssl version大概率还是系统旧版本因为/usr/local/openssl-1.1.1f/bin不在 PATH 里。我一般写一个独立的环境脚本而不是直接改/etc/profile方便回滚# /etc/profile.d/openssl-1.1.1f.sh export OPENSSL_HOME/usr/local/openssl-1.1.1f export PATH$OPENSSL_HOME/bin:$PATH export LD_LIBRARY_PATH$OPENSSL_HOME/lib:$LD_LIBRARY_PATHOPENSSL_HOME是自定义变量方便其他脚本引用PATH把新 bin 放最前保证openssl命令优先命中LD_LIBRARY_PATH让运行时链接器优先找新库。注意LD_LIBRARY_PATH是双刃剑全局设置可能影响其他依赖系统 OpenSSL 的程序所以更稳妥的做法是只在需要它的 shell 里 source 这个脚本或者依赖 3.2 节加的 rpath。写完source /etc/profile.d/openssl-1.1.1f.sh后which openssl应该指向/usr/local/openssl-1.1.1f/bin/openssl。4.2 ldconfig 配置与 soname 冲突处理有些程序不读LD_LIBRARY_PATH只认/etc/ld.so.conf里的路径。想让新库被全局动态链接器发现可以加一个 conf 文件再刷新缓存echo /usr/local/openssl-1.1.1f/lib | sudo tee /etc/ld.so.conf.d/openssl-1.1.1f.conf sudo ldconfig ldconfig -p | grep libssltee把路径写进独立 conf 文件ldconfig重建缓存最后一条确认缓存里出现了libssl.so.1.1。这里有个关键点1.1.1f 的 soname 是libssl.so.1.1和系统自带的 1.1.1 系列同名如果系统里已经有libssl.so.1.1ldconfig的搜索结果会出现两条谁生效取决于路径顺序。这就是为什么我更倾向用 rpath 或局部环境变量而不是全局ldconfig——全局改容易让系统工具链跟着换库属于典型的“装完能跑重启就崩”的坑。4.3 给编译型项目指定 OpenSSL 路径真正要用这套库的往往是别的项目的编译过程。以常见的./configure项目为例通过环境变量把编译和链接都指过去export CPPFLAGS-I/usr/local/openssl-1.1.1f/include export LDFLAGS-L/usr/local/openssl-1.1.1f/lib -Wl,-rpath,/usr/local/openssl-1.1.1f/lib ./configure --with-openssl/usr/local/openssl-1.1.1fCPPFLAGS告诉预处理器去哪找openssl/ssl.hLDFLAGS告诉链接器去哪找库并再次写入 rpath--with-openssl是很多项目自带的参数直接指定前缀。三者一起给最保险只给其中一个经常出现“头文件是新版、链接的是旧库”的错配运行时报version OPENSSL_1_1_1 not found。如果项目用 CMake对应的是-DOPENSSL_ROOT_DIR/usr/local/openssl-1.1.1f思路一样。5. 避坑与排查装 openssl-1.1.1f 最常见的五个翻车点5.1 现象装完 openssl version 还是旧版本原因通常是 PATH 没生效或 shell 缓存了命令路径。先which -a openssl看所有命中项再hash -r清掉 bash 的命令哈希表然后重新 source 环境脚本。如果which已经指向新路径但版本仍旧检查是不是别名alias openssl...在作怪type openssl能看出来。5.2 现象运行时报 libssl.so.1.1: cannot open shared object file原因是动态链接器找不到新库常见于只装了库没配 rpath、也没设LD_LIBRARY_PATH的场景。解决分两步先用ldd $(which openssl) | grep ssl确认它到底在找哪个路径再决定是补 rpath 重新编译还是临时export LD_LIBRARY_PATH。长期方案我推荐重新./config加 rpath比全局环境变量干净。5.3 现象make 阶段报 internal compiler error 或 Killed这是内存不足不是代码问题。make -j$(nproc)在低配机器上开并行会把内存吃穿。降到make -j2甚至单线程重跑即可已经编译过的目标文件不会重编不用make clean。如果反复出现检查是不是 swap 没开。5.4 现象其他系统命令突然报 OpenSSL 符号错误典型原因是全局ldconfig或LD_LIBRARY_PATH把系统工具的库换掉了。比如ssh启动报symbol lookup error。救法是删掉/etc/ld.so.conf.d/openssl-1.1.1f.conf再sudo ldconfig并清理全局LD_LIBRARY_PATH改回按项目局部指定。这也是我坚持独立 prefix 加 rpath 的原因——后悔药不好吃。5.5 现象configure 提示 zlib support disabled缺zlib.h按 2.2 节装开发包即可。装完要重新跑./config因为 zlib 探测结果在配置阶段就定死了只重跑make不会补上。确认配置摘要里zlib: True再编译。6. 装完怎么验证三条命令确认这套环境真的能用装完不验证等于没装。我固定跑三步从命令、库、编译链接三个层面确认。第一步看版本和编译参数/usr/local/openssl-1.1.1f/bin/openssl version -a输出里OpenSSL 1.1.1f开头built on后面的日期和compiler信息对得上OPENSSLDIR指向/usr/local/openssl-1.1.1f/ssl说明 prefix 和 openssldir 都生效了。如果OPENSSLDIR还是系统路径说明配置阶段参数没吃进去得回 3.2 节重来。第二步验证动态库能被正确解析ldd /usr/local/openssl-1.1.1f/bin/openssl | grep -E ssl|crypto期望看到libssl.so.1.1 /usr/local/openssl-1.1.1f/lib/libssl.so.1.1箭头右边必须是新目录。如果指向/usr/lib下的旧库说明 rpath 没写进去或者被LD_LIBRARY_PATH里的旧路径抢先了。第三步做一次真实的编译链接测试这是最能暴露问题的验证cat /tmp/t.c EOF #include openssl/opensslv.h #include stdio.h int main(void) { printf(%s\n, OPENSSL_VERSION_TEXT); return 0; } EOF gcc /tmp/t.c -I/usr/local/openssl-1.1.1f/include \ -L/usr/local/openssl-1.1.1f/lib -lssl -lcrypto \ -Wl,-rpath,/usr/local/openssl-1.1.1f/lib -o /tmp/t /tmp/t这段小程序只打印版本宏但走完了预处理、编译、链接、运行全链路。输出OpenSSL 1.1.1f就说明头文件和库版本一致、链接器找得到、运行时也加载得到。三步全过这套环境才算真正落地。从那以后我每次装 OpenSSL 都强制走一遍这三步验证尤其是第三步的编译测试——它比openssl version更能说明问题因为版本命令只证明可执行文件能跑编译测试才证明这套库能被别的项目用起来。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →