证书链及在nginx下的配置

通常为了保护Web通信传输,我们会使用SSL/TLS协议去同时实现加密传输和身份认证,这里需要在服务器端配置好CA证书。

CA证书分为两类:根证书(Root CA)中间证书(Intermediate CA)。这里的证书我们用OpenSSL就可以生成,但是只有经过认证的CA机构签发的根证书才会被浏览器或其它设备信任,做法就是预先在浏览器或系统里内置可信的根证书。

但是根证书的使用是收到严格限制的,不可能对于每一类用户都使用根证书去签发子数字证书,所以就有了中间证书的概念。中间证书由根证书或上一级中间证书签发,它可以再往下级签发数字证书。例如我们自己为某个域名申请了证书 My CA,那么对于三级证书链,签发过程是这样的:

Root CA 签发 Intermediate CA, Intermediate CA 签发 My CA

这时我们就可以用My CA去给域名作数字认证了,那么验证的过程可想而知,就是签发的逆过程,这是通过证书链来完成的。

上面讲到的签发关系很像链式结构,所以被称作证书链。那么浏览器怎么知道My CA是由谁签发的呢?这是由证书里自带的一个字段:Issued By完成的,它会告诉浏览器,这张证书是由谁签发的,请核实签发者是否是可信的。

浏览器继续审核中间证书,看是否和可信证书库中的证书有匹配:

如果有则认为My CA也是可信的;

如果没有,继续往上找,直到根证书:

如果根证书是可信的,那么整条证书链就是可信的;

如果根证书不可信,那么My CA将被认作是不可信的,浏览器就会发出警告。

对于nginx,我们可以把完整的证书链配置在证书文件中,这样就可以一次性通过链式查找去找到证书链上的所有证书,并一一验证。注意不要只配置你自己的user-end证书,因为nginx对于证书链的长度变量ssl_verify_depth默认是1,所以当证书链长度比这个长时,会无法找到根证书,浏览器有可能错误地认为证书不可信。

例如我们生成的证书是my.crt,这时下载证书链文件(*.pem),并追加到my.crt后面:

cat ca.pem >> my.crt

最后使用vi检查一下,保证每个证书的结尾标记(—–END CERTIFICATE—–)和开头标记(—–BEGIN CERTIFICATE—–)不在同一行,不然启动nginx会报错。

更多信息请参考:

http://en.wikipedia.org/wiki/Intermediate_certificate_authorities

http://www.whichssl.com/intermediate_certificates.html

http://wiki.nginx.org/HttpSslModule

证书链及在nginx下的配置》上有1条评论

发表评论

电子邮件地址不会被公开。