2015-03-03 130 views
1

我的團隊正在開發一個REST API來支持使用Django的REST框架的iPhone應用程序。我們已經到了從主機通過開發WSGI接口切換到mod_wsgi apache接口的時候了。我們已經決定使用mod_wsgi-httpd作爲Apache實例。Mod_wsgi https錯誤連接被拒絕

我們無法讓mod_wsgi通過HTTPS託管。

我們提供了mod_wsgi的在我們的Django應用程序設置文件(settings.py)

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的服務器:

蟒蛇manage.py runmodwsgi --host 0.0.0.0 --port 8000 --https-port 8001 --ssl-certificate/path/to/cert/and/key

HTTP服務器奇妙的作品。我們所有的HTTP only API方法都按預期收聽和響應。 HTTPS方面沒有合作。嘗試訪問僅HTTPS方法時,連接被拒絕

例如試圖連接到使用谷歌瀏覽器的方法時...

https://ipaddress:8001/ldapauth/(ldapauth是HTTPS方法)

鉻吐出回來... enter image description here

在客戶端Swift中形成的類似請求已拒絕連接。

通常我會認爲這是一個更基本的問題,但是我們使用開發WSGI sslserver(也在項目的settings.py INSTALLED_APPS中)的成功使我認爲這是mod_wsgi或mod_wsgi-httpd的問題。使用此命令,我們可以承載我們的API在與成功的請求/響應SSL:

蟒蛇manage.py runsslserver 0.0.0.0:8001 --key /路徑/到/鍵--cert /路徑/到/證書

任何想法,我可以錯過配置mod_wsgi或mod_wsgi-httpd?非常感謝任何幫助,去吧!

回答

2

您需要指定--server-name選項,並使用https地址可訪問的站點名稱。這應該與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 

你會再使用URL與FQDN訪問:

https://host.example.com:8001 

如果你想能夠無需提供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證書的正常使用方式,所以只能通過本地主機訪問正確的服務器名稱以進行測試。

簡而言之,在使用HTTPS時,在訪問站點時應該始終使用正確的主機名而不是IP地址。如有必要,您可以在系統的主機服務文件中創建虛擬主機映射。

例如,在一個/etc/hosts文件,你可以添加:

127.0.0.1  host.example.com 

欲瞭解更多信息,建議您使用mod_wsgi的郵件列表。我不是一個習慣在這裏閒逛,或者在這裏回答關於mod_wsgi的問題,偶然這個問題引起了我的注意。

+0

感謝您的幫助!這正是問題所在。確保mod_wsgi知道服務器名稱。 – Freestyle076 2015-03-10 16:46:07