2017-09-13 63 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运行其中包含的方法在应用程序池标识下。由于我已经授予我的应用程序池访问证书的权限,因此在提升的权限内运行代码块使我有足够的权限访问证书的私钥。 –