当我设置IIS池的LoadUserProfile时会发生什么?

135

我遇到了以下问题。

我运行了以下代码

var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);

在两个进程中。其中一个进程在 LOCAL_SYSTEM 下运行,这段代码可以成功执行。另一个进程在 IIS 中以属于 "Users" 本地组的本地用户帐户身份运行,在那里我会收到以下异常:

in two processes. One of the processes runs under LOCAL_SYSTEM and there this code succeeds. Another one runs inside IIS under a local user account belonging to "Users" local group and there I get the following exception:

System.Security.Cryptography.CryptographicException
Object was not found.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here

所以我谷歌了一下,找到了这个答案,针对一个类似的问题。我试着为应用程序池启用LoadUserProfile,现在它可以工作了。

问题是我不知道当我设置LoadUserProfile时究竟发生了什么,以及可能会有什么后果。我的意思是,如果这是一个“好”事情,那么为什么它不是默认打开的?它到底是干什么用的?

当我在IIS池中设置LoadUserProfile时,究竟会发生什么,可能会产生哪些负面影响?


8
如果加载用户配置文件是个问题的话,你可以将加载证书的方式更改为 new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet),这样就不需要用户配置文件了。 - vcsjones
5
如果以ApplicationPoolIdentity身份运行,则需要使用new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet),这将避免将私钥写入存储并且不需要在服务器上具备管理员权限。 - Nate
1个回答

156
我是一名有用的助手,可以翻译文本。
如果这是一件“好”事情,为什么它不是默认开启的,它到底有什么作用?
IIS 6从未加载用户配置文件。我认为这是默认关闭的以保持一致性,管理员必须选择启用它。
我尝试启用应用程序池的LoadUserProfile,现在它可以工作了。
这很可能是因为Windows加密服务提供程序正在尝试在用户存储中存储或加载证书的密钥,并且由于没有可用的配置文件,加密上下文不可用。请注意,Load User Profile设置仅适用于用户帐户。像NETWORK SERVICE和ApplicationPoolIdentity这样的服务帐户具有特殊处理方式。
当我在IIS池中设置LoadUserProfile时会发生什么?
好吧,用户配置文件被加载。这包括他们的加密存储,例如%TEMP%等环境变量,还有其他变量。
最终的结果是当应用程序池启动时,IIS会调用LoadUserProfile

可能会带来什么负面影响?

它可能会破坏与在IIS 6上运行的应用程序的向后兼容性,因为该版本不会加载用户配置文件。环境变量将会被加载。例如,当“加载用户配置文件”为真时,“%TEMP%”环境变量为C:\Users\AccountName\AppData\Local\Temp(例如)。当为假时,则为C:\WINDOWS\Temp

2
我赞同使用NETWORK SERVICE作为应用程序池身份标识,但ApplicationPoolIdentity对我来说并不成功。 - David d C e Freitas
3
"这可能会破坏与在IIS 6上运行且未加载用户配置文件的应用程序的向后兼容性。我想这也会对性能(需要实际加载配置文件;例如,加载HKCU注册表子项)和安全性(潜在攻击面更大)产生影响。" - Sören Kuklau
1
在IIS中设置LoadUserProfile=true并将默认的临时文件夹%TEMP%位置从C:\Users\C:\Users\AccountName\AppData\Local\Temp更改为其他位置是否可行?例如“D:\AppTempData”。 - Murali Murugesan
2
多年前,我在构建一个后端服务时遇到了这个问题,该服务调用了受X509客户端证书身份验证保护的远程Web服务。由于个人证书存储在用户配置文件中,因此在安装服务时,我必须使用服务的登录帐户登录目标服务器,这将创建一个用户配置文件,然后将客户端证书安装到登录帐户的证书存储中。之后,在运行时,客户端证书将被加载。 - Craig Boland
@VBAHole你可以在用户注册表 @ HKEY_USERS\SID\Environment 中设置TMP/TEMP环境变量。将SID替换为相应用户的安全标识符。 - Jan Reilink
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接