項目中有多個應用需要發佈,按照以前的想法,就準備配置多個虛擬主機,實在是讓人見笑了,做事情還真不能想當然,查了一些資料,現在的做法是針對某類文件或者某個文件,當用戶訪問這些資源得時候,要求用戶出示證書,如在網銀專業版登錄的時候要求用戶出示證書,而大衆版的時候就沒有這個要求,因爲大衆版客戶開戶的時候根本就不要求辦理證書,同時只提供一些查詢類的交易,通過SSL連接足夠。
下面是使用到的一些資料的彙總,後面跟上了自己的Apache配置。
http://www.infosecurity.org.cn/forum/read.php?fid=10&tid=31&fpage=1
http://www.kreny.com/doc/apache2.0/urlmapping.html
http://developer.ccidnet.com/pub/article/c302_a230585_p1.html
九 修改httpd.conf
cd ..
vi httpd.conf
修改ServerName,爲不設也可以,不過會出現警告
將SSLCertificateFile修改爲/usr/local/apache/conf/ssl.crt/server.crt
將SSLCertificateKeyFile修改爲/usr/local/apache/conf/ssl.key/server.key
#這是最基本的設置了,先用用試試看吧.
十 啓動服務
/sbin/service iptables stop 這是要關掉防火牆了,呵呵我也不知道這樣安全不安全,不過要是不關掉的話客戶端將無法訪問
/usr/local/apache/bin/apachectl startssl
十一 從客戶端測試
從局域網找個windows電腦(LINUX也行)輸入https://ip
此時將會出現一個對話框,一般第二個是對,畢竟時間都是有效的嘛.第三個是歎號那是因爲訪問站點與證書通用名不匹配,這需要在用openssl生成apache服務器證書時將通用名設定爲ip,第一個歎號是因爲沒有安裝CA根證書,這時將/CAroot/cacert.pem拷到客戶機安裝就可以了,重新打開瀏覽器輸入https://ip,怎麼什麼反應也沒有就進去了呢,呵呵,其實已經對服務器進行認真了,這和http://ip有本質區別.
十二 配置更多的SSL應用(這個在/usr/local/apache/htdocs/manual/mod/mod_ssl有詳細文檔)
1,實現對客戶端的認證
修改httpd.conf
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /CAroot/cacert.pem
現在在客戶端輸入https://ip ,將要求出示證書
2:某些頁面只允許持有證書的客戶訪問,其他頁面允許所有人訪問
修改httpd.conf,當然需要先作一些頁面的準備,/usr/local/apache/htdocs/secure是我們放只允許有證書訪問的目錄
SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt
<Location /secure>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
3.某些頁面只允許持有某種特定證書內容的客戶訪問,其它頁面允許所有人訪問
在這裏我假設允許我們局域網的人訪問
SSLVerifyClient none
<Directory /usr/local/apache/htdocs/secure/area>
SSLVerifyClient require
SSLVerifyDepth 5
SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificatePath conf/ssl.crt
SSLOptions +FakeBasicAuth
SSLRequireSSL
SSLRequire %{SSL_CLIENT_S_DN_O} eq "ATR" and /
%{SSL_CLIENT_S_DN_OU} in {"305", "307", "309","313"}
</Directory>
4.允許局域網用戶使用http訪問局域網站點,但是需要外網用戶使用強加密的https訪問.
假設局域網用戶ip爲192.160.1.0-24.
下面的修改要放在HTTPS虛擬主機的外面,這樣就可以同時適用於http和https訪問
SSLCACertificateFile conf/ssl.crt/company-ca.crt
<Directory /usr/local/apache/htdocs>
# Outside the subarea only Intranet access is granted
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
</Directory>
<Directory /usr/local/apache/htdocs/subarea>
# Inside the subarea any Intranet access is allowed
# but from the Internet only HTTPS + Strong-Cipher + Password
# or the alternative HTTPS + Strong-Cipher + Client-Certificate
# If HTTPS is used, make sure a strong cipher is used.
# Additionally allow client certs as alternative to basic auth.
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
# Force clients from the Internet to use HTTPS
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^192/.168/.1/.[0-9]+$
RewriteCond %{HTTPS} !=on
RewriteRule .* - [F]
# Allow Network Access and/or Basic Auth
Satisfy any
# Network Access Control
Order deny,allow
Deny from all
Allow 192.168.1.0/24
# HTTP Basic Authentication
AuthType basic
AuthName "Protected Intranet Area"
AuthUserFile conf/protected.passwd
Require valid-user
</Directory>
有關SSL配置apache的指令(呵呵,在/usr/local/apache/htdocs/manual/mod/mod_ssl中有更詳細的解釋)
|
|
要在程序中寫重定向。
然後在443端口對就的虛擬主機裏用<Files>..</Files>將要出示證書的文件名寫在裏面。
今天在www.modssl.org的FAQ上看到可以利用mod_rewrite模塊實現
如下所示,把所有連接後面帶SSL的都重定向到https.
RewriteEngine on
RewriteRule ^/(.*):SSL$ https://192.168.10.10/$1
自己在實際中的應用
1、在個人網銀或者企業網銀的首次登錄頁面需要讓用戶出示證書,可以將整個虛擬機設置爲不需要用戶出示證書,註釋掉SSLVerifyClient require
SSLVerifyDepth 1
可以通過兩個方式實現,將登錄頁面放置到一個特定的文件夾中,在虛擬主機中通過配置<Location /hzcb/logon>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
或者針對具體文件進行制定,使用FilesMatch或者Files都可以,推薦使用FilesMatch
<Files "/logon_pro.html">
SSLVerifyClient require
SSLVerifyDepth 1
</Files>
文件名以regulx的形式給定。參考http://httpd.apache.org/docs/2.0/mod/core.html
2、如果登錄的時候要求用戶出示證書,在服務器端收到的請求包頭中包含有證書信息,並且在後面的請求中都會有該信息。
3、如果使用SSL服務器,就都沒有這些麻煩了,可以要求SSL服務器將證書信息補充到URL上傳送到後臺。