共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。
我们的项目要拿到客户机上做私有化安装,服务器操作系统客户指定只能使用 redhat7.2 版本,且客户机为了保密需要不能访问外网,而操蛋的 redhat 系统自带的 curl 支持的是 nss 协议的 https,而非 openssl 协议的 https,执行 curl 访问 https 站点的时候会出现无法 load key 的报错。
网上查了一下解决方案,Stack Overflow 上有答案说是生成的 key 的问题,需要将 key 转换成 RSA 的加密方式,我试了一下,curl 命令不会报错,但我们的服务端代码实现不能正常的初始化相关加解密容器。
还有部分答案推荐重装 curl,由于对 redhat 系统并不熟悉,且向来听说 linux 上离线安装的时候需要处理的依赖比较复杂,我的内心其实是拒绝的,但没有更好的解决办法,只能硬着头皮上了。。。
访问 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 安装完毕
访问 openssl 官网,下载最新的 openssl 包;
解压缩 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 安装包,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 站点了,搞定!