<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一区二区三区中文| 搜日本一区二区三区免费高清视频 | 久久久久久国产a免费观看不卡| 免费人妻无码不卡中文字幕系| 精品免费久久久久久成人影院| 亚洲国产精品一区二区久久hs| 亚洲精品无码不卡在线播放| 美女被免费喷白浆视频| 成人午夜亚洲精品无码网站| 99re6在线精品免费观看| 亚洲国产婷婷六月丁香| 最新亚洲人成网站在线观看| 亚洲高清偷拍一区二区三区| 久久一区二区三区免费| 亚洲最新视频在线观看| 免费毛片a在线观看67194| 亚洲精品无AMM毛片| 亚洲人妻av伦理| MM1313亚洲国产精品| 亚洲情侣偷拍精品| 日本亚洲欧美色视频在线播放 | 久久精品成人免费国产片小草| 全免费毛片在线播放| 亚洲av日韩av激情亚洲| 一级特级aaaa毛片免费观看| 亚洲国产精品无码专区在线观看 | 日本高清不卡aⅴ免费网站| 亚洲成aⅴ人片久青草影院| 国产一级高青免费| 亚洲综合色一区二区三区小说| 精品成人免费自拍视频| 久久久久亚洲精品天堂久久久久久| 国产AV无码专区亚洲AV麻豆丫| 成人免费午夜视频| 国产精品无码永久免费888| 亚洲国产精品无码久久久久久曰| 久久水蜜桃亚洲AV无码精品| 亚洲人成精品久久久久|