用自签名SSL证书配合 CloudFlare 免费SSL构建全站HTTPS加密

CloudFlare有免费的SSL证书,如果仅仅是在CloudFlare后台中开启它的话,并不能做到全站加密,只能开启Flexible模式,而不是Full模式。

进入CloudFlare后台->SSL/TLS,可以看到第一项就是免费提供的SSL。这里有4种模式可选:Off(关闭SSL)、Flexible(视情况而定)、Full(全部加密,需要在服务器上部署证书,但CloudFlare不会检查证书的有效性)、Full(Strict)(严格模式,也就是全部加密,而且CloudFlare会检查服务器上的证书是否有效)。
ssl.png

在这里,我们的目标是开启Full模式,实现方式是:首先自签一个泛域名的证书,然后在Nginx中设置通过HTTPS访问网站,最后到CloudFlare中设置一下SSL模式。

当然,如果你是个强迫症患者,非要开启Full(Strict)模式,也是可以的,但服务器上就不能部署自签名的证书了,而需要一个有效机构颁发的证书,例如letsencrypt的证书。然而缺点显而易见:需要定期续期。使用自签名证书就不存在这个问题了,你想签多长时间的有效期就可以签多长时间,更换服务器时,也仅需要把证书文件拷到新服务器上。

准备工作

第一步,当然是确保你的DNS是CloudFlare的!

第二步,安装签发证书工具:OpenSSL

dpkg系:

apt-get install openssl

rhel系:

yum install openssl

签发证书

首先建立一个制作、存放证书的目录:

mkdir certificate

进入该目录,然后签发一个根域名的CA证书,第一步创建一个私钥ca.key:

openssl genrsa -des3 -out ca.key 2048

第二步,生成CA根证书(公钥):

openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

命令中,-days后面的7305是指证书的有效期,以天为单位,这里设置成了20年,手动滑稽。
执行命令后会让你填一堆地区、组织什么的东西,随便填就好,但注意期间会让你填写common name,也就是域名,这里填入的是你的根域名,例如eaimty.com。最后,你就得到了一个根域的CA证书。

之后生成一个给泛域名用的私钥:

openssl genrsa -des3 -out yourdomain.com.pem 1024

解密私钥:

openssl rsa -in yourdomain.com.pem -out yourdomain.com.key

生成签名请求:

openssl req -new -key yourdomain.com.pem -out yourdomain.com.csr

这一步中common name要填入泛域名,如*.eaimty.com,这样生成的证书可以供所有子域使用。

下一步还不能直接执行签名,否则会报错,要先修改一下openssl的配置文件:

vi /etc/pki/tls/openssl.cnf

找到其中的dir = ,把值改成./ca。

然后在你签发证书的工作目录中:

mkdir -p ca/newcerts

touch ca/index.txt

touch ca/serial

echo "01" > ca/serial

这样就可以正常执行签名了:

openssl ca -policy policy_anything -days 7305 -cert ca.crt -keyfile ca.key -in yourdomain.com.csr -out yourdomain.com.crt

这一步中的参数和上一步中的意义相同。
最后你会得到一个yourdomain.com.crt文件,把ca.crt中的内容粘贴到yourdomain.com.crt的最后,证书就签发完成了。

准备好yourdomain.com.crt(网站证书)和yourdomain.com.key(网站私钥),开始配置Nginx!

配置Nginx

这一步很简单,找到你的网站(所签发泛域名的所有子域名都可以用)的Nginx配置文件(通常是/etc/nginx/conf.d/下的XXX.conf),
修改server{}段listen 443 ssl;,添加ssl_certificate /path/to/yourdomain.com.crt;和ssl_certificate_key /path/to/yourdomain.com.key;两行。

测试Nginx的配置文件是否有错:

nginx -t

注意看是否报错。
重启Nginx:

systemd发行版:# systemctl restart nginx
init.d发行版:# service nginx restart

如果不确定是哪种发行版的话两个命令都试一试。

设置CloudFlare

进入CloudFlare管理界面,将Crypto->SSL改为“Full”。

现在通过浏览器进入https://你的网站/,你就会发现小绿锁出现了!就说明我们成功了!

最后设置一下http自动跳转至https,全站SSL就实现了。

Last modification:November 26th, 2019 at 11:10 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment