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

发布于:2025-03-30 ⋅ 阅读:(30) ⋅ 点赞:(0)

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

目录

配置证书

Django 配置 https

安装证书

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

感谢您的阅读!!!


网站公告

今日签到

点亮在社区的每一天
去签到