證問題)
簡(jiǎn)介OpenSSL 1.1.1t 安裝包是一份完整的源代碼發(fā)布包適合需要在 Linux 環(huán)境中部署或升級(jí) OpenSSL 的開發(fā)者、系統(tǒng)運(yùn)維人員及信息安全學(xué)習(xí)者。作為長(zhǎng)期支持版本之一1.1.1t 包含多項(xiàng)安全修復(fù)與性能優(yōu)化常用于服務(wù)器證書驗(yàn)證、敏感數(shù)據(jù)加密與安全信道建立。壓縮包大小為 9.42MB解壓后共 3098 個(gè)文件主體包括 C 語言源碼、頭文件、POD 文檔、PEM 證書和 Perl 腳本另附各類配置模板、測(cè)試用例與跨平臺(tái)工程文件。目前已有 425 人學(xué)習(xí)。資源保留了從配置、編譯、測(cè)試到安裝的完整材料并附有多個(gè)平臺(tái)相關(guān)的構(gòu)建說明與證書樣例既可滿足離線安裝及升級(jí)需求也能幫助讀者排查 TLS 配置問題、理解證書簽發(fā)流程還能用于鉆研 OpenSSL 源碼結(jié)構(gòu)與底層加密實(shí)現(xiàn)適合中高級(jí)技術(shù)人員作為實(shí)踐參考這一版本已歷經(jīng)生產(chǎn)環(huán)境驗(yàn)證可放心用于學(xué)習(xí)與實(shí)驗(yàn)環(huán)境搭建。 做服務(wù)端開發(fā)、做運(yùn)維的人多少都被 OpenSSL 折騰過。尤其是手里還有老項(xiàng)目在維護(hù)的八成遇到過這種尷尬機(jī)器上裝了新版 OpenSSL程序每次啟動(dòng)都在報(bào)版本不匹配想換回老分支又不知道該下哪個(gè)包、怎么編譯才穩(wěn)妥。這篇文章就從一個(gè)出現(xiàn)頻率極高的安裝包說起——openssl-1.1.1t我會(huì)把 Windows 和 Linux 的安裝思路、命令、坑位都過一遍適合正在被版本問題折磨、或者想在合規(guī)前提下給舊系統(tǒng)補(bǔ)丁的同行收藏起來后面照著操作就行。1. openssl-1.1.1t 是什么什么情況下必須用它1.1 這個(gè)版本的分量OpenSSL 1.1.1 是官方長(zhǎng)期支持分支1.1.1t 是這個(gè)分支在 2023 年發(fā)布的一個(gè)補(bǔ)丁版本。它修復(fù)了一批和 X.509 證書解析、ASN.1 編解碼相關(guān)的安全漏洞同時(shí)保留了 1.1.1 系列相對(duì)穩(wěn)定的 API 行為。很多人把它們當(dāng)普通版本號(hào)看待其實(shí)這個(gè)版本在 1.1.1 生命周期里非常特殊它之后官方只維護(hù)到 1.1.1u 就停止了整個(gè)分支的更新所以 1.1.1t 既是補(bǔ)丁到位的代表也是老分支在中期最常被下載版本之一。如果你已經(jīng)在用 1.1.1 系列升到 t 這個(gè)具體版本幾乎不需要改代碼因?yàn)樗鼪]有引入大的行為變更純補(bǔ)丁式更新。對(duì)線上系統(tǒng)來說這種小版本升級(jí)風(fēng)險(xiǎn)最低這也是它被大量?jī)?nèi)部系統(tǒng)鎖定的原因。1.2 為什么舊項(xiàng)目離不開它我見到最多的使用場(chǎng)景有三個(gè)一是老的商業(yè)中間件或加密模塊編譯時(shí)直接鏈接了 1.1.1 頭文件換到 3.x 之后編譯過不去運(yùn)行時(shí)還加載不上二是自研的私有協(xié)議棧和證書校驗(yàn)代碼用了不少老式 APIOpenSSL 3.0 把很多底層結(jié)構(gòu)改成不透明的了導(dǎo)致升版成本高三是供應(yīng)商提供的閉源二進(jìn)制庫只針對(duì) 1.1.1 編譯過官方?jīng)]給 3.x 版本你不用這個(gè)版本就沒法跑起來。這種情況下強(qiáng)行升級(jí)到 OpenSSL 3.x 并不劃算正確的做法是讓 1.1.1t 作為一個(gè)獨(dú)立版本存在程序通過特定路徑或環(huán)境變量加載它而不是動(dòng)系統(tǒng)現(xiàn)有版本。這也是我下文所有操作的出發(fā)點(diǎn)——不是替換系統(tǒng) OpenSSL而是安裝一個(gè)獨(dú)立可用的 1.1.1t。2. 下載前準(zhǔn)備別急著點(diǎn)安裝先看清當(dāng)前環(huán)境2.1 檢查本機(jī) OpenSSL 狀態(tài)很多人安裝失敗是因?yàn)楦緵]搞清楚自己機(jī)器上已經(jīng)有什么。在終端先執(zhí)行這條命令openssl version -a輸出里務(wù)必重點(diǎn)看兩個(gè)信息版本號(hào)比如OpenSSL 3.5.0 5 ...說明系統(tǒng)里有一個(gè) 3.x。OpenSSLDir默認(rèn)證書和配置文件目錄比如/usr/lib/ssl或/opt/ssl。同時(shí)再查一下可執(zhí)行文件路徑Windows 執(zhí)行where opensslLinux 執(zhí)行which openssl或type -a openssl。這一步能幫你發(fā)現(xiàn)機(jī)器里是不是存在多個(gè) openssl 可執(zhí)行文件。大多數(shù)版本沒生效問題都是因?yàn)?PATH 里前面的目錄藏著一個(gè)老版本后裝的新版本根本沒被優(yōu)先找到。2.2 下載安裝包與校驗(yàn)哈希OpenSSL 官方源碼包地址是統(tǒng)一的源碼包https://www.openssl.org/source/openssl-1.1.1t.tar.gz校驗(yàn)文件https://www.openssl.org/source/openssl-1.1.1t.tar.gz.sha256Windows 用戶如果不想自己編譯可以直接下載第三方編譯好的二進(jìn)制。最常見的來源是 Shining Light Productions 的 Win64 OpenSSL v1.1.1t Light 版本這個(gè) Light 版不包含文檔和一鍵示例但對(duì)絕大多數(shù)業(yè)務(wù)程序來說功能足夠保護(hù)你避免被無關(guān)文件干擾判斷。無論從哪下載養(yǎng)成校驗(yàn)哈希的習(xí)慣sha256sum openssl-1.1.1t.tar.gzWindows 在 PowerShell 里用Get-FileHash。把得到的值和官方 sha256 文件里的值比對(duì)不匹配就絕對(duì)不能用這是防止拿到被篡改安裝包的基本操作。3. Windows 實(shí)測(cè)Light 版安裝與 PATH 沖突處理3.1 安裝 Light 版的關(guān)鍵步驟用 Win64 OpenSSL v1.1.1t Light 安裝時(shí)有幾個(gè)選擇會(huì)影響后續(xù)使用。安裝過程中會(huì)問你 DLL 放到哪個(gè)目錄我的建議是選擇 Copy OpenSSL DLLs to /bin directory 之前的選項(xiàng)即只把 DLL 放在 OpenSSL 自己的目錄里安裝目錄不要用默認(rèn)的C:\Program Files\OpenSSL我用的是C:\local\openssl-1.1.1t路徑短、無空格后面配置腳本和程序加載都省事安裝結(jié)束不要馬上刪安裝包回頭要補(bǔ)裝 DLL 或者查版本還得用。安裝完成后把C:\local\openssl-1.1.1t\bin添加到系統(tǒng) PATH。注意在 Windows 上修改 PATH 之后已經(jīng)開著的終端不會(huì)自動(dòng)刷新必須新開一個(gè) cmd 或 PowerShell 窗口。3.2 版本優(yōu)先級(jí)與常見沒生效問題新裝完執(zhí)行openssl version如果看到的還是舊版本不要先懷疑安裝失敗檢查順序where.exe openssl我的做法是把C:\local\openssl-1.1.1t\bin放在 PATH 最前面。但如果系統(tǒng)里有 Git 自帶的 OpenSSL、Anaconda 自帶的 OpenSSL只要它們目錄排在新目錄之前實(shí)際運(yùn)行的就是舊版本。此時(shí)可以把不需要的舊 openssl 可執(zhí)行文件重命名留作備份或者在程序啟動(dòng)腳本里顯式設(shè)置完整路徑比如C:\local\openssl-1.1.1t\bin\openssl.exe version。另一種常見問題是你編譯的程序用的 OpenSSL DLL 來自安裝目錄但程序運(yùn)行依賴libssl-1_1-x64.dll。如果沒安裝運(yùn)行庫或者沒有把 DLL 所在目錄加入PATH啟動(dòng)時(shí)會(huì)直接彈缺少 DLL 的報(bào)錯(cuò)。我自己習(xí)慣把 DLL 復(fù)制到和 exe 同目錄避免依賴全局 PATH 導(dǎo)致其他程序干擾。4. Linux 編譯安裝完整命令與參數(shù)說明4.1 編譯環(huán)境和依賴準(zhǔn)備Linux 下我更推薦編譯安裝因?yàn)榭煽匦宰詈貌粫?huì)像亂裝別人的二進(jìn)制那樣導(dǎo)致動(dòng)態(tài)庫沖突。編譯 1.1.1t 需要的最小依賴是 C 編譯器、make、Perl 5以及可選的 zlib 開發(fā)包。Debian/Ubuntu 系統(tǒng)sudo apt update sudo apt install -y build-essential perl zlib1g-devCentOS/RHEL 系統(tǒng)sudo yum groupinstall Development Tools sudo yum install -y perl zlib-devel提前裝 zlib 是為了讓 OpenSSL 支持壓縮功能不裝也能編譯但后續(xù)如果有程序開啟壓縮擴(kuò)展會(huì)報(bào)未知算法。4.2 configure 參數(shù)怎么選、make test 為什么不能跳解壓并進(jìn)入目錄后關(guān)鍵命令是 configure 這一行wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz sha256sum openssl-1.1.1t.tar.gz tar xzf openssl-1.1.1t.tar.gz cd openssl-1.1.1t ./config --prefix/opt/openssl-1.1.1t --openssldir/opt/openssl-1.1.1t/ssl shared參數(shù)含義我拆開講--prefix最終安裝目錄我用獨(dú)立目錄而不是系統(tǒng)默認(rèn)的三級(jí)目錄結(jié)構(gòu)核心目的是避免污染系統(tǒng)其他組件--openssldir證書和配置文件目錄建議單獨(dú)放在安裝目錄下后續(xù)openssl version -a能看到這個(gè)路徑shared生成動(dòng)態(tài)庫。如果你要打包到容器或者想減少外部依賴可以去掉shared但日常聯(lián)調(diào)動(dòng)態(tài)庫更省心。編譯命令make -j$(nproc) make testmake test這一步我強(qiáng)烈建議別跳過。它會(huì)跑幾百個(gè)加密算法、證書鏈、協(xié)議版本自測(cè)用幾十秒時(shí)間換一次完整正確性驗(yàn)證。如果你編譯出的庫有底層問題比如向量指令集不匹配這階段就能報(bào)出來比部署到業(yè)務(wù)系統(tǒng)再排查節(jié)省太多時(shí)間。4.3 安裝后的動(dòng)態(tài)庫配置自測(cè)通過后執(zhí)行sudo make install安裝完成后/opt/openssl-1.1.1t 目錄下有 bin、lib、ssl 等子目錄。為了讓程序能加載動(dòng)態(tài)庫需要把庫路徑交給系統(tǒng)加載器echo /opt/openssl-1.1.1t/lib | sudo tee /etc/ld.so.conf.d/openssl-1.1.1t.conf sudo ldconfig此時(shí)直接驗(yàn)證/opt/openssl-1.1.1t/bin/openssl version輸出OpenSSL 1.1.1t就代表基礎(chǔ)安裝完成。需要特別說明的是我沒有把 /opt/openssl-1.1.1t/bin 加到全局 PATH為的是不影響那些依賴系統(tǒng) OpenSSL 3.x 的命令比如 curl、gcc 內(nèi)部調(diào)用的庫。等你的業(yè)務(wù)程序明確要用 1.1.1t 時(shí)在它的啟動(dòng)腳本里設(shè)置LD_LIBRARY_PATH/opt/openssl-1.1.1t/lib或者鏈接期指定完整路徑即可。5. 安裝完成后的驗(yàn)證與 verify -cafile 用法5.1 確認(rèn)版本和模塊信息安裝完別急著跑業(yè)務(wù)先做一輪基礎(chǔ)驗(yàn)證。除了openssl version -a看版本號(hào)還要確認(rèn)編譯選項(xiàng)/opt/openssl-1.1.1t/bin/openssl version -a | grep Options看看有沒有enable-zlib如果不顯示或者顯示 no-zlib說明壓縮支持沒編譯進(jìn)去對(duì)大多數(shù)業(yè)務(wù)影響不大。再用openssl list -cipher-algorithms確認(rèn)加密算法是否齊全這能反映核心算法模塊是否正常加載。5.2 證書鏈驗(yàn)證命令實(shí)戰(zhàn)驗(yàn)證完版本接著驗(yàn)證證書鏈工具也就是搜索熱度很高的openssl verify -cafile。這個(gè)命令用來校驗(yàn)服務(wù)器證書是否被某組根證書信任常用于排查雙向 TLS 中證書鏈不完整的問題。最基礎(chǔ)的命令/opt/openssl-1.1.1t/bin/openssl verify -CAfile ca-bundle.crt server.crt如果 server 證書還依賴中間證書需要補(bǔ)-untrusted參數(shù)/opt/openssl-1.1.1t/bin/openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt server.crt輸出server.crt: OK表示驗(yàn)證通過。最常見的報(bào)錯(cuò)是unable to get local issuer certificate說明中間證書沒有通過 untrusted 傳進(jìn)來certificate has expired檢查服務(wù)器時(shí)間很多環(huán)境時(shí)鐘漂移會(huì)誤傷。如果要調(diào)試線上 https 站點(diǎn)證書用 s_client 更直觀/opt/openssl-1.1.1t/bin/openssl s_client -connect www.example.com:443 -servername www.example.com -CAfile ca-bundle.crt看返回結(jié)果的Verification: OK行這是判斷證書鏈?zhǔn)欠裢暾淖羁旆绞健?. 常見問題速查與排查實(shí)錄6.1 版本不匹配built against ... you have ... 怎么辦搜索引擎里有一句高頻報(bào)錯(cuò)OPENSSL version mismatch. built against 30000070, you have 30500050。這類報(bào)錯(cuò)和 openssl 二進(jìn)制有關(guān)也和版本管理混亂有關(guān)。先說含義30000070是十六進(jìn)制表示的 OpenSSL 3.0.7 版本號(hào)30500050是 3.5.0.5 版本號(hào)。意思是某個(gè)程序加載時(shí)發(fā)現(xiàn)它編譯時(shí)依賴的 OpenSSL 版本3.0.7和運(yùn)行環(huán)境實(shí)際提供的版本3.5.0.5不一致OpenSSL 通過OPENSSL_version_major()這類函數(shù)做了運(yùn)行時(shí)校驗(yàn)不匹配就直接拒絕。這不是 1.1.1t 特有的問題但在裝完獨(dú)立版本后更容易發(fā)生因?yàn)橄到y(tǒng)里可能存在三個(gè) OpenSSL系統(tǒng)自帶的、二進(jìn)制包帶來的、還有你手動(dòng)裝的。解決思路分幾類如果是某個(gè)第三方二進(jìn)制包在報(bào)錯(cuò)優(yōu)先去官方拿對(duì)應(yīng)系統(tǒng)版本的包別手動(dòng)亂替換系統(tǒng)的 libcrypto/libssl如果是自己編譯的程序重新編譯一次讓它鏈接你最終要加載的 OpenSSL 版本編譯前檢查L(zhǎng)D_LIBRARY_PATH和rpath想快速定位程序到底加載了哪個(gè)動(dòng)態(tài)庫可以用ldd /path/to/your-program看結(jié)果是 libssl.so.1.1 還是 libssl.so.3然后順藤摸瓜清理多余路徑。我在實(shí)際項(xiàng)目中最常用的一招是寫一個(gè)啟動(dòng)腳本里面固定設(shè)置環(huán)境變量和絕對(duì)路徑避免因?yàn)橛脩?、定時(shí)任務(wù)等不同環(huán)境變量上下文導(dǎo)致加載錯(cuò)庫。這類問題一旦發(fā)生咬咬牙把環(huán)境變量統(tǒng)一了后續(xù)能省出無數(shù)個(gè)深夜。6.2 高頻踩坑速查表現(xiàn)象可能原因解決動(dòng)作執(zhí)行 openssl 還是舊版本PATH 順序不對(duì)用where/which排查目標(biāo) bin 目錄放最前找不到 libssl-1_1-x64.dllWindows 下 DLL 未加載復(fù)制 DLL 到程序目錄或加入系統(tǒng) PATHmake test 報(bào)bignum類錯(cuò)誤編譯器過老或架構(gòu)適配問題升級(jí) gcc查官方支持的架構(gòu)列表證書驗(yàn)證報(bào) issuer 錯(cuò)誤中間證書缺失用-untrusted傳入完整鏈程序啟動(dòng)報(bào) version mismatch多版本 OpenSSL 共存且環(huán)境變量混亂啟用統(tǒng)一啟動(dòng)腳本清理 LD_LIBRARY_PATH自編譯的程序鏈接到 3.xconfigure 時(shí)沒指定路徑增加-L/opt/openssl-1.1.1t/lib -Wl,-rpath,/opt/openssl-1.1.1t/lib我自己在這類問題上踩過最大的坑是在 Ubuntu 上用 apt 裝了新版本后來又手動(dòng)編譯老版本到 /usr/local導(dǎo)致 /usr/local/lib 里的庫優(yōu)先級(jí)比系統(tǒng)高所有系統(tǒng)工具直接被帶偏。后來統(tǒng)一采用獨(dú)立目錄 業(yè)務(wù)側(cè)顯式指定的策略系統(tǒng)工具和業(yè)務(wù)程序就再也沒互相干擾過。最后再分享一個(gè)小技巧如果你只是臨時(shí)想驗(yàn)證某個(gè)命令在 1.1.1t 下的行為不用安裝可以直接用源碼目錄里的apps/openssl可執(zhí)行文件編譯完但沒 make install 之前它就能跑。很多測(cè)試場(chǎng)景我都這么干省去環(huán)境切換的麻煩。但線上環(huán)境和生產(chǎn)依賴還是建議走完整安裝流程保證動(dòng)態(tài)庫和證書路徑都穩(wěn)定可控。本文還有配套的精品資源點(diǎn)擊獲取