Warm tip: This article is reproduced from serverfault.com, please click

c#-通过CSharp-easy-RSA-PEM使用RSA时在服务器上获取异常

(c# - Getting exception on server when using RSA via CSharp-easy-RSA-PEM)

发布于 2017-08-04 10:00:16

我已经在我的mvc项目中使用https://github.com/jrnker/CSharp-easy-RSA-PEM进行RSA实现。

在IIS中的本地计算机中,也可以通过Visual Studio正常运行,但是当我在服务器上部署应用程序时,出现以下异常。

"System.NullReferenceException: Object reference not set to an instance of an object.\r\n at CoreEntities.Classes.Utility.RSADecrypt(String input)\r\n at WebAPI.Attributes.ApiAuthorizeAttribute.Authorize(HttpActionContext actionContext)"

我的代码是:

public static string RSADecrypt(string input)
{
    try
    {
        string priv = File.ReadAllText(HostingEnvironment.MapPath("~/Certificates/consumer.pem"));
        RSACryptoServiceProvider privc = Crypto.DecodeRsaPrivateKey(priv);
        return Crypto.DecryptString(input, privc);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

我也将问题发布在github @ https://github.com/jrnker/CSharp-easy-RSA-PEM/issues/8

经过大量调试后,我发现系统没有创建对象 RSACryptoServiceProvider

CspParameters parms = new CspParameters();
parms.Flags = CspProviderFlags.NoFlags;
parms.KeyContainerName = Guid.NewGuid().ToString().ToUpperInvariant();
parms.ProviderType = ((Environment.OSVersion.Version.Major > 5) || ((Environment.OSVersion.Version.Major == 5) && (Environment.OSVersion.Version.Minor >= 1))) ? 0x18 : 1;

// Exception is comping in below line.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(parms);

RSAParameters rsAparams = new RSAParameters();

例外:-System.Security.Cryptography.CryptographicException: The system cannot find the file specified.\r\n\r\n at CoreEntities.Classes.Utility.RSADecrypt(String input)\r\n at WebAPI.Attributes.ApiAuthorizeAttribute.Authorize(HttpActionContext actionContext) 谁能帮忙...

Questioner
Jitendra Pancholi
Viewed
11
Jitendra Pancholi 2017-08-09 13:50:53

@Downvoters,请注意。

我找到了解决此问题的方法。

此问题主要是由于Windows Server 2008及更高版本中包含的新安全约束。

在Windows Server 2008中,默认情况下将创建一个名为CryptoGraphic Operator的新用户。

如果你的应用程序使用RSACryptoServiceProvider,并且当你决定将应用程序托管在Windows Server 2008 IIS7上时,请执行以下步骤

  1. 你创建的虚拟目录的相应应用程序池所运行的帐户应添加到CryptoGraphic Operator用户中。
  2. 打开IIS7-> ApplicationPools-> YourAppPool-> RighClikck->高级设置---> Load User Profile,将此值设置为true。

这解决了我的问题。

参考:-https: //social.msdn.microsoft.com/Forums/vstudio/en-US/ec93922a-fd1e-4225-b5cf-1472ebb3acd1/systemsecuritycryptographycryptographicexception-the-system-cannot-find-the-file-specified?forum = netfxbcl