問題背景html
咱們的項目要拿到客戶機上作私有化安裝,服務器操做系統客戶指定只能使用redhat7.2版本,且客戶機爲了保密須要不能訪問外網,而操蛋的redhat系統自帶的curl支持的是nss協議的https,而非openssl協議的https,執行curl訪問https站點的時候會出現沒法load key的報錯。linux
網上查了一下解決方案,Stack Overflow上有答案說是生成的key的問題,須要將key轉換成RSA的加密方式,我試了一下,curl命令不會報錯,但咱們的服務端代碼實現不能正常的初始化相關加解密容器。c++
還有部分答案推薦重裝curl,因爲對redhat系統並不熟悉,且向來據說linux上離線安裝的時候須要處理的依賴比較複雜,個人心裏實際上是拒絕的,但沒有更好的解決辦法,只能硬着頭皮上了。。。服務器
安裝zlibcurl
訪問zlib官網,下載最新的zlib包,這裏因爲個人rhel是較新的7.2版本,所以直接使用了zlib的最新版,若是是老版本,可能須要考慮linux內核的兼容性問題;測試
解壓縮zlib安裝包,cd到解壓縮的zlib包目錄下,運行如下命令:加密
./configure make test make install #這裏安裝的是靜態庫 make clean ./configure --shared make test make install #這裏先clean,而後安裝的是共享庫 cp zutil.h /usr/local/include cp zutil.c /usr/local/include #拷貝相關文件
因爲在步驟2中沒有顯示的指定zlib的安裝目錄,所以zlib默認被安裝到了/usr/local/lib下,將 /usr/local/lib 添加到 /etc/ld.so.conf 文件中,並在/etc下執行ldconfig,使配置生效,zlib安裝完畢url
安裝openssl操作系統
訪問openssl官網,下載最新的openssl包;htm
解壓縮openssl安裝包,cd到解壓縮的目錄下,運行如下命令:
./config --prefix=/usr/local/ssl shared zlib-dynamic #指定openssl的安裝目錄,建立動態庫,並在須要的時候動態引用zlib文件(感受我理解很膚淺且有問題,但願能夠有大神給透徹的解答下這條命令的具體含義) ./config -t #好像沒什麼卵用,就是輸出下操做系統的相關信息 make #我執行這句的時候報錯了,大意就是找不到相關的動態庫,網上搜了一圈沒有找到什麼合適的答案,邃本身修改了下Makefile,在gcc的指定中添加了-fPIC選項,注意,因爲make了一半報錯,因此須要先執行 **make clean** 而後再從新make,若是一上來就修改了Makefile,能夠不用執行 **make clean** make test #執行這句的時候我這邊也報錯了,意思是Conditional.pm這個模塊找不到,在網上搜了一圈,居然找不到合適的答案,我只想說我對redhat真的是無力吐槽了,缺的東西也太多了,就這還能掙錢,不過說不定也就是靠這些掙錢了。。無奈且無助的我只能無視報錯了,直接執行下一步 make install #感謝上帝佛祖保佑,上面的報錯只是test的時候引發的,install居然沒有報錯安裝成功了!
仍是修改 /etc/ld.so.conf ,添加 /usr/local/ssl/lib ,修改完畢後執行ldconfig使修改生效
將新安裝的openssl添加到系統環境變量,覆蓋舊的openssl,我這裏修改的是 /etc/profile 文件,在最後一行添加 export PATH=/usr/local/ssl/bin:$PATH ,而後執行 source /etc/profile 便可
安裝curl
訪問curl官網,下載最新的curl包,我下載的是最新的穩定版,還有個長期支持版(但只更新到兩三年後),沒搞明白存在的意義是什麼,棄之;
解壓縮curl安裝包,cd到解壓縮目錄下,執行如下命令:
./configure --prefix=/usr/local/curl --with-ssl #指定安裝目錄,指定使用openssl進行編譯, 這裏並無指定上面安裝的openssl的具體路徑, 猜想安裝腳本里會自動到/usr/local/lib以及其餘目錄下查找相關文件(有熟悉c++的同窗能夠給解釋下) make make install #很神奇,居然沒報錯,我都不適應了。。
將 /usr/local/curl/bin 添加到 /etc/profile 中的PATH前,執行 source /etc/profile 使環境變量的修改生效;
執行curl -V,並測試curl -k https命令,終於能正常讀取證書和key文件訪問https站點了,搞定!