前两天个人小站域名到期(其实也是忘续了),有点空就收拾了一下,申请了新的域名上线。 带来的问题是,站点一直用 https,换域名后原 ssl 签名证书也就无效了,这又得再申请一个。
以这个契机,就来完整的说一下 https 站点 ssl 证书的 生成/获取、服务器配置(以 nodejs 为例) 方法。
ssl 证书生成生成和 获取 是两种得到签名文件方法。 自己生成的一般都是非法的,只用于非正式环境等,要是线上的话,唯一途经就是去正规证书颁发机构去申请,有时也会遇到自己生成签名的时候,下面给出一个很简单的方法。
大致分为三步
生成自己的私钥 和 CSRopenssl req -new -newkey rsa:2048 -nodes -keyout ca.key -out ca.csr
这一步需要填写一些 ca 机构的相关信息,如国家、地区、邮箱等等,大家就按提示一步一步往下走就OK了。
生成签名openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out cert.crt
node 服务器配置运行后会生成三个文件,实际只需要两个,因为没有 ca 机构证书,当然 ca 文件也可以自己生成,但实际没有意义,一般用两个文件按以下配置就行:
{ key: fs.readFileSync('SSL/ca.key'), cert: fs.readFileSync('SSL/cert.crt') } ssl 证书获取这个过程因为是在第三方机构上申请,所以就麻烦不少。我个人从 Wosign 和 Let’s encrypt 上面申请过,两个过程完全不同,下面就分别说一下。
Wosign 沃通沃通 是国内最大 ssl 签名颁发机构,之前也推出过免费证书业务,但是去年底停止了,据说是因为免费证书申请的审核不严,加密算法还用的是 sha-1,遭到 mozila 和 google 的联合抵制,然后就玩完了。 不过它的收费业务还是有效的,大家可以放心申请。
过程相对比较简单,填写一张表单就行,它同时会对你要申请的域名进行检测,没有备案要求,等一切步骤走完,就可以领取一个装有签名文件的压缩包,压缩包是加密的,密码只能人从 wosign 领取一次,打开后一定妥善保管。
里面一此文件夹按常见服务器的分类,实际内容都一样,方便用户一下找到,但是没有 nodejs 的,实际用 apache 的那套证书就可以了,如下:
// xxx 是你申请的域名,注意前的文件序号就行 { key: fs.readFileSync('3_xxx.key'), cert: fs.readFileSync('2_xxx.crt'), ca: fs.readFileSync('1_root_bundle.crt'), } Let’s encryptLet’s encrypt 现在影响力越来越大,是 mozila 和 google 合力为了推广 https 而支持的技术提供站点(看了一眼沃通:bulb:~?)。 只提供免费的证书,但你可别想简单了,google 推的东西技术含量都不低。 笔者刚一上去也没反应过来,而且市面上相关资料很少,硬着头皮看了一个多小时的英文文档才开始下手搞起。:tired_face:
它的获取方式不像传统申请审核那样中规中矩,一切通过设计好的命令和代码搞定,中间没有人工干预。 签名文件在获取过程中都是隐式的,直接生成在你的服务器上,从面解决了签名在网络上传输的安全问题,而且对一些常用的服务器,如 nginx,它还会自动识别、自动部署签名,非常腻害。 但是没有 nodejs 的。。。
实际过程中自动化程度非常高,需要操作的步骤也很少,但前提是要弄明白怎么回事,否则下不了手。。。以 centOS_7 为例,说一下获取过程,也是本文的重点内容。
安装 certbotcertbot 是自动获取证书的一个命令工具包,也是所有过程的前提,安装这个比较简单,用 yum :
$ sudo yum install certbot
注:如果没有此工具,先运行一下: $ yum install epel-release
自己站点的准备 保证自己站内对外访问良好 提供一个类似静态资源目录的对外可访问目录,如:/usr/www/static/,使得对外链接 www.your_web.com/aaa/bbb.js 可以访问到 /usr/www/static/aaa/bbb.js 文件 命令行获取以上都准备好后,就开始正式获取了。运行:
$ certbot certonly
------------------------------------------------------------------------------- 1: Place files in webroot directory (webroot) 2: Spin up a temporary webserver (standalone) -------------------------------------------------------------------------------会出现两种获取方式的选择,我先的是第一种,感觉更方便一些。
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):输入你的站点域名,用逗号/空格分隔: 比如 xxx.com, www.xxx.com
------------------------------------------------------------------------------- 1: Enter a new webroot -------------------------------------------------------------------------------到了这一步稍麻烦点,它是让你输入本地站点目录的绝对路径,不过不一定就是你想得这样。 它的目的是要检测你对该网站的控制权,要在你输入的目录里放置静态校验文件,然后进行远程校验, 所以我们需要把网站的静态资源文件目录给它,要求再回去看 自己站点的准备 那一节。
如我们输入: /usr/www/static 就行。
如果你之前绑定只是一个域名,到这就结束了,如果多个域名的话,会显示:
Select the webroot for www.xxx.ml: ------------------------------------------------------------------------------- 1: Enter a new webroot 2: /root/www/static -------------------------------------------------------------------------------如果目录一致,我们可以直接 2。
签名文件的使用上述过程成功后,会提示:
Waiting for verification... Cleaning up challenges Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/xxx.ml/fullchain.pem. Your cert will expire on 2017-06-07. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le同时在 /etc/letsencrypt/ 路径下生成一组签名文件:
accounts archive csr keys live renewal其中我们需要的是 live 那组,里面有你域名一致的一个文件夹,包含四个签名文件:
cert.pem chain.pem fullchain.pem privkey.pem和 nodejs https 的对应关系是:
// xxx 是你申请的域名,注意前的文件序号就行 { key: fs.readFileSync('privkey.pem'), cert: fs.readFileSync('cert.pem'), ca: fs.readFileSync('fullchain.pem'), }配置好,重启服务器,再打开你的站点,是不是已经变成:
过程看起来很简单,前提是你知道这个过程。以后证书就它了。
引用:
https://certbot.eff.org/docs/using.html#webroot
https://certbot.eff.org/#centosrhel7-other
https://community.letsencrypt.org/t/how-to-get-crt-and-key-files-from-i-just-have-pem-files/7348