填坑记-ssl中间证书

欢快地申请证书并安装

在申请域名证书的时候,需要提供组织信息,如公司名称等,然后用ssl工具,如openssl,使用这些信息生成公钥密钥对,其中的公钥就是证书申请文件(CSR - Cerificate Signing Request). 将CSR文件提交给证书服务商进行签发,返回证书文件(CERTIFICATE)(当然不同的格式会有不同的名称)

这样我们的域名就有了一个被外界认可的身份证明,然后在nginx/tomcat下进行配置对外, 再用浏览器访问,会发现锁标志那里是绿色的, yeah!

但是事情太顺利一般都没有好事!陆续接到反馈,在windows系统下有些工具报证书错误...持续构建服务拉代码失败...浏览器有时清理缓存后报证书不可信...

现在我知道了,这种情况一定是中了中间证书的坑

填坑

  • 什么是中间证书?

普通用户的证书是由证书签发机构签发的,但他们很可能只是一个中间代理机构,也是需要有一个凭证的,这个就是中间证书. 中间证书是由上级或者根证书签发机构签发

  • 为什么浏览器访问正常?

浏览器中内置了根证书,如Chrome/Firefox, 没有中间证书. 但是在访问时发现没有中间证书的话,会自动去下载或使用访问其他网站时缓存的相同证书(所以有时清理缓存会造成问题). 补齐证书后自然访问正常

  • 为什么服务器工具访问失败?

因为不会自动下载中间证书...

检测证书状态

  • 命令行(适合于高手,或者服务部署于内网的情况)
openssl s_client -connect app-git.ppgame.com:443

首先看depth,如果都是0, 说明在认证链(Certificate chain)的第一条就没有通过

可以看到从证书读出的信息中包含了两组认证: s表示认证对象,i表示认证机构

不能认证第一条证书,说明中间证书有问题

  • 第三方工具

SSL服务器证书安装检查器

返回结果

很明显,正在缺少中间证书导致的问题

获取中间证书

  • 最直接的办法当然是找中间证书代理商要啊,谁让我们给钱了

  • 既然浏览器能缓存证书,那一定还在电脑里,是可以导出来的. Mac系统可以用钥匙串工具来导入导出证书

  • 使用第三方工具下载中间证书

将我们的域名证书填进去会生成中间证书的下载地址. 相同的如果你要获取根证书,只要把中间证书填在这里就可以了

Let’s Encrypt

最方便的是使用Let’s Encrypt来进行证书申请及网站部署:免费!操作简单!
申请letsencrypt证书

  • 不需要提供组织信息 (能证明网站或域名归你操控就可以了)
  • 不需要自已生成CSR证书申请文件
  • 不需要自己生成私钥

签发成功后会返还以下文件:

`privkey.pem`  : the private key for your certificate.
`fullchain.pem`: the certificate file used in most server software.
`chain.pem`    : used for OCSP stapling in Nginx >=1.3.7.
`cert.pem`     : will break many server configurations, and should not be used
                 without reading further documentation (see link below).

We recommend not moving these files. For more information, see the Certbot
User Guide at https://certbot.eff.org/docs/using.html#where-are-my-certificates.

部署的时候,使用privkey.pem/fullchain.pem