基于 SSL 证书,可将站点由 HTTP(Hypertext Transfer Protocol)切换到 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),即基于安全套接字层(SSL)进行安全数据传输的加密版 HTTP 协议。
背景:众所众知,一台服务器开放80端口后我们可以直接IP地址访问到web页面,但ip地址暴露会可能会引起一些莫名的网络攻击。通常采取的策略就是去申请一个域名,经过域名绑定我们的ip就可以实现直接使用域名来访问,但80端口还是开放的,这样就使用到基于SSL的https了,简而言之就是更安全更方便了。可能某些同学会说我们可以改端口号,IP地址都懒得记那无疑会影响到我们装B不是。。。
备案也没想象中那么严格,很简单,2天就审核通过了。这里就直接说最后一步了,安装SSL证书,示例的环境是:windows server 2019 + nginx + flask
参考官方文档:https://cloud.tencent.com/document/product/400/47361
ssl.conf文件内容如下:
server {
listen 443 ssl; # 监听443端口
server_name gzncpcc.xyz; #你的域名
ssl_certificate C:/gmssl/nginx-1.16.0/conf/ssl/gzncpcc.xyz_bundle.crt; #ssl证书的crt文件路径
ssl_certificate_key c:/gmssl/nginx-1.16.0/conf/ssl/gzncpcc.xyz.key;
ssl_certificate c:/gmssl/nginx-1.16.0/conf/ssl/gzncpcc.xyz_bundle.pem; #ssl证书的pem文件路径
ssl_certificate_key c:/gmssl/nginx-1.16.0/conf/ssl/gzncpcc.xyz.key;
#先配置签名证书,再配置加密证书,签名加密证书私钥 key 为同一个!
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers SM2-WITH-SMS4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.0.0.17/; #/内网地址,这样就可以关闭服务器的80端口了
# proxy_pass http://gzncpcc.xyz/; #//公网地址:项目端口号;http://gzncpcc.xyz/;
}
}
server {
listen 443 ssl; # 监听443端口
server_name blog.gzncpcc.xyz; # 对应子域名
ssl_certificate C:/gmssl/nginx-1.16.0/conf/ssl/blog.gzncpcc.xyz_bundle.crt; #ssl证书的crt文件路径
ssl_certificate_key c:/gmssl/nginx-1.16.0/conf/ssl/blog.gzncpcc.xyz.key;
ssl_certificate c:/gmssl/nginx-1.16.0/conf/ssl/blog.gzncpcc.xyz_bundle.pem; #ssl证书的pem文件路径
ssl_certificate_key c:/gmssl/nginx-1.16.0/conf/ssl/blog.gzncpcc.xyz.key;
#先配置签名证书,再配置加密证书,签名加密证书私钥 key 为同一个!
ssl_session_timeout 5m;
ssl_protocols TLSv1.2;
ssl_ciphers SM2-WITH-SMS4-SM3:ECDH:AESGCM:HIGH:MEDIUM:!RC4:!DH:!MD5:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:4000/; # 博客项目
}
}
踩雷经验
- 没事多重启,把nginx关死再运行,把所有进程杀死。 否则也不会让我一直改到怀疑人生了,几个小时,什么资料都查了,就是反代理不上,改到怀疑人生,一直出现welcome nginx。。。
- 如果用了
https
,HTML页面引用的链接也要使用https的,例如引用
+ <script src="https://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
+ <script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
- <script src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
- <script src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
下面附上windows上的nginx常用操作指令
可以杀死名字为nginx.EXE的所有进程:taskkill /fi "imagename eq nginx.EXE" /f
检查: nginx.exe -t
运行:nginx.exe
重载:nginx.exe -s reload
停止:nginx.exe -s stop
查找端口占用情况:netstat -aon | findstr :80
ps:都是在cmd中执行,其他什么shell、git没有效果。。。
避免端口冲突,需要将IIS中的80和443端口占用关闭;python程序也可以自定义端口来避免冲突,但相应的ssl.conf中的proxy_pass http://10.0.0.17/;
需要加上端口号。
正确的运行顺序:nginx——>python程序
最后附上网址看成果:https://gzncpcc.xyz/