2017-09-13 64 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運行其中包含的方法在應用程序池標識下。由於我已經授予我的應用程序池訪問證書的權限,因此在提升的權限內運行代碼塊使我有足夠的權限訪問證書的私鑰。 –