我正在努力使我的ASP.NET MVC 4应用程序与FIPS兼容。幸运的是,使用.NET 4.5 ASP.NET已经使用FIPS认可的AES实现视图状态和cookie加密,因此没有问题。
但是我遇到了一个奇怪的问题。这可以使用非常简约的ASP.NET MVC App进行复制。
创建简单的控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[OutputCache(Duration = 5)]
public ActionResult Data()
{
return View();
}
}
为索引创建非常简单的视图:
<h2>Page</h2>
@Html.Action("Data")
和数据操作:
<h2>Data</h2>
所以基本上我们在这里尝试的是在子动作上使用输出缓存(就像没有启用FIPS的魅力一样)。
现在,如果我们运行它,我们将获得可怕的死亡FIPS屏幕:
[InvalidOperationException:此实现不属于 Windows平台FIPS验证加密算法。]
System.Security.Cryptography.SHA256Managed..ctor()+10840001[TargetInvocationException:目标抛出了异常 一个调用。] System.RuntimeMethodHandle.InvokeMethod(Object target,Object []参数,签名sig,布尔构造函数)+0
System.Reflection.RuntimeConstructorInfo.Invoke(的BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) +339 System.Security.Cryptography.CryptoConfig.CreateFromName(String name, Object [] args)+656 System.Security.Cryptography.SHA256.Create() +14 System.Web.Mvc.OutputCacheAttribute.GetChildActionUniqueId(ActionExecutingContext filterContext)+315
System.Web.Mvc.OutputCacheAttribute.OnActionExecuting(ActionExecutingContext filterContext)+118
正如你在这里看到的那样,异常本身发生在OutputCacheAttribute.GetChildActionUniqueId
中的MVC内容深处 - 显然它试图使用非FIPS认可的SHA256哈希,我看不到指示它使用另一个的方法
因此,尝试解决它的第一件事就是在配置元素下的web.config文件中包含以下内容:
<runtime>
<enforceFIPSPolicy enabled="false"/>
</runtime>
然而,我意识到在我之前有很多人,这个设置对Web应用程序没有任何影响(无论是托管在IIS还是Cassini中),即使它对同一台机器上的控制台应用程序完全正常。
切换到三重des的常见ASP.NET 2.0解决方案也没有任何影响
<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>
毕竟在.NET 4.5中,我们已经将FIPS认可的AES用于这些目的。
在整台计算机上禁用FIPS(通过注册表或组策略工具)可以很好地完成,但当然目标是让它在机器级别启用FIPS。
我可能会遗漏一些东西吗?有没有办法让它从输出缓存子操作的所有实例中剥离应用程序?
答案 0 :(得分:4)
这与http://forums.asp.net/p/1979986/5672126.aspx?Can+t+use+SignalR+on+Win+Server+2008+with+FIPS+mode+on的问题相同。 CLR团队意识到这一点并正在考虑修复。
与此同时,您可以使用与上面的错误报告中相同的解决方法。将以下内容添加到Global.asax中的Application_Start:
CryptoConfig.AddAlgorithm(typeof(SHA256Cng), "System.Security.Cryptography.SHA256");