我的团队正在开发一个REST API来支持使用Django的REST框架的iPhone应用程序。现在是我们从托管通过开发WSGI接口切换到mod_wsgi apache接口的时候了。我们决定使用mod_wsgi-httpd作为Apache实例。
我们无法让mod_wsgi通过HTTPS托管。
我们在django应用程序设置文件(settings.py)中包含了mod_wsgi
INSTALLED_APPS = (
'sslserver',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'mod_wsgi.server',
)
并且可以使用以下命令成功启动mod_wsgi服务器:
python manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate / path / to / cert / and / key
HTTP服务器运行得非常好。我们所有的HTTP专用API方法都按预期监听和响应。 HTTPS方面没有合作。尝试访问仅限HTTPS的方法时,连接被拒绝。
例如,当尝试使用Google Chrome连接到该方法时...
https://ipaddress:8001/ldapauth/(ldapauth是一种HTTPS方法)
Chrome吐了回来......
同样在客户端Swift中形成的请求也拒绝连接。
通常我认为这是一个更基本的问题,但是我们使用开发WSGI sslserver(也在项目的settings.py INSTALLED_APPS中)的成功让我觉得这是mod_wsgi或mod_wsgi-httpd的问题。使用此命令,我们可以通过SSL托管我们的API以及成功的请求/响应:
python manage.py runsslserver 0.0.0.0:8001 --key / path / to / key --cert / path / to / cert
在配置mod_wsgi或mod_wsgi-httpd时我有什么想法?非常感谢你的帮助,去吧!
答案 0 :(得分:2)
您需要使用https地址指定--server-name
选项及其可访问的站点名称。这应该与已设置SSL证书的名称相匹配。
python manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate /path/to/cert/and/key --server-name host.example.com
然后,您将使用带有FQDN的URL访问它:
https://host.example.com:8001
如果您希望能够从localhost(同一系统)访问它而无需提供FQDN主机名,则可以使用--allow-localhost
选项。
python manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate /path/to/cert/and/key --server-name host.example.com --allow-localhost
使用后者,即使使用主机名的官方证书,您也会收到有关证书不匹配的浏览器警告。对于像wget和curl这样的命令行HTTP工具,你必须告诉他们在这些情况下它是一个不安全的站点。
这是因为它违反了通常使用HTTPS和SSL证书的方式,除了正确的服务器名称之外,只允许从localhost进行访问以进行测试。
简而言之,在使用HTTPS时,在访问站点时,您应该始终使用正确的主机名而不是IP地址。如有必要,您可以在系统的主机服务文件中创建虚拟主机映射。
例如,在/etc/hosts
文件中,您可以添加:
127.0.0.1 host.example.com
有关详细信息,建议您使用mod_wsgi邮件列表。我不习惯在这里闲聊或者在这里回答有关mod_wsgi的问题,这个问题很可能引起了我的注意。