寻觅生命中的那一片浅草......

每日存档 三月 30th, 2017

https证书链

应同事要求,把git的地址修改成了https,应用后,浏览器访问是正常的,但git命令行访问时,偶尔会提示证书有问题:

Peer certificate cannot be authenticated with known CA certificates

遇到一两个反馈,就让他们禁用证书检查,或者改用ssh,但反馈多了,觉得这体验的确不够好,虽然安全和方便二者不可兼得,但我们这明明是Symantec颁发的权(mian)威(fei)证书,理论上不应该有问题才对。今天有空,就试着解决下。

犹记得(多么熟悉的三个字,其实是代表了年纪大)上次内网某https应用,有位同事用Chrome访问,死活都提示证书有问题,但其他人又正常,百思不得骑姐。后来是web同事发现并解决了问题,说是证书链不完整,去把中间证书下载回来,加到证书里就解决了。

本次估计也是,但怎么验证?如果是外网,直接用ssllabs_https_check,会打印完整证书链,将网站打印出来的证书和服务器上配置的进行对比,如果不一致,则证明少了中间证书。但我们是内网啊,这网站无法访问到,这时只能放狗+祭出openssl神器了。

查看证书

openssl s_client -showcerts -connect git.example.com:443 -servername git.example.com

Certificate chain节内容,如果下面的开头和结束只出现1次,则代表证书不完整

-----BEGIN CERTIFICATE-----
证书内容
-----END CERTIFICATE-----

至此,我们证实了只有1个证书了,那怎么加入中间证书?

  • 颁发机构一般有提供的
  • 如果当时的压缩包已经不知去向,如果你有2个https应用都是同一个CA颁发的,那么可以用上面openssl的方法去另外一个https应用拿

修改httpd配置,此处列出完整配置

<VirtualHost *:443>                                                                                                                 
    ServerName git.example.com
    CustomLog logs/git.example.com_access.log common
    SSLEngine on
    SSLCertificateFile "/etc/httpd/cert/git.example.com.crt"
    SSLCertificateKeyFile "/etc/httpd/cert/git.example.com.key"
    # 此配置为本次新添加
    SSLCertificateChainFile "/etc/httpd/cert/git.example.com_root_bundle.crt"
    SSLProtocol all -SSLv2 -SSLv3
    ProxyPreserveHost On
    ProxyRequests Off
<Location />
    ProxyPass http://127.0.0.1:8088/
    ProxyPassReverse http://127.0.0.1:8088/
</Location>
</VirtualHost>

最后优雅地重新加载配置

sudo /etc/init.d/httpd graceful

再次用openssl检测,此时服务器端已经返回了完整的证书链,git也正常了。BTW,https水太深了。

为什么浏览器正常呢?因为浏览器会递归请求证书,而递归请求其实很慢,所以也就有了- OCSP Stapling,简单说就是,服务器去帮你把中间证书请求了,一起返回给客户端。

2017年三月
« 2月   4月 »
 12345
6789101112
13141516171819
20212223242526
2728293031