Django 普通 http 协议不够安全,无法支持连接本地摄像头(虽然在本地 localhost 上能连),此时需要切换成 https 协议(先提个醒,我这个方法最后失败了,不过对您应该也有帮助)
目录
配置证书
打开终端管理员,安装choco 包管理器,输入安装命令:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
验证是否按照成功:
choco --version
下载 openssl(这里下载会很慢,请耐心等待):
choco install openssl -y
若下载失败或提示下载超时可以先清理缓存:
choco cache clear --all
然后再指定最大下载时间:
choco install openssl --execution-timeout 15400 -y
验证是否按照成功:
openssl version
生成自签名证书:
openssl req -newkey rsa:2048 -nodes -keyout F:\全栈\certs\key.pem -x509 -days 365 -out F:\全栈\certs\cert.pem
如果说找不到 openssl 的可以重新下完整版 openssl,参考这篇教程:
保姆级OpenSSL下载及安装教程,OpenSSL下载及安装教程-CSDN博客
安装成功后,再次输入生成签名证书脚本
以下是每个字段的含义及如何填写:
1. Country Name (2 letter code) [AU]:
- 含义:国家代码,使用两个字母的 ISO 国家代码表示。
- 示例:
- 如果你在中国,输入
CN
。 - 如果你在澳大利亚,默认值为
AU
,你可以直接按回车使用默认值。
- 如果你在中国,输入
- 建议:输入你的国家代码,例如
CN
。
2. State or Province Name (full name) [Some-State]:
- 含义:所在省或州的全名。
- 示例:
- 如果你在北京,可以输入
Beijing
。 - 如果在美国加州,可以输入
California
。
- 如果你在北京,可以输入
- 建议:输入你所在的省或州的名称。
3. Locality Name (eg, city) []:
- 含义:城市或地区名称。
- 示例:
- 如果你在北京,输入
Beijing
。 - 如果在纽约,输入
New York
。
- 如果你在北京,输入
- 建议:输入你所在的城市名称。
4. Organization Name (eg, company) [Internet Widgits Pty Ltd]:
- 含义:组织或公司名称。
- 示例:
- 如果是个人使用,可以输入你的名字或留空(按回车)。
- 如果是公司,可以输入公司名称,例如
MyCompany
。
- 建议:根据需要输入,或者直接按回车使用默认值。
5. Organizational Unit Name (eg, section) []:
- 含义:组织中的部门或单位名称。
- 示例:
- 如果是 IT 部门,可以输入
IT Department
。 - 如果不适用,可以直接按回车留空。
- 如果是 IT 部门,可以输入
- 建议:根据需要输入,或者留空。
6. Common Name (e.g., server FQDN or YOUR name) []:
- 含义:这是最重要的字段之一,通常填写服务器的完全限定域名(FQDN)或你的姓名。
- 示例:
- 如果是本地开发环境,可以输入
localhost
。 - 如果是正式域名,输入你的域名,例如
example.com
。 - 如果是个人证书,输入你的姓名。
- 如果是本地开发环境,可以输入
- 建议:如果是本地开发,输入
localhost
。
7. Email Address []:
- 含义:联系邮箱地址。
- 示例:
- 输入你的邮箱地址,例如
user@example.com
。 - 如果不需要,可以直接按回车留空。
- 输入你的邮箱地址,例如
- 建议:根据需要输入,或者留空。
完整示例:
Country Name (2 letter code) [AU]: CN
State or Province Name (full name) [Some-State]: Beijing
Locality Name (eg, city) []: Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]: MyCompany
Organizational Unit Name (eg, section) []: IT Department
Common Name (e.g., server FQDN or YOUR name) []: localhost
Email Address []: user@example.com
然后就会在指定目录下创建 私钥文件 和 证书文件 ,输入以下命令可查看生成的证书内容:
openssl x509 -in F:\全栈\certs\cert.pem -text -noout
Django 配置 https
在 Django 中安装依赖项:
pip install django-extensions
pip install django-werkzeug-debugger-runserver
pip install pyOpenSSL
pip install service_identity
添加注册应用:
INSTALLED_APPS = [
......
'werkzeug_debugger_runserver',
'django_extensions',
......
]
通过指定证书启动服务:
python manage.py runsslserver --certificate F:\全栈\certs\cert.pem --key F:\全栈\certs\key.pem
控制台显示使用了自签名证书及其密钥。
发现虽然能启动 https ,但是会提示不安全。
安装证书
解决方法,将自定义安全证书放入浏览器中。终端进入生成证书的目录,将 PEM 格式的证书文件 (cert.pem
) 转换为 DER 格式的证书文件 (cert.cer
)。如果命令执行成功,你会在当前目录下生成一个名为 cert.cer
的文件,命令如下:
openssl x509 -in cert.pem -out cert.cer -outform DER
确实生成了 .cer 文件:
将证书导入客户端浏览器(基于 windows):
1、双击 .cer 证书,点击安装证书
2、选择将证书存储到"本地计算机",然后点击下一步
3、选择“受信任的根证书颁发机构”作为存储位置,点击确定
4、点击完成,证书成功被导入
成功安装好证书:
虽然是能调用摄像头了,说明 https 协议确实生效了,因为 http 协议在 web 端不允许通过路由跳转调用本地摄像头,只能本地,但是 websocket 却连接不上了。
python manage.py runsslserver --certificate F:\全栈\certs\cert.pem --key F:\全栈\certs\key.pem
可能这个命令无法启动 asgi,所以我们在 daphne
中启用 HTTPS 和 WSS,但是 daphne 不支持--cert-file
和 --key-file
参数。这些参数是 runsslserver
提供的功能,而 daphne
并未内置对 SSL/TLS 的支持。
Nginx 反向代理
使用 Nginx 作为反向代理
下载地址:nginx: download
启动 Nginx:
定位到刚才下载的安装包的解压路径,输入:
start nginx.exe
打开http://localhost/ 的url,你会看见欢迎页面:
停止 nginx:
nginx.exe -s stop
修改完后重新加载配置:
nginx.exe -s reload
启动:
daphne -b 127.0.0.1 -p 8001 YOLO_django.asgi:application
可以看见成功进行消费者,然而,还是 连不上 websocket ,困惑一周,已放弃本思路。
目前暂时先这样,算是烂尾了,有大佬有更好的建议可以说哦,下一篇更 localhost 调用电脑摄像头,虽然本篇烂尾了,但也学到很多东西,比如 nginx 反向代理、生成自签名证书并安装等等,相信对你也有所帮助。
感谢您的阅读!!!