最近发现我的博客在opera里经常提示ocsp error。这个错误的原因是opera在验证ssl证书的时候出错,主要是验证的服务器的问题。
我用的alphassl的证书,验证ocsp的url是http://ocsp2.globalsign.com/gsalphag2,去http://uptime.netcraft.com/perf/reports/OCSP查看才知道这个地址验证ocsp有0.38%的失败率,表现简直是倒数了。而opera在ocsp验证出错后就会缓存24小时,所以就一直提示ocsp错误了。
要解决的话最好的方法是ocsp stapling。也就是说先向ocsp验证服务器请求验证,把验证证书保存下来,然后当浏览器建立连接的时候就直接把证书发过去,就不需要再向ocsp服务器验证了。这样也能加快连接速度。
先把用的证书保存下来,因为是证书链,所以保存为level0,level1
openssl s_client -showcerts -connect xjpvictor.info:443 < /dev/null | awk -v c=-1 '/-----BEGIN CERTIFICATE-----/{inc=1;c++} inc {print > ("level" c ".crt")}/---END CERTIFICATE-----/{inc=0}'
然后还需要level2,因为level1是靠level2验证的,level2是根证书,是GlobalSign的,在/usr/share/ca-certificates/mozilla/
中找到这个证书,复制出来,作为level2。
把level1和level2的证书放在一起
cat level{1,2}.crt > CAbundle.crt
最后请求ocsp证书。需要用-header "HOST" "ocsp2.globalsign.com"
不然会出错。
openssl ocsp -issuer level1.crt -nonce -CAfile CAbundle.crt -url "http://ocsp2.globalsign.com/gsalphag2" -cert level0.crt -header "HOST" "ocsp2.globalsign.com" -text -respout ./xjpvictor.info.ocsp
获得的ocsp证书放在nginx的证书目录中去,修改nginx.conf,在需要用https的server中加上
ssl_stapling on;
ssl_stapling_file /etc/nginx/certs/xjpvictor.info.ocsp;
ssl_stapling_verify on;
用chrome的话是不会有这个问题的,因为chrome并没有ocsp验证功能,而是采用了google私有的一个验证方式,大概是google自己维护一个验证列表下发到chrome中,而google这么做的理由是ocsp is inefficient,很扯。
Update: 2014-01-23
用了一段时间以后发现nginx ocsp stapling只会读取默认server中的设置,所以如果是多域名的话,其他域名也是返回默认server中设置的证书,最后导致其他域名ocsp验证失败,浏览器甚至可能禁止打开这个网址了。所以其他域名下就必须设置成ssl_stapling off;
了。而且默认server下如果不开启ssl_stapling,那其他server开启也没用。
另外,ocsp证书有效期很短,大概不到一个月,所以过段时间要更新ocsp证书,不然还是会验证失败。
正在研究这个,但是看起来好麻烦的样子
@袁源: 其实感觉这么做没什么必要,因为影响不会很大
谷歌有证书透明度记录,按照国际标标准,SSL的颁发过程都要公开在谷歌等大公司的透明度log服务器上。发现乱颁发的直接在浏览器里吊销掉。所以,人家却确实会认为这个OCSP很扯。
@王琪亮: ocsp并不是针对乱颁发证书的情况,反而是颁发证书的方面自己的一种审查,所以不冲突