1、介紹
流程圖

流程說明:
2、具體實現
1)、安裝apache、ssh、java、jboss等環境,略。
2)、生成服務證書和服務密碼應用和身份驗證頁面放在一起,所以需要同時配置兩個虛擬主機,同時監聽80(處理http請求)、443(處理https請求)端口。
4)、代碼片段
受限于證書的原因,以前經常不得已用IE打開一些應用。其實有一工具可以幫助我們導出IE證書,用于firefox,解決證書的困惑。
通過證書驗證用戶身份(瀏覽器),其核心是利用cookie實現http和https的信息共享(同域名)。如http://test.abc.com/app/index.html 發現未驗證后,跳轉到https://test.abc.com:443/app/checkCrt.html身份驗證,要求出去證書,確認后將身份信息帶入http請求頭部,跳轉到原請求頁面(http://test.abc.com/app/index.html ),讀取身份信息后進入頁面(出于安全考慮Cookie需要加密)。
流程圖

流程說明:
登錄流程詳細介紹:
1). 未登錄用戶訪問頁面 如:http://test.abc.com/app/index.html
2). 【CertAuthValve】判斷是否訪問受限制資源,如訪問受限制的資源則判斷用戶身份是否已驗證,未驗證則將用戶重定向到身份驗證頁面,原始請求的url做為
query的一部分,登錄成功后可以跳轉回來, 如:https://test.abc.com:443/app/checkCrt.htm?done=/index.html。
3). 【CertAuthValve】對于https請求,apache讀取請求提供的用戶證書,獲取證書中的郵件地址,并將該信息寫入請求頭中。
4). 【GetUserInfoValve】讀取請求頭,獲取剛剛設置的用戶郵件地址信息,進一步獲取用戶的詳細信息,然后將這些信息加密后放入cookie中。
5). 登錄完成,將用戶外部重定向回原始頁面。
1)、安裝apache、ssh、java、jboss等環境,略。
2)、生成服務證書和服務密碼
openssl req -new -x509 -nodes -out /home/admin/app/conf/ssl.crt/server.crt -keyout /home/admin/app/conf/ssl.crt/server.key -days 3600
因為要和內網證書交互,所以需要一個內網證書公鑰文件,可以通過以下方式獲取:
獲取方法:IE->工具->Internet選項->內容->證書->受信任的根證書頒發機構,找到intranet行,點擊導出,選擇下一步,選擇Base64編碼X.509,將證書文件保存為intranet-ca.crt,拷貝到目錄/home/admin/app/conf/ssl.crt/。
3)、apache(httpd.conf)配置
3)、apache(httpd.conf)配置
#監聽端口
Listen 80
Listen 443
#app的虛擬主機配置
Listen 80
Listen 443
#app的虛擬主機配置
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin sa@abc.com
ServerName test.abc.com
DocumentRoot /home/admin/app/target/app/htdocs/
</VirtualHost>
#身份驗證的虛擬主機配置
#身份驗證的虛擬主機配置
NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin sa@abc.com
ServerName test.abc.com
DocumentRoot /home/admin/app/target/app/htdocs/
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+SSLv3:+EXP:+eNULL
#該指令為虛擬主機指定證書文件名。
SSLCertificateFile /home/admin/app/conf/ssl.crt/server.crt
#該指令為證書指定一個對應的私鑰文件
SSLCertificateKeyFile /home/admin/app/conf/ssl.crt/server.key
#該指令為指定一個包含Certificate Authority證書的文件
#證書公鑰
SSLCACertificateFile /home/admin/app/conf/ssl.crt/intranet-ca.cer
SSLProxyEngine on
RewriteEngine on
#設置客戶端證書驗證為必須
SSLVerifyClient require
#因為一個CA證書能夠被另一個CA證書驗證,所以可以形成一個CA證書鏈.使用該指令可指定服務器驗證用戶證書時可以查找多少個CA證明。
#設置認證深度:一般用默認10。
SSLVerifyDepth 10
#把mod_ssl里的變量變為全局環境的變量
#把mod_ssl里的變量變為全局環境的變量
SSLOptions +StdEnvVars
#將證書中的郵件地址添加到請求頭中
RequestHeader unset SSL_CLIENT_S_DN_Email
RequestHeader add SSL_CLIENT_S_DN_Email %{SSL_CLIENT_S_DN_Email}e
</VirtualHost>
4)、代碼片段
//CertAuthValve.java
//判斷session中是否有用戶郵箱地址
SessionValue session = SessionHelper.getSessionValue(rundata);
if (StringUtil.isNotEmpty(session.getCropEmail())) {
return null;
}
// 從內網證書中獲取用戶郵箱地址: SSL_CLIENT_S_DN_Email
String cropEmail = rundata.getRequest().getHeader(SSL_CLIENT_HEADER_MAIL);
if (StringUtil.isNotEmpty(cropEmail)) {
//將郵箱地址保存到session
session.setCropEmail(cropEmail);
SessionHelper.saveSessionValue(rundata, session);
if (log.isDebugEnabled()) {
log.debug("用戶" + session.getCropEmail() + "已經通過證書驗證");
}
return null;
}
URIBrokerService uriBrokerService = (URIBrokerService) getWebxComponent().getService(
URIBrokerService.SERVICE_NAME);
URIBroker noPermissionUriBroker = uriBrokerService.getURIBroker(CHECK_CRT_URL);
//請求的原始URL & 驗證的URL
String requestPath = rundata.getPathInfo().replace("_", "");
String checkCrtUrl = (String) noPermissionUriBroker.getPath().get(
noPermissionUriBroker.getPath().size() - 1);
try {
//原始請求判斷
if (requestPath.equalsIgnoreCase(checkCrtUrl)) {
//當前是https請求,但是依然不能得到證書信息,轉到禁止頁面
//(要將禁止頁面加入到允許訪問的配置文件中,不然會導致循環重定向)
URIBroker uriBroker = uriBrokerService.getURIBroker("forbidden");
rundata.setRedirectLocation(uriBroker.render());
} else {
//轉到證書驗證頁面
rundata.setRedirectLocation(noPermissionUriBroker.render() + "?done=" + rundata.getPathInfo());
}
} catch (IOException e) {
log.error("權限驗證重定向出錯", e);
}
return new BreakPipeline();
//判斷session中是否有用戶郵箱地址
SessionValue session = SessionHelper.getSessionValue(rundata);
if (StringUtil.isNotEmpty(session.getCropEmail())) {
return null;
}
// 從內網證書中獲取用戶郵箱地址: SSL_CLIENT_S_DN_Email
String cropEmail = rundata.getRequest().getHeader(SSL_CLIENT_HEADER_MAIL);
if (StringUtil.isNotEmpty(cropEmail)) {
//將郵箱地址保存到session
session.setCropEmail(cropEmail);
SessionHelper.saveSessionValue(rundata, session);
if (log.isDebugEnabled()) {
log.debug("用戶" + session.getCropEmail() + "已經通過證書驗證");
}
return null;
}
URIBrokerService uriBrokerService = (URIBrokerService) getWebxComponent().getService(
URIBrokerService.SERVICE_NAME);
URIBroker noPermissionUriBroker = uriBrokerService.getURIBroker(CHECK_CRT_URL);
//請求的原始URL & 驗證的URL
String requestPath = rundata.getPathInfo().replace("_", "");
String checkCrtUrl = (String) noPermissionUriBroker.getPath().get(
noPermissionUriBroker.getPath().size() - 1);
try {
//原始請求判斷
if (requestPath.equalsIgnoreCase(checkCrtUrl)) {
//當前是https請求,但是依然不能得到證書信息,轉到禁止頁面
//(要將禁止頁面加入到允許訪問的配置文件中,不然會導致循環重定向)
URIBroker uriBroker = uriBrokerService.getURIBroker("forbidden");
rundata.setRedirectLocation(uriBroker.render());
} else {
//轉到證書驗證頁面
rundata.setRedirectLocation(noPermissionUriBroker.render() + "?done=" + rundata.getPathInfo());
}
} catch (IOException e) {
log.error("權限驗證重定向出錯", e);
}
return new BreakPipeline();
//GetUserInfoValve.java
Object user = rundata.getSession().getAttribute("userInfo");
if (user == null) {
SessionValue session = SessionHelper.getSessionValue(rundata);
String email = session.getCropEmail();
Employe employe = PersonInfoUtil.getPersonInfoByEmail(email);
// 寫入cookie
session.setEmployeeId(employe.getEmployeId());
session.setName(employe.getName());
session.setCropEmail(employe.getEmail());
SessionHelper.saveSessionValue(rundata, session);
}
Object user = rundata.getSession().getAttribute("userInfo");
if (user == null) {
SessionValue session = SessionHelper.getSessionValue(rundata);
String email = session.getCropEmail();
Employe employe = PersonInfoUtil.getPersonInfoByEmail(email);
// 寫入cookie
session.setEmployeeId(employe.getEmployeId());
session.setName(employe.getName());
session.setCropEmail(employe.getEmail());
SessionHelper.saveSessionValue(rundata, session);
}
受限于證書的原因,以前經常不得已用IE打開一些應用。其實有一工具可以幫助我們導出IE證書,用于firefox,解決證書的困惑。
Jailbreak [https://www.isecpartners.com/application-security-tools/jailbreak.html],win32的一個小軟件,可以幫助我們導出IE證書,使用很簡單。
1、windows環境(xp\win7均可),以adminstrator登錄;
2、下載jailbreak,解包后,運行jailbreak.exe(非jailbreak.msc);
3、導出證書:Certificates - Current User > 個人 > 證書,選所有任務導出;

選擇導出私鑰。
4、在firefox中導入證書:選項 > 高級 > 查看證書(您的證書) > 導入(剛導出證書文件);

5、搞定。
1、windows環境(xp\win7均可),以adminstrator登錄;
2、下載jailbreak,解包后,運行jailbreak.exe(非jailbreak.msc);
3、導出證書:Certificates - Current User > 個人 > 證書,選所有任務導出;

選擇導出私鑰。


5、搞定。
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 1 | 2 | 3 | |||
4 | 5 | 6 | 7 | 8 | 9 | 10 | |||
11 | 12 | 13 | 14 | 15 | 16 | 17 | |||
18 | 19 | 20 | 21 | 22 | 23 | 24 | |||
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
常用鏈接
留言簿(3)
隨筆分類
- Hibernate(2)
- java 開發 (31)
- Linux(13)
- Spring(4)
- web開發(20)
- 即時通訊(2)
- 大雜燴(15)
- 數據庫(7)
- 軟件設計(2)
- 問題記錄(1)
- 項目管理(8)
隨筆檔案
- 2011年12月 (2)
- 2011年6月 (1)
- 2011年5月 (1)
- 2011年2月 (1)
- 2011年1月 (3)
- 2010年12月 (3)
- 2010年11月 (1)
- 2010年9月 (1)
- 2010年7月 (1)
- 2010年6月 (1)
- 2010年4月 (3)
- 2009年11月 (1)
- 2009年9月 (3)
- 2009年8月 (1)
- 2009年7月 (1)
- 2009年6月 (2)
- 2009年5月 (1)
- 2009年3月 (4)
- 2009年2月 (1)
- 2009年1月 (1)
- 2008年12月 (2)
- 2008年11月 (1)
- 2008年10月 (1)
- 2008年9月 (2)
- 2008年8月 (1)
- 2008年7月 (3)
- 2008年6月 (2)
- 2008年5月 (2)
- 2008年3月 (2)
- 2008年1月 (15)
- 2007年12月 (8)
- 2007年11月 (15)
- 2007年7月 (2)
- 2007年6月 (3)
- 2007年5月 (7)
- 2007年4月 (7)
收藏夾
搜索
最新評論

- 1.?re: iframe 高度自適應
- 1909434428@qq.com
- --3a教程
- 2.?re: firefox中證書的使用
- thanks
- --mroff
- 3.?re: IE7 對話框樣式[未登錄]
- fsdfsdf
- --dd
- 4.?re: Debian 修改IP地址或DNS
-
IP地址配置文件: "/etc/network/interface" 文件少了個s
/etc/network/interfaces - --debian
- 5.?re: dhtmlxTree 使用示例
- rt
- --tr