最近在调试https,买了一个godaddy的证书,ocsp的配置一直不成功,参考了网上各种文档,从godaddy的存储库下载各种证书,尝试各种搜索结果均无果,后来申请了一个startssl的证书,简单配置了一下,从官网下在了根证书和中间证书合成了一下就可以用ocsp了,邮件给startssl的客服,拿到了一个配置文档,经过多次尝试,终于在nginx上配好了用godaddy的坑爹证书的ocsp。对过程没兴趣的,可以看最后一句总结。

godaddy的ocsp存在的一个问题是在阿里云上无法连接ocsp.godaddy.com,ping的延时要一百大几十毫秒,一定会影响请求速度,而我在本地则可以连接,虽然也是有这样大的延时,好歹可以验证证书。这个问题在阿里云提了工单,他们表示他们没有任何限制,让我联系提供证书方,godaddy客服则表示ocsp是什么鬼,没听过。好不容易折腾好了之后,总结了一下在整个折腾过程当中涉及到的一些命令。

首先是key和csr生成的相关命令:

openssl req -new -newkey rsa:2048 -nodes -keyout site.key -out site.csr

过程中会有数个问题,分别填写如下信息:

问题 说明
Country Name 国家代码,用2个字母表示,比如CN
State or Province Name 省份,填写全称,可省略不填,比如Jiangsu
Locality Name 城市,可省略不填,比如Changzhou
Organization Name 组织名
Organizational Unit Name 组织单位名
Common Name 通用名,一般用域名,比如sillydong.com

extra attribute中还需要填写一个密码和邮箱,密码和邮箱均可以省略,不过邮箱填一下也没啥损失。

生成的site.csr文件中内容将用于申请证书,需要的时候直接用文本编辑器打开后复制内容。

如果在nginx配置过程中直接使用上面的site.key,那就会在每次重启nginx时要求输入密码才能继续。这对自动化操作来是很不方便的,所以要生成一个无密码版本的key,使用下面的命令:

openssl rsa -in site.key -out site.nopass.key

在nginx中使用site.nopass.key可以免去每次输入密码的繁琐步骤。

查看csr文件信息命令:

openssl req -in site.csr -noout -text

查看证书文件信息命令:

openssl x509 -in site.crt -noout -text

查看证书fingerprint的命令:

openssl x509 -in site.crt -noout -fingerprint

接下来是证书及https验证相关的命令:

openssl x509 -in site.crt -noout -subject

这个命令用来检查证书的主体,可以查看到证书的域

openssl x509 -in site.crt -noout -ocsp_uri

这个命令用来查看证书的ocsp地址,比如godaddy的就是ocsp.godaddy.com

openssl ocsp -issuer gd_bundle-g2-g1.crt -cert site.crt -no_nonce -text -url http://ocsp.godaddy.com -text -respout stapling_ocsp

这个命令可以将ocsp验证结果写入stapling_ocsp文件,这个文件可以直接使用在nginx的https配置中,并且使用文件可以让nginx不做网络请求验证,直接使用此文件中结果内容。

也是通过这种方式,将我本地生成的结果直接配置到服务器上,才避开了服务器无法请求到godaddy的ocsp地址的问题。

openssl s_client -connect sillydong.com:443 -status –cafile gd_bundle-g2-g1.crt -tlsextdebug < /dev/null 2>&1

这个命令可以查看https请求的证书相关信息,如果只关注ocsp的信息,可以在后面跟上grep,如下

openssl s_client -connect sillydong.com:443 -status –cafile gd_bundle-g2-g1.crt -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"

这个命令执行之后,如果看到以下内容,那么恭喜你,ocsp配置成功啦!

OCSP response: 
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response

拿到了stapling_ocsp文件之后,nginx的配置过程就是相当简单的。

一般在godaddy上购买证书之后可以下载,拿到一个压缩包,包含了站点证书和中间证书,两个crt文件,nginx需要将两个crt文件合成在一起

cat site.crt gd_bundle-g2-g1.crt > combined.crt

不合成一个文件使用的话,在进行安卓或者ios开发中,调用https接口会报错,比如ios上存在报-1002的情况,合成之后这个问题就可以解决。

nginx的全套ssl配置内容如下

ssl_certificate      /home/certs/combined.crt;
ssl_certificate_key  /home/certs/site.nopass.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-SHA384:AES256-SHA256:HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!AESGCM;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_stapling on;
ssl_stapling_verify on;
ssl_stapling_file /home/certs/stapling_ocsp;
ssl_trusted_certificate /home/certs/gd_bundle-g2-g1.crt;
resolver 114.114.114.114 valid=300s;
resolver_timeout 1s;
add_header Strict-Transport-Security "max-age=31536000";

这样配置之后使用上面验证ocsp的命令测试可以得到正确的结果。

总结一下,这个故事告诉我们,不要买godaddy的ssl!不要买godaddy的ssl!不要买godaddy的ssl!