问题描述
当小编开发完成django项目部署到后台时,忽然发现公司的服务器部署了ssl证书,所以前端获取到的页面都是以https开头的。然后问题出现了,当我修改好了ip等配置文件发起登录请求时,出现了如下错误:
错误详情:net::ERR\_SSL\_PROTOCOL\_ERROR send @ jquery-3.4.1.min.js:2 ajax @ jquery-3.4.1
大体意思就是https页面不能访问非http请求
这就很鸡贼了,哈哈哈,于是开始各种百度,这对于我这种小菜鸡来说还挺头疼的,但是问题总会有解决方法的哈!
相关知识普及
什么是http?
超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法。
什么是https?
《图解HTTP》这本书中曾提过HTTPS是身披SSL外壳的HTTP。HTTPS是一种通过计算机网络进行安全通信的传输协议,经由HTTP进行通信,利用SSL/TLS建立全信道,加密数据包。HTTPS使用的主要目的是提供对网站服务器的身份认证,同时保护交换数据的隐私与完整性。
PS:TLS是传输层加密协议,前身是SSL协议,由网景公司1995年发布,有时候两者不区分。
http vs https
无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,比如访问一个网站需要反复进行登录操作
无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。比如某个客户机在短时间多次请求同一个资源,服务器并不能区别是否已经响应过用户的请求,所以每次需要重新响应请求,需要耗费不必要的时间和流量。
基于请求和响应:基本的特性,由客户端发起请求,服务端响应
简单快速、灵活
通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性
问题解决
问题分析
出现该问题大概就是解决http与https两个页面与请求之间不互通的问题咯
解决方案 1
撤销服务器ssl证书,恢复http访问,但是这对于一个企业来说是不现实的。
解决方案2
增加django的https访问
实际操作
参考了 https://www.cnblogs.com/kusy/p/9560458.html
1.下载创建ssl证书的工具
本地下载
链接: https://pan.baidu.com/s/1JDVMWit0CFLkgdVFX3K-Ag 提取码: ft5u 复制这段内容后打开百度网盘手机App,操作更方便哦
2. 解压
将下载的压缩包文件上传至服务器,解压到自己想存放的路径。
3. 配置
解压后找到解压目录的bin文件件,找到openssl.exe文件,双击打开指令窗口,输入如下指令进行配置,每执行一条指令,均需要配置相关参数,随意填写均可
genrsa -des3 -out server.key 2048
req -new -key server.key -out server.csr -config openssl.cnf
rsa -in server.key -out server_no_passwd.key
x509 -req -days 365 -in server.csr -signkey server_no_passwd.key -out server.crt
此时就会在bin目录下生成了对应的crt证书文件。
至此,自签名ssl证书创建完成。
4. django配置
下载配置ssl证书所需模块
pip3 install django-extensions
pip3 install django-werkzeug-debugger-runserver
pip3 install pyOpenSSL
配置INSTALLED_APPS 新增
‘werkzeug_debugger_runserver’,
‘django_extensions’,
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
'corsheaders',
'werkzeug_debugger_runserver',
'django_extensions',
]
验证
重启服务
启动指令不再是
python manage.py runserver 0.0.0.0:8000
而是
python manage.py runserver_plus --cert server.crt 0.0.0.0:8000