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

时间:2017-08-04 10:00:17

标签: c# .net asp.net-mvc encryption rsa

我已经在我的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) 任何人都可以帮忙......

2 个答案:

答案 0 :(得分:0)

@Downvoters,请注意。

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

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

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

如果您的应用程序正在使用RSACryptoServiceProvider,并且当您决定在Windows Server 2008 IIS7上托管您的应用程序时,请按照以下步骤进行操作

  1. 应将您创建的虚拟目录的相应应用程序池运行的帐户添加到CryptoGraphic Operator用户。
  2. 打开IIS7 - > ApplicationPools - > YourAppPool - > RighClikck - >高级设置--->加载用户配置文件将此值设置为true。
  3. 这解决了我的问题。

    参考: - enter image description here

答案 1 :(得分:0)

我通过更改以下过程来解决了该问题,并且无需操纵Web服务器(IIS,NGINX或其他任何服务器)。我也在Linux上测试了它,效果很好。

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
string toBeSigned= "string";
byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes(toBeSigned), new SHA1CryptoServiceProvider());
string signature = Convert.ToBase64String(signMain);