一个日本的客户需要安装ssl,提升网站安全性。他不太会配置,让我帮个忙。

之前有配置过apache和nginx(我自己的网站和微信小程序),感觉照着服务商提供的文档就能轻松走完流程,配置好ssl。

这次出现了两个变化,一个是服务商为日本的,文档什么的都有点不太懂;还有一个就是前期生成CSR之后提交服务器都是客户自己做的,之前生成私钥和证书(aliyun)是要选择服务器类型的。这个日本服务商是否要选择服务器类型,是否选对了类型都不知道。

服务器上搭的是nginx。之前的经验是,nginx只需要配置两个文件就好(私钥key和公钥证书cer/crt)。

server {
    listen              443 ssl;
    server_name         www.example.com;

    ssl_certificate     server.crt;
    ssl_certificate_key server.key;

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5:!DH;
    ssl_prefer_server_ciphers on;
    ...
}

这次在验证域名后,下载了server.crt证书,还有之前生成的csr和私钥key文件。配置key和crt证书路径,好了之后访问https网站,并没有成功,提示域名不安全,让回到安全页面,也就是通过http访问。问了服务商,说要装中间证书。瞬间懵逼了,什么是中间证书,大概了解了一下,还是比较懵。中间证书从服务商网站下载好了,但是nginx只有两条配置。没有想apache一样有什么chain文件。客户跟我说把中间证书安装在电脑上,就能正常访问了。是,这样是可以暂时解决问题,但不肯能让所有访问你网站的用户都去下载、安装你网站的证书吧!肯定有解决方案。

这边找到了一个:Nginx SSL证书安装。提供了两个解决方案,一个是到服务商那边下载包含了中间证书的服务器证书,还有一个就是手动把中间证书内容添加在服务器证书的下方。前一个方案,因为登录不了服务器控制台而告终(服务器控制台属于服务商的一个子系统,专门负责操作域名、ssl等内容,但客户记不得账号密码了)。后一种实验证明是可行的,所以我猜测,在服务商下载的包含中间证书的服务器证书,大概处理也是合并了两个证书文件。

我们需要将中间证书chain.crt加入到服务器证书server.crt文件中,请将chain.crt中的所有内容复制,并粘贴到server.crt,顺序是: 第一段,服务器证书;第二段,中间证书,如下:

-----BEGIN CERTIFICATE-----
MIIEsTCCA5mgAwIBAgIDBfoqMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNVBAYTAlVT
………Server Certificate…………
T0hUGo/wiwTBUafyk1A+LlSUE+dYqzbHYV9Q4d83UIzz9vXO4wmSRgV0udjGN2GR
W7oiGmI=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEsTCCA5mgAwIBAgIDBfoqMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNVBAYTAlVT
………Chain Certificate…………
T0hUGo/wiwTBUafyk1A+LlSUE+dYqzbHYV9Q4d83UIzz9vXO4wmSRgV0udjGN2GR
W7oiGmI=
-----END CERTIFICATE-----

保存成server_with_chain.crt(也可以保存server.crt,这样配置就不能改了),上传到服务器。
新的nginx ssl配置:

server {
    listen              443 ssl;
    server_name         www.example.com;

    ssl_certificate     server_with_chain.crt;
    ssl_certificate_key server.key;

    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5:!DH;
    ssl_prefer_server_ciphers on;
    ...
}

附:OPENSSL工具包 - 上海讯通科技有限公司