2017-09-13 6 views
1

SharePoint 응용 프로그램과 서비스 공급자간에 통합 서비스를 생성해야했습니다. 통합 할 서비스 공급자의 요구 사항 중 하나는 개인 키를 사용하여 서명 한 내 요청을 확인하는 데 사용할 공개 키를 제공하는 것입니다.키 세트가 존재하지 않습니다/r/n

처음에는 인증서 저장소를 읽고 내 요청에 모두 서명하는 데 사용할 개인 키를 가져 오는 콘솔 앱을 만들었습니다. 콘솔 응용 프로그램이 제대로 작동하므로 SharePoint 응용 프로그램 내에서 지금 이동하기로 결정했습니다. 불행하게도이 코드의 특정 부분에서 실패

key.FromXmlString(privateCert.PrivateKey.ToXmlString(true)); 

을 체결 인증서를 얻고 수행하는 전체 코드는 아래에서 찾을 수 있습니다

 X509Certificate2 privateCert = null; 
     X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.MaxAllowed); 

     var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "thumbprinthere", true); 

     if (certs.Count > 0) 
     { 
      privateCert = certs[0]; 
     } 

     RSACryptoServiceProvider key = new RSACryptoServiceProvider(); 
     key.FromXmlString(privateCert.PrivateKey.ToXmlString(true)); 

     byte[] sig = key.SignData(Encoding.ASCII.GetBytes(data), CryptoConfig.MapNameToOID("SHA256")); 
     string signature = Convert.ToBase64String(sig); 

[업데이트]

link의 단계를 따라 시도해 보았습니다. 먼저 서버에서 기존 개인 키를 제거했습니다. 그런 다음 인증서 저장소로 다시 가져 와서 지문 속성이 있는지 확인했습니다. 그 후 findprivatekey.exe를 실행하고 MachineKeys 폴더로 이동할 수있었습니다. 거기에서 나는 네트워크 서비스, IIS_IUSRS 그리고 SPFarm 관리자뿐만 아니라 서버에 로그인하는 데 사용 된 로컬 계정까지 다양한 사용자를 추가했지만 여전히 오류가 계속 발생합니다.

또한 내가 추가 한 키가 내보낼 수 있도록하여 응용 프로그램이 인증서에 첨부 된 개인 키를 추출 할 수있는 방법이 있어야합니다. 그냥 내가 개인 키를 추출하기 위해 사용 된 변수에 할당하기 전에 하나의 인증서를 반환하도록

[UPDATE 2]

나는 코드를 업데이트했습니다. certs 변수가 정확히 하나의 레코드를 반환하고 있음을 알 수 있더라도 여전히 동일한 문제입니다.

답변

0

많은 확인을 한 후에 위의 메서드 코드 블록을 호출 할 때 중요한 부분을 놓친 것을 알았습니다. 승진 특권 블록을 감쌀 것을 잊었습니다. 그렇게 한 후 코드는 내 콘솔 앱과 비슷하게 작동했습니다.

SPSecurity.RunWithElevatedPrivileges(delegate()) 
{ 
    ... 

    X509Certificate2 privateCert = null; 
    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
    store.Open(OpenFlags.MaxAllowed); 

    var certs = store.Certificates.Find(X509FindType.FindByThumbprint, "<thumbprinthere>", true); 

    if (certs.Count > 0) 
    { 
     privateCert = certs[0]; 
    } 

    RSACryptoServiceProvider key = new RSACryptoServiceProvider(); 
    key.FromXmlString(privateCert.PrivateKey.ToXmlString(true)); 

    byte[] sig = key.SignData(Encoding.ASCII.GetBytes(data), CryptoConfig.MapNameToOID("SHA256")); 
    string signature = Convert.ToBase64String(sig); 

    ... 
}); 
+0

더 자세히 설명해 주시겠습니까? 덕분에 – aghilpro

+0

RunWithElevatedPrivileges 메서드 내 코드 블록을 추가했습니다. 기본적으로 사용자가 모든 권한을 가지지 않아도 모든 권한이있는 코드 블록이 실행됩니다. MSDN에 따르면 RunWithElevatedPrivileges는 응용 프로그램 풀 ID 아래에 포함 된 메서드를 실행합니다. 앱 풀에 인증서에 대한 액세스 권한을 부여 했으므로 승격 된 권한으로 코드 블록을 실행하면 인증서의 개인 키에 액세스 할 수있는 충분한 권한을 얻을 수있었습니다. –