Index: /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.controller.js
===================================================================
--- /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.controller.js	(revision 2715)
+++ /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.controller.js	(working copy)
@@ -72,6 +72,7 @@
                                                             "name": data.service_name,
                                                             "type": data.protocol,
                                                             "device": host.name,
+                                                            "device_id": host.id,
                                                             "device_group": host.device_group,
                                                             "host": "",
                                                             "status": ""
@@ -80,6 +81,7 @@
                                                     if (service_done && vhost_done) {
                                                         tableViewModel.sslDataList.push(service_dict[data.service_name]);
                                                     }
+                                                    console.log(tableViewModel.sslDataList);
                                                 });
                                             });
                                         sslMonitoringService
Index: /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.html
===================================================================
--- /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.html	(revision 2715)
+++ /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.html	(working copy)
@@ -50,7 +50,7 @@
                         <td class="d-num">{{ ((currentPageIndex - 1) * pageSize) + $index + 1 }}</td>
                         <td>
                             <a ng-if="row.host"
-                               ui-sref="index.ssl_monitoring.detail({device:row.device,name:row.name,host_name:row.host})"
+                               ui-sref="index.ssl_monitoring.detail({device:row.device,deviceId:row.device_id,name:row.name,host_name:row.host})"
                                class="d-name">{{ row.name }}</a>
                             <a ng-if="!row.host" ng-click="sslMonitoring.warn(row.name)" class="d-name">{{ row.name
                                 }}</a>
