wangbin
  • wangbin
  • 2020-01-01
  • IT

curl命令详细使用以及一次自己挖坑自己跳的经历

一. 简介

linux下如果想下载什么东西,第一想到的应该就是使用curl了,我们对它很熟悉,可其实又没那么熟悉

二.我们熟悉的curl

显示一个https h5内容

curl https://wangbin.io

下载文件

curl https://wangbin.io/blog/it/cdn.html -o cdn.html

直接使用链接名字命名

curl https://wangbin.io/blog/it/cdn.html -O

post上传文件

curl https://wangbin.io -F "a=test"

三.我们不熟悉的curl

除了上面那些常用的用法,还有很多我们不熟悉的

下载ftp文件

curl ftp://xxx.com/xxx.zip -u "用户名:密码" -o xxx.zip

curl不只支持HTTP、HTTPS协议文件的访问,还支持FTP、FTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

这个比较神奇,之前一直以为只支持HTTP、HTTPS,后面我们继续补充其他协议的使用方法

代理

curl https://wangbin.io -x 127.0.0.1:8888

使用本地127.0.0.1:8888的代理,一般是Charles或者Fiddler提供的代理服务

cookies

待补充

使用特定加密协议访问

使用openssl的ECDHE-RSA-AES128-GCM-SHA256协议访问https://svn.siyou325.com

mac上使用

curl --ciphers ECDHE-RSA-AES128-GCM-SHA256 https://svn.siyou325.com/svn -v

centos7上使用

curl --ciphers ecdhe_ecdsa_aes_128_gcm_sha_256 https://svn.siyou325.com/svn -v

两个系统之间有些差别

可以使用

openssl ciphers 

查看都有哪些算法

四. 一次自己挖坑自己跳的经历

还记得上篇讲的自己搭建cdn吗,结果wangbin.io、wiki.wangbin.io、git.wangbin.io都是没问题的,但是svn.siyou325.com却是坏的。

之前也用aws的cdn服务CloudFront,svn也用不起来,当时也没找到解决方法,所以svn一直是没用过cdn的。

这次自己搭建cdn,svn也不能用,心里不是很爽,这次想找到是啥原因,最好能解决,毕竟刚买了个好的服务器搭建自己的cdn

那为啥svn直接访问源站是好的,访问自己搭建的cdn就是坏的呢?

我用的是Mac笔记本,svn客户端用的是Cornerstone,抓包工具是Charles,打开Charles然后设置Cornerstone的代理为127.0.0.1:8888,update下,发现链接服务端用的是TLSv1(TLS_RSA_WITH_AES_128_CBC_SHA)算法

本地修改/etc/hosts文件,将svn.siyou325.com的ip改为我的cdn服务器ip,然后用Cornerstone update代码,发现在ssl handshake阶段就报错了。

换回源ip就是好的,用cdn的ip就是坏的,来来回回试了好几天,中间查了nginx的日志也没发现啥其他问题,我的nginx前面还用了haproxy,查了haproxy的日志,也没发现啥报错,一直心里郁闷着不知道啥原因,所以有空就尝试尝试,就这样郁闷了好几天

一直不太能理得清思路,不过cdn不支持Cornerstone请求用的TLSv1(TLS_RSA_WITH_AES_128_CBC_SHA)协议,这个慢慢的确认了,问题可能就是在这里

那是否有个命令,可以让我指定使用TLSv1(TLS_RSA_WITH_AES_128_CBC_SHA)协议访问服务端,来进一步验证自己的想法呢,没错,就是使用curl

curl --ciphers ECDHE-RSA-AES128-GCM-SHA256 https://svn.siyou325.com/svn -v

使用这个命令的效果和Cornerstone更新代码的效果是一样的,/etc/hosts指定源ip可以正常访问通,指定cdn的ip,则ssl handshake阶段报错

又在找原因找了几天,试过查看服务器上nginx使用的哪个版本openssl

nginx -V    

发现源服务器和cdn服务器用的相同的openssl版本"built with OpenSSL 1.0.2k-fips 26 Jan 2017"

试过查看服务器上openssl支持哪些算法,

# 查看openssl版本
openssl version
# openssl支持哪些算法
openssl ciphers 
# egrep加粗显示
openssl ciphers | egrep --color 'ECDHE-ECDSA-AES128-GCM-SHA256'

