大多数人都厌烦使用老旧的系统,无论软件还是硬件。但有的时候又不得不困守其中,坚持延续着系统的寿命,或者还需要点几柱香,祈求神佛的护佑。
Linux是一个模块化极好的操作系统,得益于此,当其中有组件落伍之时,大多数情况下,还能通过下载源码,手工编译来升级组件,从而保证系统的可用性。
在这个过程中,cURL工具是必不可少的,特别很多常用的开发平台,都使用了libcurl库作为下载的基础工具。比如PHP/PYTHON/RUST/NPM等。当cURL出现故障的时候,直接就导致很多开发工具的升级或者安装依赖包无法继续。

今天碰到一个故障,一台有些年头的服务器在升级一个安全组件的时候报了一个错误:

cURL error 35: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

字面意思上看,是ssl3在握手的时候出现了错误。
但实际上,如果换用一台正常的设备访问同样的网站,再加上-v参数,能看到网站实际是用了TLS的加密方式:

$ curl -v https://sh.rustup.rs
* Rebuilt URL to: https://sh.rustup.rs/
*   Trying 13.225.103.123...
* TCP_NODELAY set
* Connected to sh.rustup.rs (13.225.103.123) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pemCApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256...(略)

cURL在https的处理方面,主要依赖openssl的处理,所以实际上单纯重新编译cURL是不起作用的,必须把openssl也下载新版本重新编译。

首先在目标服务器上卸载掉原有的curl和openssl,并且安装基本的编译系统:

$ sudo apt-get purge curl libcurl3 libcurl3-gnutls libcurl4-openssl-dev openssl libssl-dev
$ sudo apt-get autoremove -y$ sudo apt-get install build-essential libtool make

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的方式拷贝到目标服务器:

$ scp openssl-1.1.0l.tar.gz master@211.100.34.33:~/

随后登陆到目标服务器上:

$ tar xvf openssl-1.1.0l.tar.gz
$ cd openssl-1.1.0l
$ ./config
$ make
$ sudo make install
$ sudo echo "/usr/local/ssl/lib" >> /etc/ld.so.conf

安装之后的测试可以通过openssl内置的s_client:

$ openssl s_client -tls1_2 -connect  sh.rustup.rs:443
CONNECTED(00000005)
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = sh.rustup.rs
verify return:1
---
Certificate chain0 s:CN = sh.rustup.rsi:C = US, O = Amazon, OU = Server CA 1B, CN = Amazon1 s:C = US, O = Amazon, OU = Server CA 1B, CN = Amazoni:C = US, O = Amazon, CN = Amazon Root CA 12 s:C = US, O = Amazon, CN = Amazon Root CA 1i:C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G23 s:C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2i:C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIFYDCCBEigAwIBAgIQCYiHqMAcId0Jd6fEfXdC8jANBgkqhkiG9w0BAQsFADBG
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg
Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0xOTA1MjkwMDAwMDBaFw0yMDA2Mjkx
MjAwMDBaMBcxFTATBgNVBAMTDHNoLnJ1c3R1cC5yczCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAN7D4NF6MP8rKvehZtNeSH19cqW5DFD+o8S3rywcyWvo
jkDrdbgxrVhCBf6DY9IlVantRrSJr3N+vmd64y13riRhZC/Q4dqL7S6lyqEtOoj+...(略)

能拿到服务器发出的公钥表示编译的openssl版本可以正常的工作和支持tls加密。
然后可以继续下面编译cURL,否则编译完白费时间,仍然不能用。

cURL通常使用最新版就可以,极少碰到不兼容的情况。仍然在工作电脑下载,完成后scp拷贝到目标服务器,过程略。
然后登录到目标服务器上:

$ tar xvf curl-7.66.0.tar.gz
$ cd curl-7.66.0
# 下面一行显示的指名了ssl安装的路径,采用默认编译的话,openssl1.1.0l是安装在这个目录
# openssl1.1.1d是安装在/usr/local,请根据自己的版本确认一下安装路径
# 如果确认当前只有安装的这一个版本openssl,只需要--with-ssl参数,不附加目录参数也是可以的
# 但通常系统中因为其它依赖openssl的软件存在,经常有其他版本的libssl,没有被彻底删除,
# 这时候必须制定一个准确路径
$ ./configure --with-ssl=/usr/local/ssl
$ make
$ sudo make install

此时的cURL已经支持TLS加密的服务器了,但使用仍会报错:

curl: (60) SSL certificate problem: unable to get local issuer certificate

这是因为没有安装ssl加密的根证书。
根证书可以在https://curl.haxx.se/ca/cacert.pem下载,建议仍在工作机下载,之后拷贝到目标服务器。
根证书放到openssl的配置目录,一般是:/usr/local/ssl/certs/或者/etc/ssl/certs/

之后可以正常使用了。

转载于:https://www.cnblogs.com/andrewwang/p/11529023.html

