posts - 122,  comments - 25,  trackbacks - 0
          1、介紹
          通過證書驗證用戶身份(瀏覽器),其核心是利用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). 登錄完成,將用戶外部重定向回原始頁面。
          2、具體實現
          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)配置
          應用和身份驗證頁面放在一起,所以需要同時配置兩個虛擬主機,同時監聽80(處理http請求)、443(處理https請求)端口。
          #監聽端口
          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里的變量變為全局環境的變量
              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();

                  //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);
                  }

          posted @ 2011-12-09 16:09 josson 閱讀(2444) | 評論 (0)編輯 收藏
          受限于證書的原因,以前經常不得已用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、搞定。
          posted @ 2011-12-09 13:54 josson 閱讀(3112) | 評論 (1)編輯 收藏
          <2011年12月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 芷江| 松阳县| 佛山市| 通州市| 什邡市| 道孚县| 阳东县| 嘉峪关市| 二连浩特市| 冕宁县| 寻乌县| 叙永县| 淳化县| 南丹县| 铅山县| 铜山县| 安丘市| 图片| 邻水| 霍山县| 阿鲁科尔沁旗| 淄博市| 南华县| 浦县| 闽清县| 林周县| 昌黎县| 长垣县| 台东市| 延寿县| 桂阳县| 定陶县| 连平县| 青川县| 玛纳斯县| 乌拉特中旗| 色达县| 来凤县| 织金县| 衡南县| 黄梅县|