发现ECDHE-ECDSA-AES128-GCM-SHA256都是支持的,这就比较烦躁了,束手无策的感觉

网上搜了下类似的解决方法是升级下svn客户端,确实,我本地svn命令行的版本号是1.10.3,svn up是好的,但是Cornerstone不行,支持最高的svn版本号是1.8,应该是Cornerstone用的老的https算法的缘故

后来想着是否是这个域名的nginx配置有问题,我试试同在cdn这个服务器上的其他服务,是否是正常的呢?如果其他服务没问题,只有这个有问题,那么我就可以确定是我的配置的哪处地方错了,可以继续在这块深入下去

curl --ciphers ECDHE-RSA-AES128-GCM-SHA256 https://files.siyou325.com -v

试了https://files.siyou325.com,结果可以正常访问,那么就是我这个域名的配置有问题了

那简单,将https://files.siyou325.com的配置文件files.siyou325.com.conf内容拷贝到svn-mycdn.siyou325.com.conf,修改域名为svn.siyou325.com,然后执行

nginx -t
nginx -s reload

重新配置nginx之后,执行

curl --ciphers ECDHE-RSA-AES128-GCM-SHA256 https://files.siyou325.com -v

发现竟然是好的,万幸,那逐步修改配置提供cdn服务,看看哪一步报错就好了

结果一步步配置,最后提供了svn的cdn服务,竟然也没报错,这就神奇了

找到之前有问题的配置,然后比较了下两个的不同之处,结果发现是自己的不细心造成的,还记得之前我们说的搭建cdn的nginx配置文件么

www-mycdn.wangbin.io.conf

## backend
upstream io_wangbin_www-data  {
    # server 192.168.16.32:59002 weight=1;
    server www-data.wangbin.io:443;
}

# www-mycdn.wangbin.io;
server {

    listen       50443 ssl http2;
    listen       [::]:50443 ssl http2;

    server_name  wangbin.io;
    server_name  www.wangbin.io;

    # ssl
    ssl_certificate             /vps/save/certificate/acme/*.wangbin.io_ecc/fullchain.cer;
    ssl_certificate_key         /vps/save/certificate/acme/*.wangbin.io_ecc/*.wangbin.io.key;
    ssl_trusted_certificate     /vps/save/certificate/acme/*.wangbin.io/fullchain.cer;

    # ecc
    ssl_certificate             /vps/save/certificate/acme/*.wangbin.io_ecc/fullchain.cer;
    ssl_certificate_key         /vps/save/certificate/acme/*.wangbin.io_ecc/*.wangbin.io.key;

    # log
    access_log                  logs/wangbin.io/wangbin.io/access-wangbin-mycdn.io.log siyou325;
    error_log                   logs/wangbin.io/wangbin.io/error.log;

    # header
    add_header  X-Robots-Tag    "";

    location / {
        proxy_pass  https://io_wangbin_www-data;

        proxy_set_header Host www-data.wangbin.io;
        proxy_set_header X-Real-Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        # # proxy-protocol
        # proxy_set_header X-Real-Ip $proxy_protocol_addr;

        proxy_ssl_server_name on; # 要加上这个,不然会报502错误, peer closed connection in SSL handshake while SSL handshaking to upstream
        proxy_redirect off;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

}

看看第一个ssl_certificate的配置

/vps/save/certificate/acme/*.wangbin.io_ecc/fullchain.cer;

这儿配置的是"*.wangbin.io_ecc",但是其实应该是"*.wangbin.io"

原因是https证书有两种,姑且叫普通的https证书和ecc证书,ecc算法更优一些,也更安全,之前为了尝试,这两个证书我都申请配置了

第一个ssl_certificate配置普通的https证书,第二个ssl_certificate配置ecc证书,这样可以在最新的浏览器上使用ecc证书,更加安全,在Cornerstone这样还使用老的https算法的地方,使用普通证书,增加通用性,毕竟我们对安全性的要求也不高

结果这儿掉进了沟里,太不应该了,做事不够仔细

四. 总结

curl命令用法很多,后面有用到新的再继续补充

我真的是不太细心,已经因为这个做错了好多事,即使告诫自己要细心,也还是会再犯,后面继续注意吧,只能这样啦,祈祷

参考:

  1. https://www.cnblogs.com/guixiaoming/p/8507268.html

  2. https://blog.csdn.net/z390174504/article/details/84101169