O que exatamente acontece quando eu defino o LoadUserProfile do pool do IIS?

103

Eu enfrentei o seguinte problema.

Eu executo o seguinte código

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

em dois processos. Um dos processos é executado LOCAL_SYSTEMe aí este código é bem-sucedido. Outro é executado dentro do IIS em uma conta de usuário local pertencente ao grupo local "Usuários" e aí recebo a seguinte exceção:

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

Então eu pesquisei um pouco no Google e encontrei essa resposta para um tipo de pergunta semelhante. Tentei habilitar LoadUserProfilepara o pool de aplicativos e agora funciona.

O problema é que não entendo o que exatamente acontece quando defino LoadUserProfilee quais consequências isso pode ter. Quero dizer, se é uma coisa "boa", por que não está "ativado" por padrão e por que está lá afinal?

O que exatamente acontece quando eu configuro LoadUserProfileno pool IIS e quais consequências negativas isso pode ter?

dente afiado
fonte
6
Pensando bem, se carregar o perfil do usuário for um problema para você, você pode alterar o carregamento do certificado para de new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)forma que um perfil de usuário não seja necessário.
vcsjones
1
Se estiver executando como ApplicationPoolIdentity, você desejará usar o new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)que evita gravar a chave privada no armazenamento e não exigirá privilégios administrativos no servidor.
Nate

Respostas:

117

Quero dizer, se é uma coisa "boa", por que não está "ativado" por padrão e por que está lá afinal?

O IIS 6 nunca carregou perfis de usuário. Eu presumiria que isso está desativado por padrão para manter o comportamento consistente, e um administrador deve aceitá-lo.

Tentei habilitar LoadUserProfile para o pool de aplicativos e agora funciona.

Provavelmente, isso ocorre porque o Windows Cryptographic Service Provider estava tentando armazenar ou carregar uma chave para o seu certificado no repositório de usuários e, como um perfil não estava disponível, um contexto criptográfico não estava disponível. Observe que a Load User Profileconfiguração se aplica apenas a contas de usuário. Contas de serviço como NETWORK SERVICE e ApplicationPoolIdentity têm tratamento especial.

O que exatamente acontece quando eu defino LoadUserProfile no pool do IIS

Bem, o perfil do usuário está carregado. Isso inclui seu armazenamento criptográfico, variáveis ​​de ambiente como% TEMP% e outras.

O resultado final LoadUserProfileé chamado pelo IIS quando o AppPool é iniciado.

que consequências negativas isso pode ter?

Isso pode quebrar a compatibilidade com versões anteriores de um aplicativo executado no IIS 6, que não carregou o perfil do usuário. As variáveis ​​de ambiente são carregadas. Por exemplo, quando Carregar Perfil do Usuário for verdadeiro, a variável de ambiente% TEMP% é C:\Users\AccountName\AppData\Local\Temp(por exemplo). Quando falso, é C:\WINDOWS\Temp.

vcsjones
fonte
1
+1 para NETWORK SERVICE como identidade do pool de aplicativos, mas ApplicationPoolIdentity não foi bem-sucedido para mim.
David d C e Freitas
3
"Isso pode quebrar a compatibilidade com versões anteriores de um aplicativo executado no IIS 6, que não carregou o perfil do usuário." Eu acho que ele também tem implicações de desempenho (o perfil deve realmente ser carregado; isso significa, por exemplo, carregar a seção de registro HKCU) e de segurança (maior vetor potencial).
Sören Kuklau
1
É possível definir LoadUserProfile=trueno IIS e alterar o local da pasta temporária padrão% TEMP% de C:\Users\C:\Users\AccountName\AppData\Local\Temppara outro lugar? exemplo "D: \ AppTempData"
Murali Murugesan
Murali Murugesan - alguma vez obteve uma resposta a esta pergunta? Eu tenho o mesmo problema. Quero que o diretório temporário padrão seja alterado.
VBAHole
1
Eu encontrei isso anos atrás construindo um serviço de back-end que chamava um serviço da web remoto protegido pela autenticação de certificado de cliente X509. Como os certificados pessoais são armazenados no perfil de um usuário, ao instalar o serviço, tive que fazer logon no servidor de destino como a conta de logon do serviço, o que cria um perfil de usuário, e instalar o certificado do cliente no armazenamento de certificados da conta de logon. Depois disso, o certificado do cliente seria carregado em tempo de execução.
Craig Boland