https 取不到session_从 http 到 https 的升级之路

这不是一篇教程,所以在这里你看不到"干货"。它更像是一篇流水帐,记录了我们的公众号官网-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,是搜代码。

acf4497834b6106bf7d646e5fa5955b3.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值