cURL无法访问TLS网站故障解决相关推荐

  1. 怎么升级浏览器_下载的chrome无法访问此网站怎么解决

    有时因为工作的原因,我们需要将chrome浏览器设定为特定浏览器,来方便我们我们使用.但在使用的过程中却出现了chrome无法访问此网站的情况,这是怎么回事呢?我们又该怎么来解决呢?很多用户应该都有遇 ...

  2. tensorboard 2.0可视化 —浏览器中输入http://ip:6006 - 无法访问此网站——有效解决

    文章目录

  3. 电信网通证实台湾地震影响内地访问国际网站(12月27日)

    <iframe align="top" marginwidth="0" marginheight="0" src="http ...

  4. 电信网通证实台湾地震影响内地访问国际网站(12月27日) 1

    电信网通证实台湾地震影响内地访问国际网站 http://www.sina.com.cn 2006年12月27日 09:39 东方网   中国国际海底光缆网络 中美六家运营商正在共同建设连接中国和美国的 ...

  5. 谷歌浏览器提示:您要访问的网站包含恶意软件(解决方案)

    谷歌 Chrome 浏览器拦截提示:您要访问的网站包含恶意软件(2021年最新解决方案) 谷歌Chrome浏览器越来越重视安全问题,经常会遇到谷歌浏览器上使用时出现安全警告的问题,提示"您要 ...

  6. Node.js~在linux上的部署~外网不能访问node.js网站的解决方法

    这是上一篇node.js部署到linux上的后续文章,当我们安装完node.js之后,建立了sailsjs的网站,然后在外面电脑上无法访问这个网站,这个问题我们如何去解决? 解决思路: 查看linux ...

  7. 网络连接异常、网站服务器失去响应_网站常见故障解决办法

    网站在运行过程中,常常遇到各种服务器问题,虽然有服务器厂商的维护,但是往往耗时耗工小编对常见的服务器问题,进行了归纳整理,下面跟各位分享一下. 常见故障分析 一.恶意攻击 在我平时管理网站时,可能会遭 ...

  8. 【网络相关】curl可以访问浏览器打不开,无法访问此网站,ERR_UNSAFE_PORT。10080端口

    问题描述 今天服务器部署了一个nginx服务,暴露的端口是10080,该服务在terminal上面使用curl可以访问到,手机浏览器可以访问到,但是电脑的浏览器不行,尝试了两个浏览器,谷歌和苹果原生浏 ...

  9. 域名策略服务器未运行,谈一谈网站突然无法访问的原因及解决策略

    前几天有网友在使用某云服务器的时候,告知没有任何先兆自己的网站无法访问.实际上我们每个站长都有遇到过这样的问题,即便我们在选择主流的服务器商家的时候也都有这样的问题,只不过这样的概率高低不同罢了.一般 ...

最新文章

  1. YOLOV4各个创新功能模块技术分析(三)
  2. Calc3: Geometrics
  3. 开了gomod不识别gopath_笔记本电脑开不了机原因 笔记本电脑开不了机解决方法【图文】...
  4. 讲讲volatile的作用
  5. 【渝粤题库】广东开放大学 文化服务营销管理 形成性考核
  6. 78%的iPhone用户手机没有安装过新软件
  7. 【重识 HTML + CSS】列表、表格、表单
  8. 第2章 数据库系统体系结构
  9. Ubuntu 12.04下安装搜狗拼音 + 安装搜狗皮肤-转
  10. java ognl使用_java框架篇---struts之OGNL详解
  11. 一篇关于微信防撤回(文本、图片、语音、视频、名片等...)的Python学习教程
  12. Python 简易图形用户界面计算器
  13. 手把手教你用tensorflow2.3训练自己的分类数据集
  14. hp服务器u盘安装系统进不了安装界面,hp笔记本开机无法从u盘安装系统
  15. R语言开放数据分析报告
  16. 【特征工程】Chap3 Text Data: Flatten, Filtering, Chunking
  17. 2-3、迭代法计算定积分
  18. 永州湖南科技学院计算机,永州唯一的本科院校,湖南科技学院怎么样?
  19. 兄弟们,我又回来了,干货太多让你们久等了
  20. 在Linux中运行Nancy应用程序

热门文章

  1. html中em作用6,CSS中强大的EM
  2. 很多工程项目没有意识到Oracle P6软件的重要性
  3. 超赞!Win10自带系统修复工具DISM使用说明
  4. Artifical Neural Nets VS Neural Nets?人工神经网络VS神经网络?
  5. FreeModbus从站源码解析(mbfuncholding.c、mbfunccoils.c、mbfuncdisc.c、mbfuncinput.c)
  6. py安装文件时报错usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
  7. Repair Pipelining for Erasure-Coded Storage(ATC‘17)
  8. git拉取后,代码被覆盖怎么办?
  9. IDEA2016设置JDK11出错
  10. mysql通用mapper_详解Mybatis通用Mapper介绍与使用