SSL证书生成步骤 or how to ssl
场景
网站需要启用 HTTPS 访问,因为自签名的证书现在面临浏览器厂商和颁证机构的联合围剿。 可以说,除了开发状态下,实际线上完全没什么卵用。所以,你需要花钱买一个证书。 下面介绍下如何去搞这个东西。也是备忘下,因为反复搞了几次,结果每次都记不住一些参数。
准备步骤
$ openssl req -nodes -newkey rsa:4096 -sha512 -out request.csr -keyout private.key
openssl // 这个不做解释
req // 这个是 openssl 中用来处理证书申请请求的
newkey // 生成一个新的私钥
rsa // 私钥长度,常用的 2048,建议设置 4096。这个当然和安全强度相关
sha512 // 常用的加密算法
keyout // 私钥生成后保存的路径,以及文件名
out // 用来申请证书的请求文件,同样可以指定路径和文件名
接下来需要回答一系列的问题,不同的 OpenSSL 版本会有所不同。。。
首先就要求我们为要生成的私钥创建一个密码,这个一般来说,直接回车跳过。

注意 PEM pass phrase 密码不能随便输入,它是用来保护你的私钥的。而且服务器(nginx, apache)每次启动都需要输入一次这个密码,要不然无法正常启动。
接着就是一大堆无聊的项目需要填写一下。
特别需要注意的就是 common name 这一项,这是你需要指定域名的地方。
比如我就是填写了一个通配的 *.domain.com

申请步骤
完成了上述准备步骤,你就会得到两个文件了。一个 private.key 的私钥文件,一个 request.csr 申请文件。 然后,你就需要拿着这个 reqquest.csr 去申请 SSL 证书了。
到处都是证书颁发机构,但是,他们都有一个共同点,就是——要钱! 需知,没有免费午餐。现在的证书都是要钱买的。 比如,本座就是在 Comodo 申请的。(麻蛋,这家伙不是做防火墙的么😓)

最终,你会得到这样一些文件。 当然,各个机构会有所不同。有的可能会只给你一个合并到一起的单个文件。

然后,我们需要合并一下这几个文件,顺序必须一致,不能乱来。
合并的先后顺序是按照下面的顺序排列的
被授权证书 > 上级证书 > 根证书
我们切换到存放以上证书的目录,执行 cat
cat STAR_domain_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt
配置 Nginx
现在,你已经有了一大堆的证书什么的。但是,其他的都可以扔掉了。
只保留这两个 private.key 和 ssl-bundle.crt,将他们存放到特定的目录。
比如 /etc/nginx/ssl/
然后,开始配置 nginx,下面几项是必须的,其他更高级的玩意就不讨论了。
server {
listen 443;
ssl on;
ssl_certificate /etc/nginx/ssl/ssl-bundle.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;
}
最后,重启下 nginx。找个平台验证下 SSL 证书生效否。 比如 https://www.ssllabs.com/ssltest/

曰
其他的都不重要,钱才是最重要的。太 TM 跪了。。 还有就是,千万别去用国内的那些机构申请。 像 Chrome 这些浏览器几乎已经把整个国内证书机构拖进黑名单了。
特别提示
如果在创建私钥(private.key)时,PEM pass phrase 的地方输入了一个密码。会导致 nginx, apache 等启动失败。
因为那个密码是用来保护私钥的,每次启动 nginx 等都需要输入一遍该密码。
去除的方法
openssl rsa -in private.key -out new.key
执行上述指令,会要求你输入一遍密码。然后生成一个新的 new.key
用这个 new.key 替换到之前的 private.key 就可以了。
OpenSSL 其他指令参考 OpenSSL Command Cheatsheet
由于验证速度相差比较大,因此建议用 rsa:2048 和 sha256 相组合
openssl speed rsa2048 rsa4096
以上命令可以测试两者的签名及验证速度,主要跟CPU性能有关
