随着互联网安全越来越被重视,几乎所有的大网站都已经默认启用了https协议,浏览器输入http网址也会自动跳转到https,比如百度、腾讯、搜狗、谷歌等等。简单来说就是https协议数据更加安全,只有收发双方通过加密解密算法才能知道数据,中间人拦截到的都是加密后的,没有密钥是无法解密的。
一个https的加密解密过程会用到两种算法:
1,非对称加密RSA:
私钥加密,公钥解密。公钥加密,私钥解密。就是说一共俩密钥,收发双方,各有一个。
非对称加密可以加密的数据量比较小,用来把第二步要用到的对称加密的密钥进行加密解密。
2,对称加密:使用同一个密钥,用来加密解密。通过第一步的公钥,解出来对称加密的密钥,用这个密钥对传输数据加密,服务器端解密。
现在微信小程序,IOS开发等很多地方都要求接口必须是https的。所以我整理一个免费获取https证书的步骤:
首先,你要有一个域名,域名现在也很便宜,有一个linux服务器。这些某某云都能买到。
linux以centos为例,其他的也都类似。安装nginx(这个不解释,如果这个也不知道是啥,就肯定也不会去申请https)。
然后免费https证书提供商最著名的https://letsencrypt.org/
点击Get Started按钮
看红色框标记处,这里会用到另外一个网站Certbot。
letsencrypt网站是提供https证书,certbot网站是提供一个自动化工具,强烈推荐使用,这个工具可以自动解析nginx配置文件,并把证书下载下来,然后自动修改nginx配置文件里的https配置,最重要的是letsencrypt的免费证书是3个月有效期,certbot工具可以到期帮你自己更新证书,免去了你自己忘了重新申请证书,造成https证书过期。
ssh到linux以后,执行yum install certbot python3-certbot-nginx,如果不是root用户登录,执行sudo yum install certbot python3-certbot-nginx。如果是python版本很低,或者yum库里的cerbot版本是基于python2的,那么certbot的nginx插件是python2的命令就改为yum install certbot python2-certbot-nginx即可
在nginx中配置好域名
server { listen 80; server_name www.*****.com; #自己的域名 root /usr/share/nginx/html; include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } }
然后执行certbot --nginx,非root用户执行sudo certbot --nginx
按照步骤填写邮箱,然后yes yes,就会自动读取你本地的nginx的配置了,会列出来本地的所有的nginx里配置的域名,然后根据自己的情况填写域名序号就行了,比如我这个就填1就是第一条域名
稍等片刻,申请成功,密钥文件的路径都会在提示里显示出来。
再次打开nginx的配置文件,发现里面的变化,主要是做了两部分工作,第一把原来的域名改为了443端口,https,配置上证书路径,第二部分,80端口监听自动跳转到https
server { server_name www.***.com; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; location / { } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/xiaochengxu.txcf77.com/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/xiaochengxu.txcf77.com/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.***.com) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name xiaochengxu.txcf77.com; return 404; # managed by Certbot }
执行nginx -s reload,重新加载nginx配置文件。
输入原来的http://www.***.com域名,自动跳转到https,并且旁边提示一个小锁,说明正常跳转了https,大功告成!
查看证书信息,可看到证书有效期只有3个月。
下面我们看看怎么实现自动更新证书,首先certbot renew命令是用来更新证书的,如下图所示,命令会判断当前证书是否到期,如果没到期是不会更新的,有了这个自动判断功能就好办了。
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
执行命令,稍微懂点python的都能看懂,这是做了一个定时任务的脚本,每天的0点和12点会运行脚本,来执行certbot renew来更新证书,一劳永逸了。
还有记得先看起系统的crond服务是否启动了。
systemctl status crond 查看定时服务状态
systemctl start crond 启动服务
systemctl enabel crond 把定时服务添加到开机自启动
至此你已经拥有了自己的永久免费的https了。