Sharepoint 2010 键集不存在/r/n

Sharepoint 2010 键集不存在/r/n,sharepoint-2010,rsacryptoserviceprovider,Sharepoint 2010,Rsacryptoserviceprovider,我的任务是在我们的SharePoint应用程序和一个服务提供商之间创建一个集成服务。我将要与之集成的服务提供商的一个要求是向他们提供一个公钥,他们将使用该公钥来验证我的请求,该请求是使用我们自己的私钥签名的 最初,我创建了一个控制台应用程序,它读取证书存储并获取用于签名我的请求和所有请求的私钥。控制台应用程序工作正常,因此我决定现在将其移动到SharePoint应用程序中。不幸的是,它在代码的这一特定部分失败了: key.FromXmlString(privateCert.PrivateKey.

我的任务是在我们的SharePoint应用程序和一个服务提供商之间创建一个集成服务。我将要与之集成的服务提供商的一个要求是向他们提供一个公钥,他们将使用该公钥来验证我的请求,该请求是使用我们自己的私钥签名的

最初,我创建了一个控制台应用程序,它读取证书存储并获取用于签名我的请求和所有请求的私钥。控制台应用程序工作正常,因此我决定现在将其移动到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);
[更新]

我试着按照这个步骤来做。我首先卸载了服务器中现有的私钥。然后我将其导入到证书存储中,并确认存在指纹属性。之后,我运行findprivatekey.exe并能够导航到MachineKeys文件夹。从那里我添加了不同的用户,包括网络服务、IIS_iusr,甚至是我用来登录服务器的本地帐户以及SPFarm admin,但我仍然不断收到错误

我还确保我添加的密钥是可导出的,因此应用程序应该有办法提取附加到证书的私钥

[更新2]


我更新了代码,以便在将其分配给用于提取私钥的变量之前,它只返回一个证书。即使我可以看到
certs
变量只返回一条记录,仍然存在同样的问题。

经过多次检查,我意识到调用上述方法代码块时遗漏了一个重要部分。我忘了把它包起来。这样做之后,代码的功能与我的控制台应用程序类似

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);

    ...
});
SPSecurity.RunWithElevatedPrivileges(delegate())
{
...
X509Certificate2 privateCert=null;
X509Store=新的X509Store(StoreName.My,StoreLocation.LocalMachine);
store.Open(OpenFlags.MaxAllowed);
var certs=store.Certificates.Find(X509FindType.FindByThumbprint,“,true);
如果(证书计数>0)
{
privateCert=证书[0];
}
rsacryptserviceprovider key=新的rsacryptserviceprovider();
key.FromXmlString(privateCert.PrivateKey.ToXmlString(true));
byte[]sig=key.SignData(Encoding.ASCII.GetBytes(data)、CryptoConfig.MapNameToOID(“SHA256”);
字符串签名=Convert.tobase64字符串(sig);
...
});

经过多次检查,我意识到调用上述方法代码块时遗漏了一个重要部分。我忘了把它包起来。这样做之后,代码的功能与我的控制台应用程序类似

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);

    ...
});
SPSecurity.RunWithElevatedPrivileges(delegate())
{
...
X509Certificate2 privateCert=null;
X509Store=新的X509Store(StoreName.My,StoreLocation.LocalMachine);
store.Open(OpenFlags.MaxAllowed);
var certs=store.Certificates.Find(X509FindType.FindByThumbprint,“,true);
如果(证书计数>0)
{
privateCert=证书[0];
}
rsacryptserviceprovider key=新的rsacryptserviceprovider();
key.FromXmlString(privateCert.PrivateKey.ToXmlString(true));
byte[]sig=key.SignData(Encoding.ASCII.GetBytes(data)、CryptoConfig.MapNameToOID(“SHA256”);
字符串签名=Convert.tobase64字符串(sig);
...
});

我在RunWithElevatedPrivileges方法中添加了代码块。基本上,它所做的是,即使用户没有完全控制权,它也会以完全控制权运行其中包含的代码块。根据MSDN,RunWithElevatedPrivileges在应用程序池标识下运行其中包含的方法。由于我已授予我的应用程序池对证书的访问权限,因此在提升权限内运行代码块使我有足够的权限访问证书的私钥。我在RunWithElevatedPrivileges方法中添加了我的代码块。基本上,它所做的是,即使用户没有完全控制权,它也会以完全控制权运行其中包含的代码块。根据MSDN,RunWithElevatedPrivileges在应用程序池标识下运行其中包含的方法。由于我已授予我的应用程序池对证书的访问权限,因此在提升权限内运行代码块使我有足够的权限访问证书的私钥。