背景:
Ubuntu16.04
手动编译了openss和curl(见前两篇文章),但curl无法访问https网站。
虽然可以用参数关掉证书验证来实现访问,但总觉得方法不完美。
查找了很多资料,这个过程中,也对证书有了一点表面的认识,记录如下。
问题:
在命令行中执行:
root@4fce076edf95:~# curl -v https://wwww.baidu.com
* Rebuilt URL to: https://wwww.baidu.com/
* Trying 123.125.114.144...
* TCP_NODELAY set
* Connected to wwww.baidu.com (123.125.114.144) port 443 (#0)
* ALPN, offering http/1.1
* 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 (OUT), TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
原理:
一个https网站,会提供一个证书,来证明自己是合法网站。
但是这个证书是真是假呢,客户端本身还是不能识别的,需要让一个“权威的第三方”来评判。
各种浏览器中,都会内置一些可信的第三方的证书,也就是“受信任的根证书颁发机构”。
当浏览器从某个https服务器中拿到一个证书后,会找到证书里记录的根证书颁发机构,到那里去验证一下。
例如:
我们打开百度首页,会看到地址栏中的安全提示,点开,会看到证书信息,如下图。
这里的GlobalSign就是一个“权威的第三方”
所以,为了能验证我们要访问网站的证书是真是假,就需要我们先预置一些根证书。
对策:
先到curl的官网上去下载一个包含很多“权威第三方”信息的证书:
https://curl.haxx.se/ca/cacert.pem
可以在win系统上下载,复制到linux中去。
然后在curl命令中指定参数:
--cacert cacert.pem
root@4fce076edf95:~# curl -v --cacert cacert.pem https://wwww.baidu.com
......
* SSL certificate verify ok.
......
编程:
如果使用libcurl来实现自己的http客户端,
需要增加如下一行代码,来达到访问https网站的目的
curl_easy_setopt(curl, CURLOPT_CAINFO, "./cacert.pem");
当然,这是一个比较简陋的写法,
最终在运行时,pem作为一个独立的文件,是不是可能被手动替换掉,最终实现中间人攻击?
我目前还不是特别懂。
以后再深入了解后,回来补充此文章。
参考:
curl官网,上面错误提示中给出的一个网址,但讲的比较含糊
https://curl.haxx.se/docs/sslcerts.html
下面这篇文章对证书做了比较完整的解释:
https://linux.cn/article-7289-1.html
一些证书格式的介绍和转换的方法:
https://blog.csdn.net/xiangguiwang/article/details/76400805
DigiNotar:一家“权威第三方”失信而导致破产的故事
https://cnzhx.net/blog/diginotar-ca-servers-been-compromised/
http://m.chinabyte.com/sec/325/12155825_gfh.shtml
这篇文章好像说的和本文是一件事:
https://www.cnblogs.com/cposture/p/9029014.html
零碎的一些信息
https://blog.csdn.net/lemonzone2010/article/details/46515521
https://serverfault.com/questions/394815/how-to-update-curl-ca-bundle-on-redhat%5D