Django 生成 ssl 安全证书,切换 https、wss协议(daphne 、nginx)

Django 普通 http 协议不够安全,无法支持连接本地摄像头(虽然在本地 localhost 上能连),此时需要切换成 https协议(先提个醒,我这个方法最后失败了,不过对您应该也有帮助)

目录

配置证书

[Django 配置 https](#Django 配置 https)

安装证书

[Nginx 反向代理](#Nginx 反向代理)


配置证书

打开终端管理员,安装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
    • 如果不适用,可以直接按回车留空。
  • 建议:根据需要输入,或者留空。

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 中启用 HTTPSWSS ,但是 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 反向代理、生成自签名证书并安装等等,相信对你也有所帮助。

感谢您的阅读!!!

相关推荐
一个网络学徒9 分钟前
MGRE综合实验
运维·服务器·网络
我的ID配享太庙呀13 分钟前
Django 科普介绍:从入门到了解其核心魅力
数据库·后端·python·mysql·django·sqlite
C++ 老炮儿的技术栈19 分钟前
在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
linux·运维·c++·git·ubuntu·github·visual studio
墨痕砚白29 分钟前
VMware Workstation Pro虚拟机的下载和安装图文保姆级教程(附下载链接)
服务器·windows·vmware·虚拟机
白鹭1 小时前
基于LNMP架构的分布式个人博客搭建
linux·运维·服务器·网络·分布式·apache
java叶新东老师1 小时前
linux 部署 flink 1.15.1 并提交作业
linux·运维·flink
程序员JerrySUN2 小时前
Linux系统架构核心全景详解
linux·运维·系统架构
无敌的牛2 小时前
Linux文件理解,基础IO理解
linux·运维·服务器
angushine2 小时前
鲲鹏服务器logstash采集nginx日志
运维·服务器·nginx