2014-09-18 5 views
0

문서에 서명 할 웹 응용 프로그램 (aspx/C#)에서 사용자 USB 키 (인증/서명 키)에있는 인증서를 나열하려면 어떻게합니까?X509Store - USB 키에있는 인증서를 나열하는 방법

여기 내 코드입니다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Security.Cryptography.X509Certificates; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Signature1 
{ 
    public partial class signature : System.Web.UI.Page 
    { 
     string strTxt = "Certificates : "; 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 

      store.Open(OpenFlags.ReadOnly); 
      foreach (X509Certificate2 cert in store.Certificates) 
      { 
       strTxt += "\nDélivered to " + cert.SubjectName.Name + " by " + cert.IssuerName.Name; 

      } 
      store.Close(); 
      myTextbox.Text = strTxt ; 

     } 
    } 
} 

이 코드는 로컬 컴퓨터 (디버그 모드)에 잘 작동하지만 응용 프로그램 서버에 게시 할 때 빈 목록을 반환합니다.
도움 주셔서 감사합니다.

답변

0

서버에있는 장치에서 ceritificates 읽을 필요가있는 경우 : 코드가 서비스 계정 (대부분)에서 작동하는 응용 프로그램 서버에서

합니다. 이 경우 CurrentUser 저장소 (StoreLocation.CurrentUser 매개 변수로 참조하는)는 비어 있습니다.

이제 USB 토큰에서 인증서를 매핑하는 방법은 하드웨어 드라이버에 따라 다릅니다. 인증서를 LocalMachine 저장소에 매핑 할 수 있으면 코드를 수정하여 LocalMachine에서 인증서를 열거 할 수 있습니다. 드라이버가 현재 사용자에게만 매핑하는 경우 해당 사용자 계정으로 코드를 실행해야합니다. Windows에서는 impersonate as user (또는 see this SO question)까지 가능하므로 한 스레드 만 특정 사용자 계정으로 전환 할 수 있습니다.

또 다른 대안은 PKCS # 11 인터페이스를 통해 장치에 액세스하는 것입니다 (해당 드라이버 DLL이 하드웨어 공급 업체에서 제공되고 서버 시스템에 배치 할 권한이있는 경우). 이 경우 코드로 하드웨어에 로그인하면 사용자를 신경 쓰지 않습니다. PKCS11 인터페이스는 X509Store와는 매우 다르며 우리의 SecureBlackbox와 같은 타사 라이브러리가 작동해야합니다. 그러나 어떤 경우에는 이것이 유일한 옵션 인 것처럼 보일 수 있습니다. 원격 클라이언트에있는 장치에서 인증서를 읽을해야하는 경우

는 :

유일한 옵션은 클라이언트 측 모듈이있는 장치에 액세스 할 수 있습니다 (대부분은 Java 애플릿입니다). Java 애플릿은 PKCS # 11 및 Windows의 Windows 인증서 저장소에서 작동 할 수 있습니다.

단점은 Java 애플릿이 모바일 플랫폼에서 작동하지 않는다는 것인데, 유일한 옵션은 어떤 종류의 클라이언트 응용 프로그램이 될 수 있습니다 (지금까지는이 문제가 좋은 해결책이 아닙니다).

+0

PKCS # 11 인터페이스를 사용하면 ** 웹 응용 프로그램 **이 ** 클라이언트 컴퓨터 **의 LocalMachine 저장소에 액세스 할 수 있습니까? –

+0

@ MristerB. 귀하의 질문을 잘못 읽은 것으로 보입니다 (연결된 원격 클라이언트 시스템에서 인증서를 읽으려는 것을 지정하지 않았기 때문에 잘못 읽은 것이 쉽습니다). 내 대답을 업데이트 할게. –