[英]Virtual Hosting in SSL with VirtualDocumentRoot
我在ubuntu 16.04 VM上進行開發工作
當我處理許多項目時,為了讓我的生活更輕松,我使用* .dev域將VirtualDocumentRoot和hosts文件從我的主文件夾中用於服務器站點:
在000-default.conf我有:
<VirtualHost *:80>
VirtualDocumentRoot /home/steve/websites/%-2/%-2/public_html
ServerAlias *.dev
</VirtualHost>
然后在主機中我有我正在研究的各種網站:
127.0.0.1 somesite.dev
127.0.0.1 another.dev
127.0.0.1 athirdone.dev
127.0.0.1 blog.athirdone.dev
這樣,當我添加一個新項目時,我只需要在網站目錄中創建正確的文件夾結構並向主機添加一行,例如,如果我想處理一個新項目somecoolproject.dev,我只需添加一個文件夾:
/home/steve/websites/somecoolproject/somecoolproject/public_html
和主機中的一行:
127.0.0.1 somecoolproject.dev
我很高興去。
無論如何,我現在所做的幾乎所有事情都運行在https上,並且許多項目都有代碼來強制執行此操作,無論是在源代碼還是htaccess等,這使得處理開發副本變得很麻煩。
我想在我的開發機器上創建一個自簽名證書,理想情況是我不需要為每個項目生成一個新的證書,所以某種通配符* .dev會很棒。
但即使我確實需要為每個項目創建一個新項目,我仍然無法解決如何使用我的設置安裝它 - 我找到的所有內容都假設一個固定文檔和硬編碼的服務器名稱。
我們喜歡賞金,因為為你編寫解決方案有點長了:)你的問題的真正答案是如何讓它工作,而VirtualDocumentRoot不適用於SSL。 我建議將來自默認SSL虛擬主機的請求代理到動態非ssl虛擬主機。 這可以通過保留所請求的主機名來實現。
首先,完成所有的初步工作:1 /生成您的私鑰和證書(如果您願意,可以使用通配符),有很多教程,2 /在您的主httpd.conf中激活Include for extra / httpd- ssl.conf中
在httpd-ssl.conf中,你需要這個conf(我測試成功):
UseCanonicalName Off
ProxyPreserveHost On
SetEnvIf Server_Addr "(.*)" sname=$1
RewriteEngine On
RewriteCond "%{HTTPS}" =on
RewriteRule ^/(.*)$ "http://%{ENV:sname}:80/$1" [P]
我還建議自定義日志格式,然后你會看到更好的請求。 這將有助於以后的調試,這里有一些指令用於記錄請求的主機名,您可以通過日志行的長度識別SSL或非SSL流量。 在httpd.conf中,查找定義LogFormat的位置並添加:
LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" enhanced
LogFormat "%V %h %l %u %t \"%r\" %>s %b" enhancedSSL
CustomLog "logs/access_log" enhanced
在httpd-ssl.conf中,你只需要這個:
CustomLog "logs/access_log" enhancedSSL
告訴我們它是否按預期工作。 一旦工作,下一步可能是至少從遠程禁用非SSL流量。 要實現此目的,請將本地防火牆配置為阻止端口80上的請求,或者(更好)將VirtualHost配置為僅在本地偵聽(VirtualHost 127.0.0.1:80而不是*:80)。
如果我正確理解要求,您想知道:
如果我理解正確,這肯定是可行的。
它將如何工作 :SNI - 服務器名稱指示,TLS協議擴展,其中,在建立TLS連接時傳遞主機名,BEFORE HTTP數據(如主機頭)可用。 所有流行的網絡瀏覽器,curl,所有流行的網絡服務器都支持它。
腳步:
第一。 生成證書:
mindaugas@mindaugas-ubuntu-14:/usr/local/apache2/conf$ sudo openssl req -newkey rsa:2048 -nodes -keyout domain.key -x509 -days 365 -out domain.crt
Generating a 2048 bit RSA private key
.............+++
..................+++
writing new private key to 'domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:*.dev
Email Address []:
關鍵部分是:
Common Name (eg server FQDN or YOUR name) []:*.dev
第二。
服務器配置:
Listen 443
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile "/usr/local/apache2/conf/domain.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/domain.key"
VirtualDocumentRoot /home/mindaugas/websites/%-2/pubic/
ServerAlias *.dev
<Directory "/">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Allow from All
Require all granted
</Directory>
</VirtualHost>
啟用ssl並重啟apache:
sudo a2enmod ssl
sudo service apache2 restart
你可以通過以下方式測試:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.