Index: /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.module.js
===================================================================
--- /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.module.js	(revision 2715)
+++ /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.module.js	(working copy)
@@ -20,7 +20,7 @@
 
         $stateProvider
             .state('index.ssl_monitoring.detail', {
-                url :'^/ssl_monitoring/detail/{device}/{name}/{host_name}',
+                url :'^/ssl_monitoring/detail/{device}/{deviceId}/{name}/{host_name}',
                 views: {
                     'main@index': {
                         templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_base.html',
@@ -35,7 +35,7 @@
 
             })
             .state('index.ssl_monitoring.detail.cert', {
-                url :'^/ssl_monitoring/detail/{device}/{name}/{host_name}/cert',
+                url :'^/ssl_monitoring/detail/{device}/{deviceId}/{name}/{host_name}/cert',
                 views: {
                     'cert@index.ssl_monitoring.detail': {
                         templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_cert.html',
@@ -47,8 +47,21 @@
                     skip: true
                 }
             })
+            .state('index.ssl_monitoring.detail.client_certificates', {
+                url :'^/ssl_monitoring/detail/{device}/{deviceId}/{name}/{host_name}/client_certificates',
+                views: {
+                    'client_certificates@index.ssl_monitoring.detail': {
+                        templateUrl: 'app/modules/ssl_monitoring/tabs/client_certificates.html',
+                        controller: 'sslMonitoringClientCertController',
+                        controllerAs: 'sslMonitoringClientCert'
+                    }
+                },
+                ncyBreadcrumb: {
+                    skip: true
+                }
+            })
             .state('index.ssl_monitoring.detail.intercert', {
-                url :'^/ssl_monitoring/detail/{device}/{name}/{host_name}/intercert',
+                url :'^/ssl_monitoring/detail/{device}/{deviceId}/{name}/{host_name}/intercert',
                 views: {
                     'intercert@index.ssl_monitoring.detail': {
                         templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_intercert.html',
@@ -61,7 +74,7 @@
                 }
             })
             .state('index.ssl_monitoring.detail.backup', {
-                url :'^/ssl_monitoring/detail/{device}/{name}/{host_name}/backup',
+                url :'^/ssl_monitoring/detail/{device}/{deviceId}/{name}/{host_name}/backup',
                 views: {
                     'backup@index.ssl_monitoring.detail': {
                         templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_backup.html',
@@ -76,4 +89,4 @@
     }
 ]);
 
-angular.module("cmApp").requires.push('cm.ssl_monitoring');
\ No newline at end of file
+angular.module("cmApp").requires.push('cm.ssl_monitoring');
Index: /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.service.js
===================================================================
--- /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.service.js	(revision 2715)
+++ /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/ssl.service.js	(working copy)
@@ -9,50 +9,53 @@
             return {
                 getVSList: getVSList,
                 getVhostList: getVhostList,
-                addvhost:addvhost,
-                bindvsvhost:bindvsvhost,
-                update_vs_status:update_vs_status,
-                getcerts:getcerts,
-                activecert:activecert,
-                deactivecert:deactivecert,
-                deletecert:deletecert,
-                getVhostDomainList:getVhostDomainList,
-                importcert:importcert,
-                getintercerts:getintercerts,
-                importintercert:importintercert,
-                deleteintercert:deleteintercert,
-                getbackupfiles:getbackupfiles,
-                backupcert:backupcert,
-                restorefile:restorefile,
-                deletefile:deletefile,
-                downloadfile:downloadfile,
-                checkSSLExpireCert:checkSSLExpireCert
+                addvhost: addvhost,
+                bindvsvhost: bindvsvhost,
+                update_vs_status: update_vs_status,
+                getcerts: getcerts,
+                getClientVerificationConfig: getClientVerificationConfig,
+                activecert: activecert,
+                deactivecert: deactivecert,
+                deletecert: deletecert,
+                getVhostDomainList: getVhostDomainList,
+                importcert: importcert,
+                executeAPVCLICmd: executeAPVCLICmd,
+                updateClientVerificationSettings: updateClientVerificationSettings,
+                getintercerts: getintercerts,
+                importintercert: importintercert,
+                deleteintercert: deleteintercert,
+                getbackupfiles: getbackupfiles,
+                backupcert: backupcert,
+                restorefile: restorefile,
+                deletefile: deletefile,
+                downloadfile: downloadfile,
+                checkSSLExpireCert: checkSSLExpireCert
             };
 
-            function getVSList (device_name) {
+            function getVSList(device_name) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 'cmd': 'show slb virtual all' }
+                var post_data = {'cmd': 'show slb virtual all'}
                 apiService.proxy_post_dev(device_name, "/rest/cli_extend", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200 && res.data.contents) {
-                           var conf_list = res.data.contents.split("\n");
-                           var type_dict = {
+                            var conf_list = res.data.contents.split("\n");
+                            var type_dict = {
                                 "slb virtual tcps ": "TCPS",
                                 "slb virtual https ": "HTTPS",
                                 "slb virtual ftps ": "FTPS"
                             };
-                           _.each(conf_list, function(data) {
+                            _.each(conf_list, function (data) {
                                 var tmp = data.split("\"");
                                 if (tmp[0] in type_dict) {
                                     result.push(
-                                            {
-                                                "service_name":tmp[1],
-                                                "protocol":type_dict[tmp[0]]
-                                            }
-                                        );
+                                        {
+                                            "service_name": tmp[1],
+                                            "protocol": type_dict[tmp[0]]
+                                        }
+                                    );
                                 }
-                           });
+                            });
                         }
                         deferred.resolve(result);
                     }
@@ -60,26 +63,26 @@
                 return deferred.promise;
             }
 
-            function getVhostList (device_name) {
+            function getVhostList(device_name) {
                 var deferred = $q.defer();
                 var vhost_result = {};
                 var status_result = {};
                 var result = []
                 var service_done = false;
                 var status_done = false;
-                var post_data = { 'cmd': 'show ssl host' }
+                var post_data = {'cmd': 'show ssl host'}
                 apiService.proxy_post_dev(device_name, "/rest/cli_extend", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         service_done = true;
                         if (res && res.status === 200 && res.data.contents) {
-                           var conf_list = res.data.contents.split("\n");
-                           _.each(conf_list, function(data) {
+                            var conf_list = res.data.contents.split("\n");
+                            _.each(conf_list, function (data) {
                                 var tmp = data.split("\"");
                                 if (tmp[0] == "ssl host virtual ") {
                                     if (status_done) {
                                         result.push(
                                             {
-                                                "service_name":tmp[3] || "",
+                                                "service_name": tmp[3] || "",
                                                 "host_name": tmp[1],
                                                 "status": status_result[tmp[1]] || ""
                                             }
@@ -88,34 +91,34 @@
                                         if (tmp[1] in vhost_result) {
                                             vhost_result[tmp[1]].push(
                                                 {
-                                                    "service_name":tmp[3] || "",
+                                                    "service_name": tmp[3] || "",
                                                     "host_name": tmp[1],
                                                     "status": ""
                                                 }
                                             )
                                         } else {
-                                            vhost_result[tmp[1]]  = [{
-                                                "service_name":tmp[3] || "",
+                                            vhost_result[tmp[1]] = [{
+                                                "service_name": tmp[3] || "",
                                                 "host_name": tmp[1],
                                                 "status": ""
                                             }]
                                         }
                                     }
                                 }
-                           });
+                            });
                         }
                         if (service_done && status_done) {
                             deferred.resolve(result);
                         }
                     }
                 );
-                post_data = { 'cmd': 'show ssl status host' }
+                post_data = {'cmd': 'show ssl status host'}
                 apiService.proxy_post_dev(device_name, "/rest/cli_extend", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         status_done = true;
                         if (res && res.status === 200 && res.data.contents) {
-                           var conf_list = res.data.contents.split("\n");
-                           _.each(conf_list, function (data) {
+                            var conf_list = res.data.contents.split("\n");
+                            _.each(conf_list, function (data) {
                                 var tmp = data.split("\"");
                                 var status_str = "";
                                 if (tmp[0] == "virtual host ") {
@@ -135,7 +138,7 @@
                                         status_result[tmp[1]] = status_str;
                                     }
                                 }
-                           });
+                            });
                         }
                         if (service_done && status_done) {
                             var arr = [];
@@ -149,12 +152,12 @@
                 return deferred.promise;
             }
 
-            function bindvsvhost (device_name, options) {
+            function bindvsvhost(device_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { "vs":options["vs_name"] }
-                apiService.proxy_put_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/"+options["vh_name"]+"/vs", JSON.stringify(post_data)).then(
-                    function(res){
+                var post_data = {"vs": options["vs_name"]}
+                apiService.proxy_put_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/" + options["vh_name"] + "/vs", JSON.stringify(post_data)).then(
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -172,12 +175,13 @@
                 );
                 return deferred.promise;
             }
-            function addvhost (device_name, options) {
+
+            function addvhost(device_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { "name":options["vh_name"] }
+                var post_data = {"name": options["vh_name"]}
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -196,12 +200,12 @@
                 return deferred.promise;
             }
 
-            function update_vs_status (device_name, options) {
+            function update_vs_status(device_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { "host_status":options["status"] }
-                apiService.proxy_put_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/"+options["vh_name"]+"/host_status", JSON.stringify(post_data)).then(
-                    function(res){
+                var post_data = {"host_status": options["status"]}
+                apiService.proxy_put_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/" + options["vh_name"] + "/host_status", JSON.stringify(post_data)).then(
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -220,18 +224,18 @@
                 return deferred.promise;
             }
 
-            function getcerts (device_name, service_name, host_name) {
+            function getcerts(device_name, service_name, host_name) {
                 var deferred = $q.defer();
                 var result = [];
-                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/"+host_name+"/certs").then(
-                    function(res){
+                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/" + host_name + "/certs").then(
+                    function (res) {
                         if (res && res.status === 200) {
                             result[0] = true;
                             result[1] = res.data["SSLVirtualHost"]["certs"];
                         } else {
                             result[0] = false;
                             result[1] = res.data.msg;
-                            
+
                         }
                         deferred.resolve(result);
                     }
@@ -239,35 +243,54 @@
                 return deferred.promise;
             }
 
+            function getClientVerificationConfig(device_name, service_name, host_name) {
+                let deferred = $q.defer();
+                let result = [];
+                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLClientVerificationSettings/" + host_name).then(
+                    function (res) {
+                        if (res && res.status === 200) {
+                            result[0] = true;
+                            result[1] = res.data["SSLClientVerificationSettings"];
+                        } else {
+                            result[0] = false;
+                            result[1] = res.data.msg;
+                        }
+                        deferred.resolve(result);
+                    }
+                );
+                return deferred.promise;
+            }
+
             function _id_name_join() {
                 var ret = "";
                 var pre = false;
-                _.each(arguments, function(item) {
+                _.each(arguments, function (item) {
                     if (pre) {
                         ret += "-";
                     }
                     pre = true;
-                    if (typeof(item) == "string") {
+                    if (typeof (item) == "string") {
                         if (item.indexOf("-") != -1) {
-                            ret += "\""+item+"\""
+                            ret += "\"" + item + "\""
                         } else {
-                            ret +=item;
+                            ret += item;
                         }
                     } else {
-                        ret +=item;
+                        ret += item;
                     }
                 })
                 return ret;
             }
-            function activecert (device_name, service_name, host_name, options) {
+
+            function activecert(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(options["index"],options["type"],host_name,options["domain_name"])
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(options["index"], options["type"], host_name, options["domain_name"])
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Activate", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -286,15 +309,15 @@
                 return deferred.promise;
             }
 
-            function deactivecert (device_name, service_name, host_name, options) {
+            function deactivecert(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(options["index"],options["type"],host_name,options["domain_name"])
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(options["index"], options["type"], host_name, options["domain_name"])
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Deactivate", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -313,15 +336,15 @@
                 return deferred.promise;
             }
 
-            function deletecert (device_name, service_name, host_name, options) {
+            function deletecert(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(options["index"],options["type"],host_name,options["domain_name"])
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(options["index"], options["type"], host_name, options["domain_name"])
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Delete_Cert", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -340,11 +363,11 @@
                 return deferred.promise;
             }
 
-            function getVhostDomainList (device_name, host_name) {
+            function getVhostDomainList(device_name, host_name) {
                 var deferred = $q.defer();
                 var result = [];
-                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/"+host_name+"/ssl_sni").then(
-                    function(res){
+                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/" + host_name + "/ssl_sni").then(
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -356,7 +379,7 @@
                         } else {
                             result[0] = false;
                             result[1] = res.data.msg;
-                            
+
                         }
                         deferred.resolve(result);
                     }
@@ -364,11 +387,11 @@
                 return deferred.promise;
             }
 
-            function importcert (device_name, options) {
+            function importcert(device_name, options) {
                 var deferred = $q.defer();
                 var result = [];
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Import_Cert", options).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -387,18 +410,65 @@
                 return deferred.promise;
             }
 
-            function getintercerts (device_name, service_name, host_name) {
+            function executeAPVCLICmd(device_id, cmd) {
+                let deferred = $q.defer();
+                let result = [];
+                let post_data = { 'cmd': cmd }
+                apiService.proxy_post_dev(device_id, "/rest/apv/cli_extend", JSON.stringify(post_data)).then(
+                    function (res) {
+                        if (res && res.status === 200) {
+                            if (res.data && res.data.contents && typeof res.data.contents === 'string' && res.data.contents.includes('Failed')) {
+                                result[0] = false;
+                                result[1] = res.data.contents;
+                            } else {
+                                result[0] = true;
+                            }
+                            deferred.resolve(result);
+                        } else {
+                            result[0] = false;
+                            result[1] = res.data.msg;
+                            deferred.resolve(result);
+                        }
+                    }
+                );
+                return deferred.promise;
+            }
+
+            function updateClientVerificationSettings(device_name, host_name, options) {
+                let deferred = $q.defer();
+                let result = [];
+                apiService.proxy_put_dev(device_name, `/rest/loadbalancing/slb/ssl/SSLClientVerificationSettings/${host_name}`, options).then(
+                    function (res) {
+                        if (res && res.status === 200) {
+                            if (res.data["msg"]) {
+                                result[0] = false;
+                                result[1] = res.data.msg;
+                            } else {
+                                result[0] = true;
+                            }
+                            deferred.resolve(result);
+                        } else {
+                            result[0] = false;
+                            result[1] = res.data.msg;
+                            deferred.resolve(result);
+                        }
+                    }
+                );
+                return deferred.promise;
+            }
+
+            function getintercerts(device_name, service_name, host_name) {
                 var deferred = $q.defer();
                 var result = [];
-                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/"+host_name+"/interca_certs").then(
-                    function(res){
+                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/" + host_name + "/interca_certs").then(
+                    function (res) {
                         if (res && res.status === 200) {
                             result[0] = true;
                             result[1] = res.data["SSLVirtualHost"]["interca_certs"];
                         } else {
                             result[0] = false;
                             result[1] = res.data.msg;
-                            
+
                         }
                         deferred.resolve(result);
                     }
@@ -406,11 +476,11 @@
                 return deferred.promise;
             }
 
-            function importintercert (device_name, options) {
+            function importintercert(device_name, options) {
                 var deferred = $q.defer();
                 var result = [];
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_ImportIntercaCert", options).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -429,15 +499,15 @@
                 return deferred.promise;
             }
 
-            function deleteintercert (device_name, service_name, host_name, options) {
+            function deleteintercert(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(options["index"],host_name,options["domain_name"])
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(options["index"], host_name, options["domain_name"])
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_DeleteIntercaCert", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -456,11 +526,11 @@
                 return deferred.promise;
             }
 
-            function getbackupfiles (device_name, service_name, host_name) {
+            function getbackupfiles(device_name, service_name, host_name) {
                 var deferred = $q.defer();
                 var result = [];
-                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/"+host_name+"/backup_certs").then(
-                    function(res){
+                apiService.proxy_get_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/" + host_name + "/backup_certs").then(
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -472,7 +542,7 @@
                         } else {
                             result[0] = false;
                             result[1] = res.data.msg;
-                            
+
                         }
                         deferred.resolve(result);
                     }
@@ -480,11 +550,11 @@
                 return deferred.promise;
             }
 
-            function backupcert (device_name, options) {
+            function backupcert(device_name, options) {
                 var deferred = $q.defer();
                 var result = [];
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Backup", options).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -503,16 +573,16 @@
                 return deferred.promise;
             }
 
-            function restorefile (device_name, service_name, host_name, options) {
+            function restorefile(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(host_name,options["filename"],options["domain_name"]),
-                        "pwd_key":options["pwd_key"]
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(host_name, options["filename"], options["domain_name"]),
+                    "pwd_key": options["pwd_key"]
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Restore", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -530,15 +600,16 @@
                 );
                 return deferred.promise;
             }
-            function deletefile (device_name, service_name, host_name, options) {
+
+            function deletefile(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(host_name,options["filename"],options["domain_name"])
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(host_name, options["filename"], options["domain_name"])
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_Delete_BackupCert", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
@@ -557,24 +628,24 @@
                 return deferred.promise;
             }
 
-            function downloadfile (device_name, service_name, host_name, options) {
+            function downloadfile(device_name, service_name, host_name, options) {
                 var deferred = $q.defer();
                 var result = [];
-                var post_data = { 
-                        "targets":host_name,
-                        "asso_targets":_id_name_join(host_name,options["filename"],options["domain_name"])
-                    }
+                var post_data = {
+                    "targets": host_name,
+                    "asso_targets": _id_name_join(host_name, options["filename"], options["domain_name"])
+                }
                 apiService.proxy_post_dev(device_name, "/rest/loadbalancing/slb/ssl/SSLVirtualHost/_DownloadSavedFile", JSON.stringify(post_data)).then(
-                    function(res){
+                    function (res) {
                         if (res && res.status === 200) {
                             if (res.data["msg"]) {
                                 result[0] = false;
                                 result[1] = res.data.msg;
                                 deferred.resolve(result);
                             } else {
-                                var url = "/pest/localfile/"+res.data.app+'/'+res.data.filename;
+                                var url = "/pest/localfile/" + res.data.app + '/' + res.data.filename;
                                 apiService.proxy_get_dev_file(device_name, url).then(
-                                    function(res) {
+                                    function (res) {
                                         if (res && res.status === 200) {
                                             result[0] = true;
                                             result[1] = res.data;
Index: /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/tabs/ssl_base.controller.js
===================================================================
--- /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/tabs/ssl_base.controller.js	(revision 2715)
+++ /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/tabs/ssl_base.controller.js	(working copy)
@@ -10,6 +10,7 @@
             $rootScope.current_name = $stateParams.name;
             $scope.current_name = $stateParams.name;
             $rootScope.device_name = $stateParams.device;
+            $rootScope.deviceId = $stateParams.deviceId;
             $scope.device_name = $stateParams.device;
             $rootScope.host_name = $stateParams.host_name;
             $scope.host_name = $stateParams.host_name;
@@ -20,17 +21,17 @@
                     return false;
                 }
             };
-            if ($location.path() === '/ssl_monitoring/detail/'+$stateParams.device+'/'+ $stateParams.name +'/'+ $stateParams.host_name) {
+            if ($location.path() === '/ssl_monitoring/detail/' + $stateParams.device + '/' + $stateParams.deviceId + '/' + $stateParams.name + '/' + $stateParams.host_name) {
                 $state.go('index.ssl_monitoring.detail.cert', {
-                    'device': $stateParams.device, 
+                    'device': $stateParams.device,
+                    'deviceId': $stateParams.deviceId,
                     'name': $stateParams.name,
                     'host_name': $stateParams.host_name
                 });
             }
-
         }
     ])
-    .controller('sslMonitoringCertController',[
+    .controller('sslMonitoringCertController', [
         '$scope',
         '$rootScope',
         '$state',
@@ -39,13 +40,13 @@
         '$uibModal',
         '$filter',
         'sslMonitoringService',
-        function ($scope, $rootScope, $state, $stateParams, $location,$uibModal,$filter,sslMonitoringService) {
+        function ($scope, $rootScope, $state, $stateParams, $location, $uibModal, $filter, sslMonitoringService) {
             var ctrl = this;
             ctrl.service_name = $stateParams.name;
             ctrl.host_name = $stateParams.host_name;
             ctrl.device = $stateParams.device;
 
-            ctrl.get_list = function() {
+            ctrl.get_list = function () {
                 ctrl.certList = undefined;
                 sslMonitoringService.getcerts(ctrl.device, ctrl.service_name, ctrl.host_name).then(function (resp) {
                     if (resp && resp[0]) {
@@ -54,16 +55,16 @@
                 });
             }
             ctrl.get_list();
-            ctrl.import = function() {
+            ctrl.import = function () {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_cert_import.html',
                     controller: 'sslMonitoringCertImportCtrl',
                     controllerAs: 'certImport',
                     resolve: {
                         modalData: {
-                            "service_name":ctrl.service_name,
-                            "host_name":ctrl.host_name,
-                            "device":ctrl.device
+                            "service_name": ctrl.service_name,
+                            "host_name": ctrl.host_name,
+                            "device": ctrl.device
                         }
                     }
                 });
@@ -73,7 +74,7 @@
                     }
                 });
             }
-            ctrl.showProgressBar = function() {
+            ctrl.showProgressBar = function () {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/common/templates/progress.html',
                     controller: 'showProgressCtrl',
@@ -81,7 +82,7 @@
                     backdrop: false
                 });
             };
-            ctrl.active = function(row) {
+            ctrl.active = function (row) {
                 ctrl.showProgressBar();
                 sslMonitoringService.activecert(ctrl.device, ctrl.service_name, ctrl.host_name, row).then(function (res) {
                     $rootScope.$broadcast('endLoading', true);
@@ -92,19 +93,20 @@
                     }
                 });
             }
-            ctrl.deactive = function(row) {
+            ctrl.deactive = function (row) {
                 ctrl.showProgressBar();
                 sslMonitoringService.deactivecert(ctrl.device, ctrl.service_name, ctrl.host_name, row).then(function (res) {
                     $rootScope.$broadcast('endLoading', true);
                     if (res[0]) {
                         ctrl.get_list();
                     } else {
-                        var msg = res[1].replace("\""+ctrl.host_name+"\"", "\"{0}\"");
+                        var msg = res[1].replace("\"" + ctrl.host_name + "\"", "\"{0}\"");
                         msg = msg.replace(/\n/g, "");
                         $rootScope.TipService.setMessage($filter('T')(msg, [ctrl.host_name]));
                     }
                 });
             }
+
             function delete_cert(row) {
                 ctrl.showProgressBar();
                 sslMonitoringService.deletecert(ctrl.device, ctrl.service_name, ctrl.host_name, row).then(function (res) {
@@ -116,38 +118,316 @@
                     }
                 });
             }
-            ctrl.delete = function(row) {
+
+            ctrl.delete = function (row) {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/modal/cert_delete.html',
                     controller: 'deleteSSLCtrl',
                     controllerAs: 'delete',
+                    resolve: {}
+                });
+                modalInstance.result.then(function (val) {
+                    if (val) {
+                        delete_cert(row);
+                    }
+                });
+            }
+        }
+    ])
+    .controller('sslMonitoringClientCertController', [
+        '$scope',
+        '$rootScope',
+        '$state',
+        '$stateParams',
+        '$location',
+        '$uibModal',
+        '$filter',
+        'sslMonitoringService',
+        function ($scope, $rootScope, $state, $stateParams, $location, $uibModal, $filter, sslMonitoringService) {
+            let ctrl = this;
+            ctrl.service_name = $stateParams.name;
+            ctrl.host_name = $stateParams.host_name;
+            ctrl.device = $stateParams.device;
+            ctrl.deviceId = $stateParams.deviceId;
+
+            ctrl.get_list = function () {
+                ctrl.clientCertList = undefined;
+                ctrl.rootCACertList = undefined;
+                sslMonitoringService.getClientVerificationConfig(ctrl.device, ctrl.service_name, ctrl.host_name).then(function (resp) {
+                    if (resp && resp[0]) {
+                        let certs = resp[1]['certs'];
+                        ctrl.client_auth = resp[1]['client_auth'];
+                        ctrl.vhost_status = resp[1]['vhost'][0]['host_status'];
+                        if (certs[0] && certs[0]['client_certs']) {
+                            ctrl.clientCertList = certs[0]['client_certs'];
+                        }
+                        if (certs[0] && certs[0]['rootca_certs']) {
+                            ctrl.rootCACertList = certs[0]['rootca_certs'];
+                        }
+                    }
+                })
+            }
+            ctrl.get_list();
+
+            ctrl.importClientCA = function () {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_client_cert_import.html',
+                    controller: 'sslMonitoringClientCertImportCtrl',
+                    controllerAs: 'clientCertImport',
                     resolve: {
+                        modalData: {
+                            "service_name": ctrl.service_name,
+                            "host_name": ctrl.host_name,
+                            "device": ctrl.device,
+                            "deviceId": ctrl.deviceId
+                        }
                     }
+                });
+                modalInstance.result.then(function (result) {
+                    if (result) {
+                        ctrl.get_list();
+                    }
+                });
+            }
+
+            ctrl.importRootCA = function () {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_rootca_cert_import.html',
+                    controller: 'sslMonitoringRootCACertImportCtrl',
+                    controllerAs: 'rootCACertImport',
+                    resolve: {
+                        modalData: {
+                            "service_name": ctrl.service_name,
+                            "host_name": ctrl.host_name,
+                            "device": ctrl.device,
+                            "deviceId": ctrl.deviceId
+                        }
+                    }
+                });
+                modalInstance.result.then(function (result) {
+                    if (result) {
+                        ctrl.get_list();
+                    }
+                });
+            }
+            ctrl.showProgressBar = function () {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+
+            ctrl.save = function () {
+                let options = JSON.stringify({
+                    client_auth: ctrl.client_auth,
+                });
+                ctrl.showProgressBar();
+                let updateVHostStatus;
+                if (ctrl.vhost_status) {
+                    updateVHostStatus = `ssl start "${ctrl.host_name}"`;
+                } else {
+                    updateVHostStatus = `ssl stop "${ctrl.host_name}"`;
+                }
+                sslMonitoringService
+                    .updateClientVerificationSettings(ctrl.device, ctrl.host_name, options)
+                    .then(function (resp) {
+                        if (resp && resp[0]) {
+                            sslMonitoringService
+                                .executeAPVCLICmd(ctrl.deviceId, updateVHostStatus)
+                                .then(function (res) {
+                                    $rootScope.$broadcast('endLoading', true);
+                                    if (res && res[0]) {
+                                        $rootScope.TipService.setMessage($filter('T')("The client authentication was updated successfully."));
+                                    } else {
+                                        $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
+                                    }
+                                });
+                        } else {
+                            $rootScope.$broadcast('endLoading', true);
+                            $rootScope.TipService.setMessage($filter('T')(resp[1].replace(/\n/g, "")));
+                        }
+                    });
+            }
+
+            function delete_cert(row, type) {
+                ctrl.showProgressBar();
+                let cmd = `no ssl ${type} "${ctrl.host_name}" \nYes\n`
+                sslMonitoringService.executeAPVCLICmd(ctrl.deviceId, cmd).then(function (res) {
+                    $rootScope.$broadcast('endLoading', true);
+                    if (res[0]) {
+                        ctrl.get_list();
+                    } else {
+                        $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
+                    }
+                });
+            }
+
+            ctrl.delete = function (row, type) {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/ssl_monitoring/modal/cert_delete.html',
+                    controller: 'deleteSSLCtrl',
+                    controllerAs: 'delete',
+                    resolve: {}
                 });
                 modalInstance.result.then(function (val) {
                     if (val) {
-                        delete_cert(row);
+                        delete_cert(row, type);
                     }
                 });
             }
         }
     ])
-    .controller('sslMonitoringInterCertController',[
+    .controller('sslMonitoringClientCertImportCtrl', [
         '$scope',
         '$rootScope',
         '$state',
         '$stateParams',
+        '$uibModal',
+        '$filter',
+        '$uibModalInstance',
+        'sslMonitoringService',
+        'modalData',
+        function ($scope, $rootScope, $state, $stateParams, $uibModal, $filter, $uibModalInstance, sslMonitoringService, modalData) {
+            let modalViewModel = this;
+            modalViewModel.service_name = modalData.service_name;
+            modalViewModel.device = modalData.device;
+            modalViewModel.deviceId = modalData.deviceId;
+            modalViewModel.host = modalData.host_name;
+            modalViewModel.domain_list = undefined;
+            modalViewModel.domain_name = "---Please Select---";
+            modalViewModel.index = "1";
+            modalViewModel.showProgressBar = function () {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+            sslMonitoringService
+                .getVhostDomainList(modalViewModel.device, modalViewModel.host)
+                .then(function (res) {
+                    if (res[0]) {
+                        modalViewModel.domain_list = res[1];
+                    }
+                });
+            modalViewModel.modalClose = function () {
+                $uibModalInstance.dismiss();
+            };
+            modalViewModel.save = function () {
+                if (!modalViewModel.cert_content) {
+                    modalViewModel.failed = $filter('T')("Please set Cert Content!");
+                    return false;
+                }
+                if (!modalViewModel.key) {
+                    modalViewModel.failed = $filter('T')("Please set Private Key!");
+                    return false;
+                }
+                modalViewModel.showProgressBar();
+                let importClientKey = `ssl import clientkey "${modalViewModel.host}" \nYES\n${modalViewModel.key}\n...\n${modalViewModel.key_passphrase || ""}\n`;
+                let importClientCert = `ssl import clientcert "${modalViewModel.host}" \nYES\n${modalViewModel.cert_content}\n...\n${modalViewModel.key_passphrase || ""}\n`;
+                sslMonitoringService
+                    .executeAPVCLICmd(modalData.deviceId, importClientKey)
+                    .then(function (res) {
+                        if (res[0]) {
+                            sslMonitoringService
+                                .executeAPVCLICmd(modalData.deviceId, importClientCert)
+                                .then(function (res) {
+                                    $rootScope.$broadcast('endLoading', true);
+                                    if (res[0]) {
+                                        $uibModalInstance.close(true);
+                                    } else {
+                                        $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
+                                    }
+                                });
+                        } else {
+                            $rootScope.$broadcast('endLoading', true);
+                            $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
+                        }
+                    });
+            }
+        }
+    ])
+    .controller('sslMonitoringRootCACertImportCtrl', [
+        '$scope',
+        '$rootScope',
+        '$state',
+        '$stateParams',
+        '$uibModal',
+        '$filter',
+        '$uibModalInstance',
+        'sslMonitoringService',
+        'modalData',
+        function ($scope, $rootScope, $state, $stateParams, $uibModal, $filter, $uibModalInstance, sslMonitoringService, modalData) {
+            let modalViewModel = this;
+            modalViewModel.service_name = modalData.service_name;
+            modalViewModel.device = modalData.device;
+            modalViewModel.deviceId = modalData.deviceId;
+            modalViewModel.host = modalData.host_name;
+            modalViewModel.domain_list = undefined;
+            modalViewModel.domain_name = "---Please Select---";
+            modalViewModel.index = "1";
+            modalViewModel.showProgressBar = function () {
+                let modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+            sslMonitoringService
+                .getVhostDomainList(modalViewModel.device, modalViewModel.host)
+                .then(function (res) {
+                    if (res[0]) {
+                        modalViewModel.domain_list = res[1];
+                    }
+                });
+            modalViewModel.modalClose = function () {
+                $uibModalInstance.dismiss();
+            };
+            modalViewModel.save = function () {
+                if (!modalViewModel.cert_content) {
+                    modalViewModel.failed = $filter('T')("Please set Cert Content!");
+                    return false;
+                }
+                let importRootCA;
+                if (modalViewModel.domain_name && modalViewModel.domain_name !== '---Please Select---') {
+                    importRootCA = `ssl import rootca "${modalViewModel.host}" "${modalViewModel.domain_name}" \n${modalViewModel.cert_content}\n...\n`;
+                } else {
+                    importRootCA = `ssl import rootca "${modalViewModel.host}" \n${modalViewModel.cert_content}\n...\n`;
+                }
+                modalViewModel.showProgressBar();
+                sslMonitoringService
+                    .executeAPVCLICmd(modalData.deviceId, importRootCA)
+                    .then(function (res) {
+                        $rootScope.$broadcast('endLoading', true);
+                        if (res[0]) {
+                            $uibModalInstance.close(true);
+                        } else {
+                            $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
+                        }
+                    });
+            }
+        }
+    ])
+    .controller('sslMonitoringInterCertController', [
+        '$scope',
+        '$rootScope',
+        '$state',
+        '$stateParams',
         '$location',
         '$uibModal',
         '$filter',
         'sslMonitoringService',
-        function ($scope, $rootScope, $state, $stateParams, $location,$uibModal,$filter,sslMonitoringService) {
+        function ($scope, $rootScope, $state, $stateParams, $location, $uibModal, $filter, sslMonitoringService) {
             var ctrl = this;
             ctrl.service_name = $stateParams.name;
             ctrl.host_name = $stateParams.host_name;
             ctrl.device = $stateParams.device;
 
-            ctrl.get_list = function() {
+            ctrl.get_list = function () {
                 ctrl.certList = undefined;
                 sslMonitoringService.getintercerts(ctrl.device, ctrl.service_name, ctrl.host_name).then(function (resp) {
                     if (resp && resp[0]) {
@@ -156,16 +436,16 @@
                 });
             }
             ctrl.get_list();
-            ctrl.import = function() {
+            ctrl.import = function () {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_intercert_import.html',
                     controller: 'sslMonitoringInterCertImportCtrl',
                     controllerAs: 'certImport',
                     resolve: {
                         modalData: {
-                            "service_name":ctrl.service_name,
-                            "host_name":ctrl.host_name,
-                            "device":ctrl.device
+                            "service_name": ctrl.service_name,
+                            "host_name": ctrl.host_name,
+                            "device": ctrl.device
                         }
                     }
                 });
@@ -175,7 +455,7 @@
                     }
                 });
             }
-            ctrl.showProgressBar = function() {
+            ctrl.showProgressBar = function () {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/common/templates/progress.html',
                     controller: 'showProgressCtrl',
@@ -183,6 +463,7 @@
                     backdrop: false
                 });
             };
+
             function delete_cert(row) {
                 ctrl.showProgressBar();
                 sslMonitoringService.deleteintercert(ctrl.device, ctrl.service_name, ctrl.host_name, row).then(function (res) {
@@ -194,13 +475,13 @@
                     }
                 });
             }
-            ctrl.delete = function(row) {
+
+            ctrl.delete = function (row) {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/modal/cert_delete.html',
                     controller: 'deleteSSLCtrl',
                     controllerAs: 'delete',
-                    resolve: {
-                    }
+                    resolve: {}
                 });
                 modalInstance.result.then(function (val) {
                     if (val) {
@@ -210,7 +491,7 @@
             }
         }
     ])
-    .controller('sslMonitoringBackupController',[
+    .controller('sslMonitoringBackupController', [
         '$scope',
         '$rootScope',
         '$state',
@@ -225,7 +506,7 @@
             ctrl.host_name = $stateParams.host_name;
             ctrl.device = $stateParams.device;
 
-            ctrl.get_list = function() {
+            ctrl.get_list = function () {
                 ctrl.fileList = undefined;
                 sslMonitoringService.getbackupfiles(ctrl.device, ctrl.service_name, ctrl.host_name).then(function (resp) {
                     if (resp && resp[0]) {
@@ -234,16 +515,16 @@
                 });
             }
             ctrl.get_list();
-            ctrl.backup = function() {
+            ctrl.backup = function () {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_backup_add.html',
                     controller: 'sslMonitoringBackupAddCtrl',
                     controllerAs: 'certBackup',
                     resolve: {
                         modalData: {
-                            "service_name":ctrl.service_name,
-                            "host_name":ctrl.host_name,
-                            "device":ctrl.device
+                            "service_name": ctrl.service_name,
+                            "host_name": ctrl.host_name,
+                            "device": ctrl.device
                         }
                     }
                 });
@@ -253,17 +534,17 @@
                     }
                 });
             }
-            ctrl.restore = function(row) {
+            ctrl.restore = function (row) {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/tabs/ssl_restore.html',
                     controller: 'sslMonitoringBackupRestoreCtrl',
                     controllerAs: 'certRestorep',
                     resolve: {
                         modalData: {
-                            "service_name":ctrl.service_name,
-                            "host_name":ctrl.host_name,
-                            "device":ctrl.device,
-                            "row":row
+                            "service_name": ctrl.service_name,
+                            "host_name": ctrl.host_name,
+                            "device": ctrl.device,
+                            "row": row
                         }
                     }
                 });
@@ -273,7 +554,7 @@
                     }
                 });
             }
-            ctrl.showProgressBar = function() {
+            ctrl.showProgressBar = function () {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/common/templates/progress.html',
                     controller: 'showProgressCtrl',
@@ -281,7 +562,8 @@
                     backdrop: false
                 });
             };
-            function delete_cert (row) {
+
+            function delete_cert(row) {
                 ctrl.showProgressBar();
                 sslMonitoringService.deletefile(ctrl.device, ctrl.service_name, ctrl.host_name, row).then(function (res) {
                     $rootScope.$broadcast('endLoading', true);
@@ -292,13 +574,13 @@
                     }
                 });
             }
-            ctrl.delete = function(row) {
+
+            ctrl.delete = function (row) {
                 var modalInstance = $uibModal.open({
                     templateUrl: 'app/modules/ssl_monitoring/modal/cert_delete.html',
                     controller: 'deleteSSLCtrl',
                     controllerAs: 'delete',
-                    resolve: {
-                    }
+                    resolve: {}
                 });
                 modalInstance.result.then(function (val) {
                     if (val) {
@@ -306,15 +588,15 @@
                     }
                 });
             }
-            ctrl.download = function(row) {
+            ctrl.download = function (row) {
                 ctrl.showProgressBar();
                 sslMonitoringService.downloadfile(ctrl.device, ctrl.service_name, ctrl.host_name, row).then(function (res) {
                     $rootScope.$broadcast('endLoading', true);
                     if (res[0]) {
-                        var blob = new Blob([res[1]],{type:"application/octet-stream"});
+                        var blob = new Blob([res[1]], {type: "application/octet-stream"});
                         var link = document.createElement("a");
                         link.href = window.URL.createObjectURL(blob);
-                        link.download =  row.filename;
+                        link.download = row.filename;
                         document.body.appendChild(link);
                         link.click();
                         document.body.removeChild(link);
@@ -336,56 +618,56 @@
         'sslMonitoringService',
         'modalData',
         function ($scope, $rootScope, $state, $stateParams, $uibModal, $filter, $uibModalInstance, sslMonitoringService, modalData) {
-              var modalViewModel = this;
-              modalViewModel.service_name = modalData.service_name;
-              modalViewModel.device = modalData.device;
-              modalViewModel.host = modalData.host_name;
-              modalViewModel.domain_list = undefined;
-              modalViewModel.domain_name = "---Please Select---";
-              modalViewModel.index = "1";
-              modalViewModel.showProgressBar = function() {
-                  var modalInstance = $uibModal.open({
-                      templateUrl: 'app/modules/common/templates/progress.html',
-                      controller: 'showProgressCtrl',
-                      controllerAs: 'progress',
-                      backdrop: false
-                  });
-              };
-              sslMonitoringService
+            var modalViewModel = this;
+            modalViewModel.service_name = modalData.service_name;
+            modalViewModel.device = modalData.device;
+            modalViewModel.host = modalData.host_name;
+            modalViewModel.domain_list = undefined;
+            modalViewModel.domain_name = "---Please Select---";
+            modalViewModel.index = "1";
+            modalViewModel.showProgressBar = function () {
+                var modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+            sslMonitoringService
                 .getVhostDomainList(modalViewModel.device, modalViewModel.host)
-                .then(function(res) {
+                .then(function (res) {
                     if (res[0]) {
-                        modalViewModel.domain_list=res[1];
+                        modalViewModel.domain_list = res[1];
                     }
                 });
-              modalViewModel.modalClose = function() {
-                  $uibModalInstance.dismiss();
-              };
-              modalViewModel.save = function () {
-                  if (!modalViewModel.cert_content) {
+            modalViewModel.modalClose = function () {
+                $uibModalInstance.dismiss();
+            };
+            modalViewModel.save = function () {
+                if (!modalViewModel.cert_content) {
                     modalViewModel.failed = $filter('T')("Please set Cert Content!");
                     return false;
-                  }
-                  if (!modalViewModel.key) {
+                }
+                if (!modalViewModel.key) {
                     modalViewModel.failed = $filter('T')("Please set Private Key!");
                     return false;
-                  }
-                  var options = JSON.stringify({
+                }
+                var options = JSON.stringify({
                     "targets": modalViewModel.host,
                     "using": {
-                          "manual_input": { 
-                            "index" : modalViewModel.index,
-                            "key_passphrase" : modalViewModel.key_passphrase || "",
-                            "cert_content" : modalViewModel.cert_content,
-                            "domain_name" : modalViewModel.domain_name || "---Please Select---",
-                            "key" : modalViewModel.key,
-                          }
-                      }
-                  });
-                  modalViewModel.showProgressBar();
-                  sslMonitoringService
+                        "manual_input": {
+                            "index": modalViewModel.index,
+                            "key_passphrase": modalViewModel.key_passphrase || "",
+                            "cert_content": modalViewModel.cert_content,
+                            "domain_name": modalViewModel.domain_name || "---Please Select---",
+                            "key": modalViewModel.key,
+                        }
+                    }
+                });
+                modalViewModel.showProgressBar();
+                sslMonitoringService
                     .importcert(modalData.device, options)
-                    .then(function(res) {
+                    .then(function (res) {
                         $rootScope.$broadcast('endLoading', true);
                         if (res[0]) {
                             $uibModalInstance.close(true);
@@ -393,10 +675,10 @@
                             $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
                         }
                     });
-                }
-          }
-      ])
-      .controller('sslMonitoringInterCertImportCtrl', [
+            }
+        }
+    ])
+    .controller('sslMonitoringInterCertImportCtrl', [
         '$scope',
         '$rootScope',
         '$state',
@@ -407,48 +689,48 @@
         'sslMonitoringService',
         'modalData',
         function ($scope, $rootScope, $state, $stateParams, $uibModal, $filter, $uibModalInstance, sslMonitoringService, modalData) {
-              var modalViewModel = this;
-              modalViewModel.service_name = modalData.service_name;
-              modalViewModel.device = modalData.device;
-              modalViewModel.host = modalData.host_name;
-              modalViewModel.domain_list = undefined;
-              modalViewModel.domain_name = "---Please Select---";
-              modalViewModel.showProgressBar = function() {
-                  var modalInstance = $uibModal.open({
-                      templateUrl: 'app/modules/common/templates/progress.html',
-                      controller: 'showProgressCtrl',
-                      controllerAs: 'progress',
-                      backdrop: false
-                  });
-              };
-              sslMonitoringService
+            var modalViewModel = this;
+            modalViewModel.service_name = modalData.service_name;
+            modalViewModel.device = modalData.device;
+            modalViewModel.host = modalData.host_name;
+            modalViewModel.domain_list = undefined;
+            modalViewModel.domain_name = "---Please Select---";
+            modalViewModel.showProgressBar = function () {
+                var modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+            sslMonitoringService
                 .getVhostDomainList(modalViewModel.device, modalViewModel.host)
-                .then(function(res) {
+                .then(function (res) {
                     if (res[0]) {
-                        modalViewModel.domain_list=res[1];
+                        modalViewModel.domain_list = res[1];
                     }
                 });
-              modalViewModel.modalClose = function() {
-                  $uibModalInstance.dismiss();
-              };
-              modalViewModel.save = function () {
-                  if (!modalViewModel.cert_content) {
+            modalViewModel.modalClose = function () {
+                $uibModalInstance.dismiss();
+            };
+            modalViewModel.save = function () {
+                if (!modalViewModel.cert_content) {
                     modalViewModel.failed = $filter('T')("Please set Cert Content!");
                     return false;
-                  }
-                  var options = JSON.stringify({
+                }
+                var options = JSON.stringify({
                     "targets": modalViewModel.host,
                     "using": {
-                          "manual_input": {
-                            "cert_content" : modalViewModel.cert_content,
-                            "domain_name" : modalViewModel.domain_name || "---Please Select---"
-                          }
-                      }
-                  });
-                  modalViewModel.showProgressBar();
-                  sslMonitoringService
+                        "manual_input": {
+                            "cert_content": modalViewModel.cert_content,
+                            "domain_name": modalViewModel.domain_name || "---Please Select---"
+                        }
+                    }
+                });
+                modalViewModel.showProgressBar();
+                sslMonitoringService
                     .importintercert(modalData.device, options)
-                    .then(function(res) {
+                    .then(function (res) {
                         $rootScope.$broadcast('endLoading', true);
                         if (res[0]) {
                             $uibModalInstance.close(true);
@@ -456,10 +738,10 @@
                             $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
                         }
                     });
-                }
-          }
-      ])
-      .controller('sslMonitoringBackupAddCtrl', [
+            }
+        }
+    ])
+    .controller('sslMonitoringBackupAddCtrl', [
         '$scope',
         '$rootScope',
         '$state',
@@ -470,56 +752,56 @@
         'sslMonitoringService',
         'modalData',
         function ($scope, $rootScope, $state, $stateParams, $uibModal, $filter, $uibModalInstance, sslMonitoringService, modalData) {
-              var modalViewModel = this;
-              modalViewModel.service_name = modalData.service_name;
-              modalViewModel.device = modalData.device;
-              modalViewModel.host = modalData.host_name;
-              modalViewModel.domain_list = undefined;
-              modalViewModel.filename = "";
-              modalViewModel.domain_name = "---Please Select---";
-              modalViewModel.pwd_key = "";
-              modalViewModel.pwd_cf = "";
-              modalViewModel.showProgressBar = function() {
-                  var modalInstance = $uibModal.open({
-                      templateUrl: 'app/modules/common/templates/progress.html',
-                      controller: 'showProgressCtrl',
-                      controllerAs: 'progress',
-                      backdrop: false
-                  });
-              };
-              sslMonitoringService
+            var modalViewModel = this;
+            modalViewModel.service_name = modalData.service_name;
+            modalViewModel.device = modalData.device;
+            modalViewModel.host = modalData.host_name;
+            modalViewModel.domain_list = undefined;
+            modalViewModel.filename = "";
+            modalViewModel.domain_name = "---Please Select---";
+            modalViewModel.pwd_key = "";
+            modalViewModel.pwd_cf = "";
+            modalViewModel.showProgressBar = function () {
+                var modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+            sslMonitoringService
                 .getVhostDomainList(modalViewModel.device, modalViewModel.host)
-                .then(function(res) {
+                .then(function (res) {
                     if (res[0]) {
-                        modalViewModel.domain_list=res[1];
+                        modalViewModel.domain_list = res[1];
                     }
                 });
-              modalViewModel.modalClose = function() {
-                  $uibModalInstance.dismiss();
-              };
-              modalViewModel.save = function () {
-                  if (!modalViewModel.filename) {
+            modalViewModel.modalClose = function () {
+                $uibModalInstance.dismiss();
+            };
+            modalViewModel.save = function () {
+                if (!modalViewModel.filename) {
                     modalViewModel.failed = $filter('T')("Please set File Name!");
                     return false;
-                  }
-                  if (!modalViewModel.pwd_key) {
+                }
+                if (!modalViewModel.pwd_key) {
                     modalViewModel.failed = $filter('T')("Please set Password!");
                     return false;
-                  }
-                  if (modalViewModel.pwd_key != modalViewModel.pwd_cf) {
+                }
+                if (modalViewModel.pwd_key != modalViewModel.pwd_cf) {
                     modalViewModel.failed = $filter('T')("Password not same!");
                     return false;
-                  }
-                  var options = JSON.stringify({
+                }
+                var options = JSON.stringify({
                     "targets": modalViewModel.host,
-                    "filename":modalViewModel.filename,
-                    "pwd_key":modalViewModel.pwd_key,
-                    "domain_name":modalViewModel.domain_name
-                  });
-                  modalViewModel.showProgressBar();
-                  sslMonitoringService
+                    "filename": modalViewModel.filename,
+                    "pwd_key": modalViewModel.pwd_key,
+                    "domain_name": modalViewModel.domain_name
+                });
+                modalViewModel.showProgressBar();
+                sslMonitoringService
                     .backupcert(modalData.device, options)
-                    .then(function(res) {
+                    .then(function (res) {
                         $rootScope.$broadcast('endLoading', true);
                         if (res[0]) {
                             $uibModalInstance.close(true);
@@ -527,10 +809,10 @@
                             $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
                         }
                     });
-                }
-          }
-      ])
-      .controller('sslMonitoringBackupRestoreCtrl', [
+            }
+        }
+    ])
+    .controller('sslMonitoringBackupRestoreCtrl', [
         '$scope',
         '$rootScope',
         '$state',
@@ -541,40 +823,40 @@
         'sslMonitoringService',
         'modalData',
         function ($scope, $rootScope, $state, $stateParams, $uibModal, $filter, $uibModalInstance, sslMonitoringService, modalData) {
-              var modalViewModel = this;
-              modalViewModel.service_name = modalData.service_name;
-              modalViewModel.device = modalData.device;
-              modalViewModel.host = modalData.host_name;
-              modalViewModel.showProgressBar = function() {
-                  var modalInstance = $uibModal.open({
-                      templateUrl: 'app/modules/common/templates/progress.html',
-                      controller: 'showProgressCtrl',
-                      controllerAs: 'progress',
-                      backdrop: false
-                  });
-              };
-              modalViewModel.modalClose = function() {
-                  $uibModalInstance.dismiss();
-              };
-              modalViewModel.save = function () {
-                  if (!modalViewModel.pwd_key) {
+            var modalViewModel = this;
+            modalViewModel.service_name = modalData.service_name;
+            modalViewModel.device = modalData.device;
+            modalViewModel.host = modalData.host_name;
+            modalViewModel.showProgressBar = function () {
+                var modalInstance = $uibModal.open({
+                    templateUrl: 'app/modules/common/templates/progress.html',
+                    controller: 'showProgressCtrl',
+                    controllerAs: 'progress',
+                    backdrop: false
+                });
+            };
+            modalViewModel.modalClose = function () {
+                $uibModalInstance.dismiss();
+            };
+            modalViewModel.save = function () {
+                if (!modalViewModel.pwd_key) {
                     modalViewModel.failed = $filter('T')("Please set Password!");
                     return false;
-                  }
-                  var options = {
-                    "filename":modalData.row.filename,
-                    "pwd_key":modalViewModel.pwd_key,
-                    "domain_name":modalData.row.domain_name
-                  };
-                  modalViewModel.showProgressBar();
-                  sslMonitoringService.restorefile(modalViewModel.device, modalViewModel.service_name, modalViewModel.host, options).then(function (res) {
-                        $rootScope.$broadcast('endLoading', true);
-                        if (res[0]) {
-                            $uibModalInstance.close(true);
-                        } else {
-                            $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
-                        }
-                    });
                 }
-          }
-      ]);
+                var options = {
+                    "filename": modalData.row.filename,
+                    "pwd_key": modalViewModel.pwd_key,
+                    "domain_name": modalData.row.domain_name
+                };
+                modalViewModel.showProgressBar();
+                sslMonitoringService.restorefile(modalViewModel.device, modalViewModel.service_name, modalViewModel.host, options).then(function (res) {
+                    $rootScope.$broadcast('endLoading', true);
+                    if (res[0]) {
+                        $uibModalInstance.close(true);
+                    } else {
+                        $rootScope.TipService.setMessage($filter('T')(res[1].replace(/\n/g, "")));
+                    }
+                });
+            }
+        }
+    ]);
Index: /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/tabs/ssl_base.html
===================================================================
--- /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/tabs/ssl_base.html	(revision 2715)
+++ /branches/amp_3_7_1/src/webui/webui/htdocs/new/src/client/app/modules/ssl_monitoring/tabs/ssl_base.html	(working copy)
@@ -1,19 +1,23 @@
 <div>
     <div ncy-breadcrumb></div>
     <ul class="nav nav-tabs">
-        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{ current_name }}/{{ host_name }}/cert') }">
-            <a ui-sref="index.ssl_monitoring.detail.cert({device:'{{device_name}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Certificate List' | T}}</a>
+        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/cert') }">
+            <a ui-sref="index.ssl_monitoring.detail.cert({device:'{{device_name}}',deviceId:'{{deviceId}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Certificate List' | T}}</a>
         </li>
-        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{ current_name }}/{{ host_name }}/intercert') }">
-            <a ui-sref="index.ssl_monitoring.detail.intercert({device:'{{device_name}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Intermediate CA Certificate List' | T}}</a>
+        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/client_certificates') }">
+            <a ui-sref="index.ssl_monitoring.detail.client_certificates({device:'{{device_name}}',deviceId:'{{deviceId}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Client Verification' | T}}</a>
         </li>
-        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{ current_name }}/{{ host_name }}/backup') }">
-            <a ui-sref="index.ssl_monitoring.detail.backup({device:'{{device_name}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Certificate Backup/Restore' | T}}</a>
+        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/intercert') }">
+            <a ui-sref="index.ssl_monitoring.detail.intercert({device:'{{device_name}}',deviceId:'{{deviceId}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Intermediate CA Certificate List' | T}}</a>
         </li>
+        <li role="presentation" ng-class="{ active: url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/backup') }">
+            <a ui-sref="index.ssl_monitoring.detail.backup({device:'{{device_name}}',deviceId:'{{deviceId}}',name:'{{ current_name }}',host_name:'{{ host_name }}'})">{{ 'Certificate Backup/Restore' | T}}</a>
+        </li>
     </ul>
     <div class="">
-        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{ current_name }}/{{ host_name }}/cert')" ui-view="cert"></div>
-        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{ current_name }}/{{ host_name }}/intercert')" ui-view="intercert"></div>
-        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{ current_name }}/{{ host_name }}/backup')" ui-view="backup"></div>
+        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/cert')" ui-view="cert"></div>
+        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/client_certificates')" ui-view="client_certificates"></div>
+        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/intercert')" ui-view="intercert"></div>
+        <div class="" ng-show="url_contain('/ssl_monitoring/detail/{{ device_name }}/{{deviceId}}/{{ current_name }}/{{ host_name }}/backup')" ui-view="backup"></div>
     </div>
 </div>
