Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django:使用NGINX的安全SSL重定向导致应用程序崩溃_Python_Django_Ssl_Nginx_Ssl Certificate - Fatal编程技术网

Python django:使用NGINX的安全SSL重定向导致应用程序崩溃

Python django:使用NGINX的安全SSL重定向导致应用程序崩溃,python,django,ssl,nginx,ssl-certificate,Python,Django,Ssl,Nginx,Ssl Certificate,我正在尝试使用nginx、gunicorn使我的django应用程序在SSL后面工作;所有这些都安装在可以在内部网中访问但不能从外部访问的服务器中。这些是我的设置 settings.py: 。。。 SECURITY_MIDDLEWARE=('django.MIDDLEWARE.SECURITY.SecurityMiddleware',) 中间件类=安全中间件+中间件类 会话\u COOKIE\u SECURE=True CSRF\u COOKIE\u SECURE=True CSRF\u COO

我正在尝试使用nginx、gunicorn使我的django应用程序在SSL后面工作;所有这些都安装在可以在内部网中访问但不能从外部访问的服务器中。这些是我的设置

settings.py:

。。。
SECURITY_MIDDLEWARE=('django.MIDDLEWARE.SECURITY.SecurityMiddleware',)
中间件类=安全中间件+中间件类
会话\u COOKIE\u SECURE=True
CSRF\u COOKIE\u SECURE=True
CSRF\u COOKIE\u HTTPONLY=True
X_FRAME_OPTIONS='SAMEORIGIN'
安全时间=60秒
SECURE_BROWSER_XSS_FILTER=True
SECURE\u HSTS\u INCLUDE\u子域=True
SECURE\u CONTENT\u TYPE\u NOSNIFF=True
SECURE\u SSL\u REDIRECT=True
安全\u代理\u SSL\u头=('HTTP\u X\u转发的\u协议','https')
nginx.conf:

server {
   listen 80;
   server_name HOSTNAME;

   location / {
       proxy_set_header Host $host;
       proxy_pass http://unix:/tmp/HOSTNAME.socket;
       proxy_set_header X-Forwarded-Protocol $scheme;
       rewrite ^ https://$host/$request_uri permanent;
   }
}

不知是否有人能给我指出正确的解决办法

以防万一,您是否也尝试过设置
允许的\u主机

此外,请阅读以下内容:

如果将此设置为True会导致无限重定向,则可能意味着您的站点正在代理后运行,无法区分哪些请求是安全的,哪些是不安全的。您的代理可能会设置一个标头来指示安全请求;您可以通过找出该头是什么并相应地配置SECURE_PROXY_SSL_头设置来纠正此问题

然后查看nginx配置中的内容:

listen 80
...
proxy_set_header X-Forwarded-Protocol $scheme;
您确定
$scheme
https
而不是
http
?您正在侦听端口80,而不是端口443,您的
SECURE\u PROXY\u SSL\u头
设置看起来像是在等待
https
,但它可能会转发不安全的http请求


只是一个猜测,看看配置。

免责声明:我对web开发是新手。我也是这个问题的作者

编辑:在/var/log/nginx/HOSTNAME\u error.log中,我收到以下错误:

no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking

基于Steve的回答、这个问题(参见链接注释)和这个,我终于让我的应用程序在SSL后面工作

我使用以下命令创建了一个SSL证书和密钥(像我这样没有经验的用户应该注意,这些证书是自签名的,因此浏览器将连接归类为不安全的。但是事务被正确加密。有关该命令的更多信息,请参阅):

将我的nginx.conf更改为(因为我使用的是DjangoWhiteNoise,所以我的nginx conf不处理静态媒体文件):

最后,我将Django安全设置设置为:

...
SECURITY_MIDDLEWARE = ('django.middleware.security.SecurityMiddleware',)
MIDDLEWARE_CLASSES = SECURITY_MIDDLEWARE + MIDDLEWARE_CLASSES

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'SAMEORIGIN'
SECURE_HSTS_SECONDS = 60 
SECURE_BROWSER_XSS_FILTER = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_CONTENT_TYPE_NOSNIFF = True

SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')

希望这能帮助像我这样的人。

你犯了什么错误?500? 400?我得到了以下信息:
在服务器侦听ssl端口时未定义“ssl\U证书”,而ssl握手由于信誉不足而无法在我的答案中添加问题链接。下面是:
server {
    listen          80;
    server_name     HOSTNAME;
    rewrite ^/(.*)  https://HOST/$1 permanent;
}

server {
    listen 443 ssl;
    server_name     HOSTNAME;
    access_log      /var/log/nginx/HOSTNAME_access.log combined;
    error_log       /var/log/nginx/HOSTNAME_error.log error;

    # To create an SSL certificate:
    # dzdo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        proxy_pass         http://unix:/tmp/HOST.socket;
        proxy_redirect     off;
        proxy_set_header   Host              $http_host;
        proxy_set_header   X-Real-IP         $remote_addr;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

}
...
SECURITY_MIDDLEWARE = ('django.middleware.security.SecurityMiddleware',)
MIDDLEWARE_CLASSES = SECURITY_MIDDLEWARE + MIDDLEWARE_CLASSES

SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
CSRF_COOKIE_HTTPONLY = True
X_FRAME_OPTIONS = 'SAMEORIGIN'
SECURE_HSTS_SECONDS = 60 
SECURE_BROWSER_XSS_FILTER = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_CONTENT_TYPE_NOSNIFF = True

SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')