django - 从 S3 存储桶提供的 Django 静态文件出现 ERR_CERT_COMMON_NAME_INVALID 和 SSL_ERROR_BAD_CERT_DOMAIN 错误
问题描述
我遇到了 Django 静态文件的问题。我正在使用 Django 管理员和 Django Rest 框架。我正在尝试使用 S3 存储桶为管理员和 DRF 提供静态文件。我可以成功访问存储桶中任何文件的 URL,它将加载到我的浏览器中,并且文件通过 HTTPS 提供。
我在 CloudFormation 中为 S3 存储桶创建了一个嵌套堆栈:
Description: >
This template deploys S3 buckets for serving Django static files.
Parameters:
AppUrl:
Type: "String"
Description: "The URL for our app (e.g. mydomain.com)"
AllowedPattern: "[a-z0-9._-]+"
Resources:
AssetsBucket:
Type: "AWS::S3::Bucket"
Properties:
BucketName: !Sub ${AppUrl}-assets
AssetsBucketPolicy:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket: !Ref AssetsBucket
PolicyDocument:
Version: "2012-10-17"
Statement:
- Sid: PublicReadForGetBucketObjects
Effect: "Allow"
Principal: "*"
Action: "s3:GetObject"
Resource: !Sub "${AssetsBucket.Arn}/static/*"
当我的应用程序启动时,它会运行collectstatic
并将静态文件移动到存储桶中。这是我遇到的问题:
当我使用查询参数访问 DRF URL 时?format=json
。这将返回一个 JSON 响应,其中没有来自可浏览 API 的静态文件,而且我没有看到任何错误。但是,当我访问可浏览的 API 或管理界面时,我似乎发现了三个错误消息之一。在Chrome中,我要么看到两种行为。HTTPS 已从 URL 中删除(以红色划掉),但静态资产加载时会在控制台中显示以下两个错误之一:
Access to font at 'https://mydomain.com-assets.s3.amazonaws.com/static/admin/fonts/Roboto-Bold-webfont.woff' from origin 'https://api.mydomain.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
或者
GET https://mydomain.com-assets.s3.amazonaws.com/static/rest_framework/css/bootstrap.min.css net::ERR_CERT_COMMON_NAME_INVALID
在Firefox中,不加载静态文件,不剥离 HTTPS,并且我在调试窗口的网络选项卡中看到以下错误:
An error occured: SSL_ERROR_BAD_CERT_DOMAIN
我尝试使用以下 XML 向存储桶添加 CORS 策略:
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>
但这并没有解决 HTTPS 问题。有什么我遗漏的东西可以帮助我摆脱被划掉的 HTTPS 吗?
我确信证书没有问题,并且该问题与通过 HTTPS 连接请求的 HTTP 无关。我相信这是一个 CORS 问题,所以我不确定为什么添加 CORS 存储桶策略不能解决这个问题。
另外,我在我的 Django 应用程序中安装了 django-cors-headers 和CORS_ORIGIN_ALLOW_ALL = True
.
解决方案
根据 S3 存储桶命名文档,问题似乎与存储桶名称中的点有关。
当您使用具有安全套接字层 (SSL) 的虚拟托管式存储桶时,SSL 通配符证书仅匹配不包含句点的存储桶。要解决此问题,请使用 HTTP 或编写您自己的证书验证逻辑。我们建议您在使用虚拟托管式存储桶时不要在存储桶名称中使用句点(“.”)。
将bucket名称中的域名名称slugify(将点替换为连字符)使其生效。
文档链接:这里
推荐阅读
- sql - Redshift 查询日期数据
- powershell - Powershell:由于向前和向后兼容性,ConvertFrom-Json 没有获得分配的变量
- r - 在匹配行上用另一个数据框更新数据框,例如使用连接语句更新 SQL
- python - 尝试在我的公司计算机上运行 #nltk.download('stopwords')) 代码时,如何修复 nltk.download [Win Errorr 10054]?
- java - Jena 使用 contains 和 lcase 查询 SPARQL
- sql - ORACLE,通过双列、多列的 ROWNUM 连接
- blockchain - 二维码和加密钱包
- python - Python Selenium Webdriver 表值到 Excel
- c# - 将 nvarchar 转换为 int 时 C# 转换失败
- laravel - 路由没有检测到ajax url