2009-11-25 128 views
9

我們有一個基於瀏覽器的應用程序,我們希望用戶在輸入時重新進行驗證。因此,當他們訪問該URL時,我們希望他們能夠看到PIN提示,以便他們必須重新進行身份驗證。有沒有合理的方法來做到這一點?CAC智能卡重新驗證

補充信息:這是CAC卡,工作站上有ActivIdentity和Tumbleweed。另外,如有必要,我可以在工作站上添加一項服務。瀏覽器都是IE7。 Web服務器是IIS 6,頁面是用ASP.NET編寫的(主要是)。

+0

請分享如何解決此問題。 :) – 2013-05-13 02:35:04

+1

@Kevin我通過向客戶解釋CAC卡上的引腳超時完全獨立於瀏覽器,推回了要求。從安全角度來看,嘗試干擾正常功能並不是一個好主意。他們的安全人員同意,不必每次都讓客戶重新進入別針;更好的方法是隻有在過期後再進入。 – adg 2013-05-29 20:43:49

回答

10

這裏涉及到幾個不同的軟件。

首先是卡本身。要執行數字簽名,CAC必須處於「已驗證」狀態,即在插入卡後輸入PIN。除此之外,卡上的每個鍵都有一個標誌,指示每次使用密鑰時是否必須輸入PIN。我沒有檢查,但我認爲這是爲CAC上的「電子郵件」密鑰對設置的。因此,您需要查找哪些密鑰具有此「始終驗證」標誌設置,並將服務上的路徑驗證器配置爲僅接受這些密鑰。您可能需要擴展密鑰用法中的特定OID,或從路徑構建中排除某些DoD中間證書(可能將其標記爲已撤銷)。

與卡通話的中間件還可以緩存PIN碼,並在卡完成操作前指示需要PIN時提供給卡。我認爲ActivClient是通過版本6來完成PIN緩存功能的,但在版本7中,這個選項似乎沒有了。我在Windows內置的PIV支持中沒有發現類似的東西。這個「功能」可能會危及安全性,所以我的猜測是它被故意刪除,不會有任何註冊表黑客或以其他方式恢復行爲。除非您管理用戶的機器,否則這是您無法控制的內容;沒有可用於強制輸入PIN碼的HTTP標頭或TLS選項。但是,對於較新的系統,這不應該是一個問題。

在服務器端,必須進行完整的握手才能使客戶端執行身份驗證。如果有有效的TLS會話,則不會發生客戶端身份驗證。因此,您需要找到一種方法在請求身份驗證之前使TLS會話無效(不是應用程序會話,可能與HTTP cookie關聯),或將身份驗證請求指向另一個未啓用會話的接口。

+0

感謝sylvarking,我想我明白你在說什麼。我對服務器和工作站有很多控制權(其中幾百個),所以也許我可以在瀏覽器中做一些會導致智能卡需要密碼的東西? – adg 2009-11-27 22:01:39

+0

沒錯。如果您管理工作站,則可能會配置所有讀卡器軟件以更頻繁地提示輸入PIN。例如,我使用ActivClient作爲讀卡器軟件。實際上彈出對話框要求輸入PIN碼,並且有一個設置可以控制用戶需要重新輸入密碼的頻率。 – erickson 2009-11-27 22:44:24

+1

我覺得有幸找到有ActivIdentity Experience的人。您的回覆促使我查看PIN緩存服務,這是我以前從未見過的。我可以看到12個屬性,其中一個名爲「啓用PIN緩存」。我會試着去解決這個問題。 – adg 2009-11-28 01:12:45

6

在Web上進行智能卡客戶端身份驗證有兩種方法:標準TLS/SSL或瀏覽器自定義插件。我假設你在談論標準的Web瀏覽器(IE/FF/Safari)和SSL認證。

有兩件事情,對於PIN重要提示:中

  • SSL會話和SSL會話緩存的瀏覽器
  • 卡上相關的私鑰
  • 方式中間件的認證狀態實現。

最後,從安全角度來看,知道何時「請求」PIN的卡片 - 有些卡片和密鑰需要使用密鑰進行每次操作的PIN,有些卡片可以獲得PIN碼一次,並將密鑰保持爲已驗證狀態,直到從讀取器中移除或由應用程序重置爲止。

如果瀏覽器緩存中的會話無法重新使用或連接建立時,智能卡中間件(Linux上的PKCS#11,Windows上的CryptoAPI/BaseCSP模塊或OSX上的Tokend)需要與卡上的鑰匙交談。如果卡上的身份驗證狀態需要輸入PIN,則回調通常由瀏覽器觸發。或者如果中間件知道它需要PIN碼,它會在與卡通話之前詢問它。

輸入PIN碼和實際重新驗證對私鑰的訪問權限並重新驗證SSL會話之間不存在1:1關係。

對於標準的SSL,您取決於SSL在瀏覽器中實施的方式,並且不能在客戶端提供100%可靠的「通過輸入PIN重新進行身份驗證」。

如果您使用的是Linux,那麼使用OpenSC(其中,AFAIK可以使用CAC卡),您可以將opensc.conf中的「transaction_reset」設置爲true,這將導致卡在每次事務處理後重置(每次SSL會話協商),這樣您就可以確保無論何時您打開一個新的SSL會話,用戶都必須再次輸入PIN碼。這是客戶端配置,但不是服務器啓動的功能。

+0

感謝martin的出色評論。我發現我應該提供更多的信息,但我仍然很無知在這種情況下什麼是有意義的。 工作站確實有稱爲ActivIdentity或ActivClient的中間件。該進程名爲accoca.exe。他們也在運行風滾草。 – adg 2009-11-27 22:02:43

+0

另外,我從您的評論中得到,我的挑戰是以某種方式說服該卡,它需要再次請求PIN碼。我還沒有弄清楚中間件是如何工作的,但是可以合理地說,當用戶訪問一個URL時,我可以在網頁上放置一些東西,這會導致CAC決定它需要一個PIN碼? 也許我可以殺死SSL會話? (對不起,如果這是愚蠢的想法,我有點困惑)。 – adg 2009-11-27 22:03:17

+0

當我清除SSL狀態(使用IE7-Tools-Internet選項 - 內容清除SSL狀態時,它會提示我輸入證書,但不輸入PIN。如果我選​​擇了正確的證書,如果我選擇了錯誤的證書,所以爲什麼它會再次提示我提供證書,如果它不會提示輸入PIN碼?我不明白! – adg 2009-11-28 01:33:48

0

您可以使用JavaScript功能,使瀏覽器忘記上一些瀏覽器現有的SSL緩存:

function logout() { 
    // clear browser authentication cache 
    // IE specific 
    try 
    { 
     document.execCommand("ClearAuthenticationCache", "false"); 
    } 
    catch(e) 
    { 
     // do nothing 
    } 

    // clear for firefox or any browser that supports window.crypto API 
    if (window.crypto && typeof window.crypto.logout === "function") { 
     window.crypto.logout(); 
    } 
} 

您可以使用JavaScript的setTimeout方法來調用上述註銷功能,並可能重定向他們logout.aspx頁面給力客戶端輸入新的PIN碼。

但它使用JavaScript,代碼依賴於瀏覽器,並且不適用於所有瀏覽器。