当我设置 IIS 池的 LoadUserProfile 时究竟会发生啥?
Posted
技术标签:
【中文标题】当我设置 IIS 池的 LoadUserProfile 时究竟会发生啥?【英文标题】:What exactly happens when I set LoadUserProfile of IIS pool?当我设置 IIS 池的 LoadUserProfile 时究竟会发生什么? 【发布时间】:2013-06-13 12:03:01 【问题描述】:我遇到了以下问题。
我运行以下代码
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
在两个过程中。其中一个进程在LOCAL_SYSTEM
下运行,并且此代码成功。另一个在属于“用户”本地组的本地用户帐户下在 IIS 中运行,我得到以下异常:
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
所以我用谷歌搜索了一下,发现this answer 有一个类似的问题。我尝试为应用程序池启用LoadUserProfile
,它现在可以工作了。
问题是我不知道设置LoadUserProfile
时到底发生了什么以及可能产生的后果。我的意思是,如果它是“好”的东西,那么为什么默认情况下它不是“开启”的,为什么它毕竟存在?
当我在 IIS 池中设置 LoadUserProfile
时究竟会发生什么,它会产生什么负面后果?
【问题讨论】:
只是事后诸葛亮,如果加载用户配置文件对您来说有问题,您可以将您的证书加载更改为new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
,这样就不需要用户配置文件了。
如果作为 ApplicationPoolIdentity 运行,您将需要使用new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
,这样可以避免将私钥写入存储并且不需要服务器上的管理权限。
【参考方案1】:
我的意思是,如果它是“好”的东西,那么为什么默认情况下它不是“开启”的,为什么它毕竟存在呢?
IIS 6 从不加载用户配置文件。我假设默认情况下这是关闭的以保持行为一致,并且管理员必须选择加入。
我尝试为应用程序池启用 LoadUserProfile,它现在可以工作了。
这很可能是因为 Windows 加密服务提供程序试图在用户存储中存储或加载您的证书的密钥,并且由于配置文件不可用,cryptographic context 不可用。请注意,Load User Profile
设置仅适用于用户帐户。 NETWORK SERVICE 和 ApplicationPoolIdentity 等服务帐户有特殊处理。
当我在 IIS 池中设置 LoadUserProfile 时会发生什么
好吧,用户配置文件已加载。这包括他们的加密存储、环境变量(例如 %TEMP%)和其他变量。
最终归结为 LoadUserProfile
在 AppPool 启动时被 IIS 调用。
它会产生什么负面后果?
它可能会破坏与在 IIS 6 上运行的应用程序的向后兼容性,该应用程序未加载用户配置文件。环境变量已加载。例如,当 Load User Profile 为 true 时,%TEMP% 环境变量为 C:\Users\AccountName\AppData\Local\Temp
(例如)。如果为 false,则为 C:\WINDOWS\Temp
。
【讨论】:
+1 将 NETWORK SERVICE 作为应用程序池标识,但 ApplicationPoolIdentity 对我来说并不成功。 “它可能会破坏与在 IIS 6 上运行的应用程序的向后兼容性,该应用程序未加载用户配置文件。”我猜它还具有性能(必须实际加载配置文件;这意味着,例如,加载 HKCU 注册表配置单元)和安全性(更大的潜在向量)影响。 是否可以在 IIS 中设置LoadUserProfile=true
并将默认临时文件夹 %TEMP% 位置从 C:\Users\C:\Users\AccountName\AppData\Local\Temp
更改为其他位置?例如“D:\AppTempData”
Murali Murugesan - 你有没有得到这个问题的答案?我有同样的问题。我想更改默认的临时目录。
我在几年前遇到过构建一个后端服务,该服务调用受 X509 客户端证书身份验证保护的远程 Web 服务。因为个人证书存储在用户的配置文件中,所以在安装服务时,我必须以服务的登录帐户登录到目标服务器,这会创建一个用户配置文件,然后将客户端证书安装到登录帐户的证书存储中。之后,客户端证书将在运行时加载。以上是关于当我设置 IIS 池的 LoadUserProfile 时究竟会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?
如何设置IIS程序池的回收时间,才能最大程度的减少对用户的影响?