cURL
是
linux
下命令行提交
HTTP(S)
请求的一个很有用的工具,支持表单数据提交、文件上传、文件下载、批量访问,多种
HTTP
方法等。其中对
HTTPS
的支持有些技术细节还是很有点讲究的,也是我在最近工作中费了不少时间摸索出来的。
cURL
对
HTTPS
的支持是通过
--cacert, --capath, --with-ca-bundle
等参数来对
HTTPS
加以支持的,详细信息可以
curl --help
来得到参数明细。
[url]http://curl.haxx.se/docs/sslcerts.html[/url]
里是
curl
的官方文档介绍,其中讲了如何导入
CA
的具体方法,
以及
使用
CA
的方法。其中
--with-ca-bundle
可以用环境变量
CURL_CA_BUNDLE(LINUX
下)或
curl-ca-bundle.crt(WINDOWS
下可搜索到该文件
)
来实现默认指定。
通过
IE
或其他浏览器访问
HTTPS
服务器我们可以很容易得到
SSL
的
X.509
安全证书,证书导出可以选择编码格式,我们通常选择
DER
或者
BASE64
编码方法,导出文件为
cer
后缀。需要注意的是对于
openssl
生成
crt
证书文件时
--info
参数会有区别。如对
DER
编码文件命令应该是
openssl x509 -inform DES -in /aaa-der.cer -text -out /.aaa-der.crt
其中
aaa-der.cer
是浏览器里导出的
x.509
证书文件,
aaa-der.crt
是加密
CA
证书被
curl
所需加载验证的。如果导出用
BASE64
编码导出的,则命令行应该改为
openssl x509 -inform PEM -in /aaa-b64.cer -text -out /.aaa-b64.crt
其中
-inform
参数需要改为
PEM
,来对应编码格式
BASE64
。
另外,
X.509
证书如果是三层以上的,即除了底层的
URL
外,上面还有两层以上的,则说明该证书是一个证书夹,即便里面只有一个证书。这时候用在
curl
时需作为
--capath
的参数值代入才能生效;
反之,如果只有两层的,即除了底层的
URL
外,上面只有一层的,则说明该证书只是一个证书,用在
curl
里需作为
--cacert
里的参数值才能生效。
证书在
curl
里能被通过必须具备以下三个条件:
1
、被
CA
签证过的证书;
2
、期限有效的;
3
、
URL
能匹配请求。
其中第三个可以用过
hosts
添加
ip-name
对来实现欺骗,如果服务器的
SSL
证书属于复制使用的话。
千试百试,终于得到以上体会,希望有相关问题的人可以参考借鉴,也给自己以后参考使用。
另,一个期间碰到的环境问题,让自己白忙活了一天,也记录在此,警醒自己:
用
curl
对某
web server
进行访问,在几台不同网络的机器试,
http
在所有机器上都是正常的,
https
在其中的两台上不行,报
socket 111
无法连接的错误,其他的机器没问题。证书也没有问题。一整天也没有搞明白。因为
web server
不是我的可触及范围,结果也就是
web server
的问题,让我白忙活
了这么久。因为
web server
没有启用
ssl
,它提供的
ssl
是网络设备
ssl-box (netscaler)
所支持的,所以所有内网机器都不会成功访问到
web server
的
https
端口,外网地址都可以,因为
ssl
是网络提供的,内网不会经过到
netscaler
去重定向
https
。这个是
netscaler
没配全的原因,唉!真苦!
本文转自 dannyy1026 51CTO博客,原文链接:http://blog.51cto.com/dannyyuan/124957