生成和配置免费的https证书
最近在做小程序,调用后台接口需要https协议请求,小程序之所以这么要求,也是因为http协议是明文传播文件数据的,出于数据安全考虑,必须使用https协议。
http想实现为https 就需要为配置ssl,及其使用的证书。这些在http里有专门的mod_ssl模块来支持。
yum -y install mod_ssl #安装mod_ssl模块
安装该模块后,它会自动修改配置文件,增加LoadModule ssl_module modules/mod_ssl.so在httpd的子配置文件/etc/httpd/conf.d/ssl.conf里,同时也打开了443端口,同时指定了证书的存放路径。原因是安装的时候,安装包里会有脚本去生成私钥文件/etc/pki/tls/private/localhost.key,同时也生成证书文件/etc/pki/tls/certs/localhost.crt,而这个证书文件是自签名的,此时https网站已经可以访问,但是由于这个https服务器的证书有问题,颁发给的机构不对,不是对应的站点名称。所以需要要重新向CA申请,在获取CA颁发的证书后才能正确使用https站点。(参考:https://www.cnblogs.com/54db/p/7635254.html)(了解CA机构:https://zhidao.baidu.com/question/753682127954233484.html)
既然默认的证书不能使用,那就得自己生成了,这里网上有很多资料,可以参考微信公众平台的开发文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=10_4;文档中的操作步骤很详细,但是最关键的一步:3、将生成的csr文件提交给第三方证书颁发机构申请对应域名的服务器证书,同时将私钥文件保存好,以免丢失。我做到这,就顺便了解了,CA机构还不少,这一步具体怎么操作,就不太清楚了,所以在这个时候就去查有哪些机构,想了解的可以参考知乎上的这个链接:https://www.zhihu.com/question/19578422;了解之后,觉得Let's Encrypt这一家还可以,主要是支持免费,所以就尝试了。
注:下文中域名:test.example.com
不代表真实域名,读者改成自己的域名即可。(参考:https://www.cnblogs.com/mawang/p/6758728.html)
环境说明:
centos 7
nginx 1.12
前期准备
软件安装
yum install -y epel-release
yum install -y certbot
创建目录及链接
方法1:在网站根目录下创建一个.well-known的目录
方法2:
mkdir -p /usr/share/nginx/html/.well-known
配置nginx
server {
listen 80 default_server;
server_name test.example.com;
index index.html index.htm index.php;
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 certonly --webroot -w /usr/share/nginx/html -d test.example.com
根据提示进行操作,一般可以正常生产证书文件。
证书文件的目录存放在: '/etc/letsencrypt/live/test.example.com/'
会有4个文件:
cert.pem
chain.pem
fullchain.pem
privkey.pem
nginx配置443端口
server {
listen 443 ssl http2;
server_name test.example.com;
index index.html index.htm index.php;
root /usr/share/nginx/html
;
ssl_certificate /etc/letsencrypt/live/test.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.example.com/privkey.pem;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
access_log off;
}
定期更新
crontab -e # 新增如下定时任务
10 6 * * * /bin/certbot renew --quiet &>/dev/null
Let's Encrypt 的证书有效期为90天,如果证书的有效期大于30天,则上面命令不会真的去更新证书的。
https测试
在浏览器输入 https://example.com 网址进行验证