在上篇文章《【实战 Ids4】║客户端、服务端、授权中心全线打通!》中,我们正式的将三站打通,发布过后,有小伙伴反馈,可能Nginx对配置HTTPS安全协议有点儿问题,我也就半夜趁着没人打扰,疯狂的研究一波,发现其实挺简单的,不知道是不是我没有理解小伙伴提出的疑问点。
好了,马上开始。
其实关于配置HTTPS,主要的就是证书的问题,证书呢,又是公钥和私钥的方案,剩下的就是配置了,归根结底,只要我们搞到证书就行了,这里常见的是两种方案:
1、OpenSSL本地安装;(不推荐)
2、云平台免费申请SSL证书(本文讲的是腾讯云);
那我就简单的说说这两种方式吧。
OpenSSL本地安装
这种方案呢,主要是如果自己没有云服务平台,没有其他的信息,或者不想麻烦,只是想本地测试一波,可以简单的这么搞搞。
1、安装OpenSSL工具
官网下载地址:https://slproweb.com/products/Win32OpenSSL.html
2、解压安装证书
解压安装完成后,找到安装目录,去bin文件夹下,执行命令,如果你想使用命令,需要配置环境变量,但是如果不想配置,就直接用powershell来运行exe即可:
.\openssl.exe req -newkey rsa:2048 -nodes -keyout laozhang.key -x509 -days 365 -out laozhang.cer
然后会提示让你输入一些内容,自己配置一下就行,比如我的:
这里生成了一个.key文件,还有一个.cer文件,具体的就是私钥和公钥,自己可以搜索下资料,这里不多说。
3、Nginx配置443
现在我们有了证书,就可以配置HTTPS转发了,如果你使用过IIS的肯定都知道,我们只需要配置一下443端口即可,Nginx也是如何,直接上代码:
server {listen 443 ssl; #443端口server_name ids.neters.club; #网站域名,和80端口保持一致ssl on;ssl_certificate laozhang.cer; #证书公钥ssl_certificate_key laozhang.key; #证书私钥ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!3DES:!aNULL:!eNULL;ssl_prefer_server_ciphers on;location / {proxy_pass http://ids.neters.club;proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Cookie $http_cookie;#proxy_cookie_pathchunked_transfer_encoding off; }}
基本的配置方式和80很像,前提是你得配置好80端口,然后再配置443端口。
然后我们重启nginx,查看效果.
这里要说一下,这个证书是正确的,但是却是无效的,如果你有一定的计算机网络的经验呢,就知道了,不仅仅是证书正确就行了,还需要进行校验,比如常见的是:
1、文件校验;
2、邮件校验;
3、DNS校验;
刚刚咱们创建的,如果配置好后,我们虽然可以可以访问https,但是连接是不安全的,因为没有校验:
那这个时候怎么办呢,既然我们有域名,肯定就有对应的DNS运行商,让他们给我配置校验就好了,直接我们就在云平台申请即可,我说下我在腾讯云的申请。
云平台申请SSL证书
过程很简单,我们只需要取ssl页面,申请个免费的即可:
然后配置上我们的域名,和校验方式,
等待官方自动校验审核,大概0.5~1个小时左右,就通过了,我们下载下来可以看到,官方很人性化的给我们提供了多个服务器版本的文件,我们打开Nginx就可以看到两个文件了:
你可能会好奇,为啥是.crt文件,上边不是.cer文件么,这个可以问问计算机网络老师。
然后我们把文件提交到服务器,重启下Nginx,就看到了绿色的了:
三方调整请求域名
这个就是很简单的,只需要把之前的域名改成https的即可:
Blog.IdentityServer:
Blog.Core:
Blog.Admin:
强制转换HTTPS
如果说,你不想用http了,可以配置强制转到https上,nginx还是很强大的,我测试过可以,无论是重写的方式,还是return的方式,但是目前不想强制转换,大家自己试试就知道了。