大多数人都厌烦使用老旧的系统,无论软件还是硬件。但有的时候又不得不困守其中,坚持延续着系统的寿命,或者还需要点几柱香,祈求神佛的护佑。 Linux是一个模块化极好的操作系统,得益于此,当其中有组件落伍之时,大多数情况下,还能通过下载源码,手工编译来升级组件,从而保证系统的可用性。 在这个过程中,cURL工具是必不可少的,特别很多常用的开发平台,都使用了libcurl库作为下载的基础工具。比如PHP/PYTHON/RUST/NPM等。当cURL出现故障的时候,直接就导致很多开发工具的升级或者安装依赖包无法继续。
今天碰到一个故障,一台有些年头的服务器在升级一个安全组件的时候报了一个错误:
字面意思上看,是ssl3在握手的时候出现了错误。 但实际上,如果换用一台正常的设备访问同样的网站,再加上-v参数,能看到网站实际是用了TLS的加密方式:
cURL在https的处理方面,主要依赖openssl的处理,所以实际上单纯重新编译cURL是不起作用的,必须把openssl也下载新版本重新编译。
首先在目标服务器上卸载掉原有的curl和openssl,并且安装基本的编译系统:
libtool make 正常情况下其实已经包含在build-essential,但仍然有个别发行版本需要单独安装,不过不用担心,已经安装过的组件反正是会自动跳过的,耽误不了什么时间。 在这个过程中应当庆幸apt工具并没有依赖cURL,不然那才是一场灾难 :) 不过接下来就只能换到一台正常的电脑上工作了,因为openssl和cURL源码的下载必须通过可用的下载工具,而通常如果openssl的版本过低,即便不用cURL,常用的wget一般也是无法工作的。 在openssl源码的选择上是个小坑。如果是一台新的服务器,当然会希望使用最新的版本,很少会有什么兼容性问题。 但在一台老的服务器上,操作系统版本也比较低,使用最新的版本就不一定好了。经常会碰到各种各样的问题。这个过程很可能需要自己来尝试,找一个尽量新,但运行没有问题的版本。 当前在openssl官网提供下载的有三个稳定版本:1.0.2t/1.1.0l/1.1.1d,三个版本都已经支持tls,我经过测试选择了1.1.0l,在这台服务器能正常工作。 下载的源码文件可以通过scp的方式拷贝到目标服务器:
随后登陆到目标服务器上:
安装之后的测试可以通过openssl内置的s_client:
能拿到服务器发出的公钥表示编译的openssl版本可以正常的工作和支持tls加密。 然后可以继续下面编译cURL,否则编译完白费时间,仍然不能用。
cURL通常使用最新版就可以,极少碰到不兼容的情况。仍然在工作电脑下载,完成后scp拷贝到目标服务器,过程略。 然后登录到目标服务器上:
此时的cURL已经支持TLS加密的服务器了,但使用仍会报错:
这是因为没有安装ssl加密的根证书。
根证书可以在https://curl.haxx.se/ca/cacert.pem
下载,建议仍在工作机下载,之后拷贝到目标服务器。
根证书放到openssl的配置目录,一般是:/usr/local/ssl/certs/
或者/etc/ssl/certs/
。
之后可以正常使用了。