簡體   English   中英

使用VirtualDocumentRoot在SSL中進行虛擬主機托管

[英]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)。

如果我正確理解要求,您想知道:

  • 如何為* .dev生成通配符SSL證書
  • 如何在本地配置apache,配置允許服務器通過SSL / TLS的任何* .dev域,而不是在創建新的* .dev域時更改配置。

如果我理解正確,這肯定是可行的。

它將如何工作 :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

你可以通過以下方式測試:

  • 創建兩個文檔文件結構;
  • 用簡單的HTML頁面填充它們;
  • 通過在hosts文件中提供domain-ip映射來發出請求,或者正如我所做的那樣,通過在需要時發出不同的主機頭來修改“修改頭”插件:

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM