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 []:
  • 含义:联系邮箱地址。
  • 示例
    • 输入你的邮箱地址,例如 [email protected]
    • 如果不需要,可以直接按回车留空。
  • 建议:根据需要输入,或者留空。

完整示例:

复制代码
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 []: [email protected]

然后就会在指定目录下创建 私钥文件证书文件,输入以下命令可查看生成的证书内容:

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

感谢您的阅读!!!

相关推荐
宅小海20 分钟前
14 配置Hadoop集群-配置历史和日志服务
linux·服务器·hadoop
Json_181790144802 小时前
python采集淘宝拍立淘按图搜索API接口,json数据示例参考
服务器·前端·数据库
Brandon汐2 小时前
Linux中常用的文件管理命令
linux·运维·服务器
神奇侠20242 小时前
快速入手-基于Django-rest-framework的serializers序列化器(二)
后端·python·django
Vacancy空白3 小时前
【Ubuntu常用命令】
linux·运维·ubuntu·ssh
老天文学家了3 小时前
课表周视图数据【示例】
linux·运维·服务器
榆榆欸3 小时前
7.从Server到Acceptor,优化Reactor模式的实现
linux·服务器·网络
开开心心就好3 小时前
便携免安装,畅享近 30 种 PDF 文档处理功能
java·服务器·python·eclipse·pdf·word·excel
爪娃侠4 小时前
解决wsl2下CentOS 7 的 yum 仓库无法连接问题
linux·运维·centos
神奇侠20244 小时前
快速入手-基于Django-rest-framework的第三方认证插件(SimpleJWT)权限认证(十)
django·simplejwt