设置IIS池的LoadUserProfile时会发生什么情况?


103

我面临以下问题。

我运行以下代码

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

因此,我用Google搜索了一下,找到了类似问题的答案。我尝试启用LoadUserProfile应用程序池,并且现在可以使用。

问题是我不了解设定时到底发生了LoadUserProfile什么以及可能产生的后果。我的意思是,如果这是一件“好”的事情,那么为什么默认情况下它不处于“开启”状态?为什么它在那里呢?

当我LoadUserProfile在IIS池中进行设置时,究竟会发生什么,会带来什么负面影响?


6
事后想想,如果加载用户配置文件对您来说是一个问题,您可以将证书的加载更改为,new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)因此不需要用户配置文件。
vcsjones 2013年

1
如果以ApplicationPoolIdentity身份运行,则将希望使用new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)它避免将私钥写入存储,并且不需要服务器上的管理特权。
Nate

Answers:


117

我的意思是,如果这是一件“好”的事情,那么为什么默认情况下它不处于“开启”状态呢?为什么它在那里呢?

IIS 6从未加载用户配置文件。我会假设默认情况下禁用此选项以保持行为的一致性,并且管理员必须选择加入。

我试图为应用程序池启用LoadUserProfile,它现在可以工作。

这很可能是因为Windows加密服务提供程序试图在用户存储中存储或加载证书的密钥,并且由于配置文件不可用,所以加密上下文不可用。请注意,该Load User Profile设置仅适用于用户帐户。诸如NETWORK SERVICE和ApplicationPoolIdentity之类的服务帐户具有特殊的处理方式。

在IIS池中设置LoadUserProfile时会发生什么情况

好了,用户配置文件已加载。这包括其密码存储,环境变量(例如%TEMP%)和其他变量。

LoadUserProfile当AppPool启动时,IIS 最终将其归结为。

它会带来什么负面影响?

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


1
+1对于NETWORK SERVICE作为应用程序池标识,但是ApplicationPoolIdentity对我而言并不成功。
David d C e Freitas 2014年

3
“这可能会破坏与未加载用户配置文件的IIS 6上运行的应用程序的向后兼容性。” 我想它也具有性能(必须实际加载配置文件;例如,这意味着加载HKCU注册表配置单元)和安全性(更大的潜在载体)影响。
索伦Kuklau

1
是否可以LoadUserProfile=true在IIS中进行设置并将默认的临时文件夹%TEMP%位置从C:\Users\C:\Users\AccountName\AppData\Local\Temp更改为其他位置?示例“ D:\ AppTempData”
Murali Murugesan

Murali Murugesan-您有没有得到这个问题的答案?我有同样的问题。我想要更改默认的Temp目录。
VBAHole

1
几年前,我遇到了构建后端服务的问题,该服务被X509客户端证书身份验证保护的远程Web服务调用。因为个人证书存储在用户的配置文件中,所以在安装服务时,我必须以服务的登录帐户登录到目标服务器,该帐户创建用户配置文件,然后将客户端证书安装到登录帐户的证书存储中。之后,客户端证书将在运行时加载。
Craig Boland
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.