这不是一篇教程,所以在这里你看不到"干货"。它更像是一篇流水帐,记录了我们的公众号官网-Angular完全开发手册从http升级到https的整个过程,以及其中的一些坑。
整个升级过程主要参考了 Secure Nginx with Let's Encrypt on CentOS 7这篇文章,如果你也有同样的需求,强烈建议拜读一下,这篇记录中的代码均引用自此。
升级的原因
最近仔细看了一下微信小程序的开发流程,于是想体验一下,但是一方面没想好做什么,另一方面是懒癌晚期,于是乎想直接在官网的后台给小程序提供一些接口,但是和微信服务器通信的过程只支持https协议,这才想起了Angular完全开发手册现在还在用http。虽然这似乎不影响后台通信,无奈强迫症犯了,更何况看到Chrome一直在不遗余力的提示'您与此网站建立的连接不安全’,多少心里有点不爽,NND我升还不行么。
升级环境
服务器
cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
nginx -v
nginx version: nginx/1.12.2
域名自然就是: www.hijavascript.com
证书用Let's Encrypt,谁让咱穷呢,就是喜欢免费的午餐,尴尬。
Let's go!
以下基本就是按照Secure Nginx with Let's Encrypt on CentOS 7所描述的进行了。
sudo yum install epel-release
一个给 Red Hat 和 CentOS 提供软件包的仓库,人家让装咱就装吧。
sudo yum install certbot
Let's Encrypt建议的工具,主要用它来生成证书,以及给证书续期,据说可以自动化配置web servers,不过话说在网上搜索了一大堆教程,愣是没有搞明白它怎么自动配置了,甚至按其它教程上的指示,连/etc/letsencrypt 这个文件夹都没生成出来,一股无名的怒火无处发泄。。。。淡定,淡定,不能激动。
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
这一步的作用是让我们能够在不安全的通信通道上安全的交互密钥。接下来就是整个升级的关键所在了:
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp nginx /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
sudo mkdir /etc/nginx/snippets
在/var/lib/letsencrypt下创建了个临时文件,主要是供 encrypt 的服务器验证的时候使用。那3个linux命令相信一看就明白,实在不明白google一下也很快就明白了。最后一行命令按原文的意思是,为了避免代码重复,说实在的不太懂,有懂的同学望留言解释下,Thanks!
/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
/etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
创建了这两个文件之后,接下来就是要进行验证了,激动人心的时刻
sudo certbot certonly --agree-tos --email 邮箱就匿了 --webroot -w /var/lib/letsencrypt/ -d hijavascript.com -d www.hijavascript.com
按照预期应该出现下面的回显
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2018-06-11. 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
But,报错,ImportError: No module named 'requests.packages.urllib3',作为一名码农太不容易了,好在咱已经熟练的掌握了面向google搬砖,一顿搜索,原来是python版本的问题:
pip install requests urllib3 pyOpenSSL --force --upgrade
pip install --upgrade --force-reinstall 'requests==2.6.0'
运行之后印象中还有些包的版本是错误的,不过貌似不影响升级,随它去吧。
至此验证工作完成,改改 nginx 配置, https 应该就可以登场了吧,忍不住的激动啊~, 下面是需要新增的内容,其它的还是原来的味道
...
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/hijavascript.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hijavascript.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/hijavascript.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
...
重启一波nginx,走起
sudo systemctl reload nginx
又是错误,‘Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.’ 我努力的忍住不说脏话,又是一顿搜,方法真的是五花八门啊,试过之后那是相当的迷茫,绝望。忽然搜到Centos7编译安装nginx问题?的时候,原来答案如此简单,此刻只想吟诗一首:乱花渐入迷人眼,浅草才能没码蹄~~!。于是默默的打开nginx配置,补上那个丢失的分号,:wq,就是这么娴熟。
地址栏里输入https://www.hijavascript.com,senter,看到页面刷新,先点根烟缓解一下这紧张的情绪。
咦,貌似地址栏边上还没有变成小锁,提示此网站的连接并非完全安全,再仔细一看页面,靠,怎么有的数据显示了,有的没有显示。再登录一下看,居然登录不上。
网站代码改造
出现上面的问题其实也很好理解,并非完全安全,那就是说有的连接是https有的不是,一个一个解决就可以了。
首先是生产环境的 uri 需要改成 https,前端代码 'environment.prod.ts' 把 http 改成 https。
网站上的图片有一部分是保存在七牛上的,为了让之后上传的图片链接都是https,登录七牛,配置一下 cname,强制使用https。
已有图片的链接在数据库存里保存的是http,也要改成https,这里可以改前端代码,也可以改后端代码。改前端代码的话要变的地方有点多,综合考虑还是在后端改,整一个功能函数,来个正则,搞定。
网站的登录使用的是 github 的 OAuth 验证,在github设置里把主页地址和回调地址都改成 https 的。
OK,部署,刷新,页面正常,地址栏旁边小锁出现。cheers!
哎,春光大好,我却用它来写代码,oh no,是搜代码。