<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 on 2011-12-09 16:09 josson 閱讀(2440) 評論(0)  編輯  收藏 所屬分類: java 開發
    <2011年12月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    收藏夾

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 无遮挡a级毛片免费看| 亚洲Av高清一区二区三区| 一级看片免费视频| 免费在线观看理论片| 风间由美在线亚洲一区| 在线视频免费国产成人| 日日摸日日碰夜夜爽亚洲| 亚洲国产精品第一区二区三区| 曰韩无码AV片免费播放不卡| 久久青青草原亚洲av无码| 久久青青草原国产精品免费| 亚洲AV成人无码久久精品老人| 99精品免费观看| 国产精品亚洲专区在线观看| 精品久久久久久久免费加勒比| 特级一级毛片免费看| 亚洲午夜福利717| 永久看日本大片免费35分钟| 最新亚洲精品国偷自产在线| 国产一区二区三区在线免费观看| 四虎影视久久久免费观看| 久久亚洲免费视频| 欧美在线看片A免费观看| 黄色网页免费观看| 无码专区—VA亚洲V天堂| 日韩欧美一区二区三区免费观看| 亚洲a∨无码一区二区| 国产亚洲一区二区手机在线观看| 67194国产精品免费观看| 亚洲精品天堂成人片AV在线播放| 亚洲美女高清一区二区三区| 精品一区二区三区免费毛片爱| 久久亚洲最大成人网4438| 亚洲国产香蕉人人爽成AV片久久| 黄色网址在线免费| 亚洲久热无码av中文字幕| 色久悠悠婷婷综合在线亚洲| 五月婷婷在线免费观看| 天堂亚洲免费视频| 亚洲卡一卡2卡三卡4麻豆| 久久精品国产亚洲Aⅴ蜜臀色欲|