http://www.jb51.net/article/56059.htm
https://csr.chinassl.net/
注意事項:apache 虛擬主機部分 <VirtualHost *:443> 錯誤 <VirtualHost 127.0.0.1:443> 正確 。不能寫成*,要寫具體的ip地址。
Web服務器在默認情況下使用HTTP,這是一個純文本的協議。正如其名稱所暗示的,純文本協議不會對傳輸中的數據進行任何形式的加密。而基於HTTP的Web服務器是非常容易配置,它在安全方面有重大缺陷。任何”中間人”,通過精心防止的數據包嗅探器,是能夠看到任何經過的數據包內容。更進一步,惡意用戶甚至可以在傳輸路徑設置一個假冒的WEB服務器冒名頂替實際的目標Web服務器。在這種情況下,最終用戶可能實際上與假冒者服務器,而不是真正的目的服務器進行通信。這樣,惡意用戶可以通過精心設計的表單欺騙終端用戶獲取到敏感信息,如用戶名密碼。
爲了處理這些類型的漏洞,大多數供應商往往在他們的web服務器應用HTTPS協議。對於只讀類型的網站,用戶只能讀取內容,並沒有實際提交任何信息,HTTP仍然是一個可行的選擇。但是,對於保存敏感信息的網站,比如:用戶需要登錄來獲得網站的服務,那麼HTTPS是必須的。 HTTPS能夠爲一個網站提供以下能力。
-
確保所有經過服務器傳輸的數據包都是經過加密的。
-
建立了一個官方數字證書證書,使得假冒服務器無法冒充真正的服務器。
需要建立支持HTTPS的WEB服務器所要做的第一件事就是獲得數字證書。數字證書可以在以下任一方法來獲得。
-
自簽名證書被推薦用於測試目的和個人項目。自簽名證書,也可以用於服務提供商,不過一般適用於用戶互相信任的情形。另外,自簽名證書不用花錢購買。
-
證書可以由社區爲基礎的認證供應商如StartSSL和CACERT辦法。這些證書也不需要花錢,但建議爲個人項目。
-
對於全球性商業網站,建議從值得信賴的知名證書頒發機構購買證書。這些證書需要花錢,但他們增加了網絡服務提供商的信譽。
1. 準備
在這篇文檔中,我們將使用自簽名證書。假設CentOS已經安裝了Apache Web服務器。我們需要使用OpenSSL生成自簽名證書。如果尚未安裝OpenSSL,它可以使用yum來安裝。
# yum install mod_ssl openssl
安裝完畢後,會自動生成 /etc/httpd/conf.d/ssl.conf 文件,下文配置會用到!
2. 生成一個自簽名證書
下面的命令可以被用來產生一個自簽名的證書。
首先,生成2048位的加密私鑰
# openssl genrsa -out server.key 2048
然後,生成證書籤名請求(CSR),這裏需要填寫許多信息,如國家,省市,公司等
# openssl req -new -key server.key -out server.csr
最後,生成類型爲X509的自簽名證書。有效期設置3650天,即有效期爲10年
# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
生成密鑰流程如下圖,供參考
創建證書後,將文件複製到對應的目錄。
# cp server.crt /etc/pki/tls/certs/
# cp server.key /etc/pki/tls/private/
# cp server.csr /etc/pki/tls/private/
3. 配置Apache Web服務器
首先,修改下面的配置文件。僅需配置紅色部分 SSLCertificateFile 和 SSLCertificateKeyFile
# vim /etc/httpd/conf.d/ssl.conf
### overwrite the following parameters ###
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
### The following parameter does not need to be modified in case of a self-signed certificate. ###
### If you are using a real certificate, you may receive a certificate bundle. The bundle is added using the following parameters ###
SSLCertificateChainFile /etc/pki/tls/certs/example.com.ca-bundle
然後,重新啓動httpd服務使更改生效
# service httpd restart // 或者 /etc/init.d/httpd restart
Web服務器現在可以使用HTTPS
4. 調整虛擬主機
Apache Web服務器可以配置爲多個Web站點。這些站點在httpd的配置文件中以虛擬主機的形式定義。例如,讓我們假設我們的Apache Web服務器託管站點爲proxy.mimvp.com,網站所有的文件都保存在/var/www/html/virtual-web目錄。
對於虛擬主機,典型的HTTP配置是這樣的。
# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www/html/virtual-web
ServerName proxy.mimvp.com
</VirtualHost>
我們可以參考上面的配置創建HTTPS虛擬主機。
# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
<Directory /var/www/html/virtual-web>
AllowOverride All
</Directory>
ServerAdmin [email protected]
DocumentRoot /var/www/html/virtual-web
ServerName proxy.mimvp.com
</VirtualHost>
需要按照上面的配置,定義每個虛擬主機。添加虛擬主機後,重新啓動Web服務。
# service httpd restart
現在的虛擬主機就可以使用HTTPS
實例見米撲代理: https://proxy.mimvp.com
5. 強制Apache Web服務器始終使用https
如果由於某種原因,你需要站點的Web服務器都只使用HTTPS,此時就需要將所有HTTP請求(端口80)重定向到HTTPS(端口443)。 Apache Web服務器可以容易地做到這一點。
1,強制主站所有Web使用(全局站點)
如果要強制主站使用HTTPS,我們可以這樣修改httpd配置文件:
# vim /etc/httpd/conf/httpd.conf
ServerName www.example.com:80
Redirect permanent / https://www.example.com
重啓Apache服務器,使配置生效:
# service httpd restart
2,強制虛擬主機(單個站點)
如果要強制單個站點在虛擬主機上使用HTTPS,對於HTTP可以按照下面進行配置:
# vim /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
ServerName proxy.mimvp.com
Redirect permanent / https://proxy.mimvp.com/
</VirtualHost>
重啓Apache服務器,使配置生效:
# service httpd restart
單個站點全部使用HTTPS,則 http://proxy.mimvp.com 會強制重定向跳轉到 https://proxy.mimvp.com
一般情況下,由於瀏覽器會自動攔截https未被認證的網址,因此建議同時保留 http://proxy.mimvp.com 和 https://proxy.mimvp.com ,或者購買權威的認證服務,讓用戶瀏覽器信任https瀏覽訪問。
米撲博客實例:
綜上所述,當存在如用戶登錄,付款交易等交互時推薦HTTPS方式,可以提高服務器的安全性。
證書可以通過各種方式獲得,如:自簽名、社區提供的甚至商業機構夠哦買的。管理員應當謹慎選擇將要使用的證書的類型。
nigix 轉發配置要是代理https的話,內容如下:
server {
listen 443;
server_name mail.jb51.net;
ssl on;
ssl_certificate server.crt;
ssl_certificate_key server.key;
location / {
proxy_pass https://192.168.0.2:443;
proxy_set_header Host $host:443;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
}
}
其中192.168.0.2是你的https主機
如果後端https沒有證書的話,可以如此簡化:
server {
listen 80;
server_name svn.jb51.net;
location / {
proxy_pass https://192.168.0.2:443;
proxy_set_header Host $host:443;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Via "nginx";
proxy_set_header X-Forwarded-Proto https; #注意看這裏 多了一行
}
}
如果提示“SSL 接收到一個超出最大准許長度的記錄。” 錯誤代碼“ssl_error_rx_record_too_long”說明少了“ssl on;”這一行
後面的server.crt server.key是數字證書,具體可以參照openssl做證書
openssl做證書 https://csr.chinassl.net/
mkdir ssl
cd ssl
openssl genrsa -des3 -out server.key 1024 # 會提示你輸入key,儘可能長些複雜些,後面好幾處要用,我都是複製粘貼的
openssl req -new -key server.key -out server.csr # 輸入組織信息 CN BeiJing HaiDian huozhe.com
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt