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_SYSTEM
e 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 LoadUserProfile
para o pool de aplicativos e agora funciona.
O problema é que não entendo o que exatamente acontece quando defino LoadUserProfile
e 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 LoadUserProfile
no pool IIS e quais consequências negativas isso pode ter?
fonte
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
forma que um perfil de usuário não seja necessário.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.Respostas:
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.
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 Profile
configuração se aplica apenas a contas de usuário. Contas de serviço como NETWORK SERVICE e ApplicationPoolIdentity têm tratamento especial.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.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
.fonte
LoadUserProfile=true
no IIS e alterar o local da pasta temporária padrão% TEMP% deC:\Users\C:\Users\AccountName\AppData\Local\Temp
para outro lugar? exemplo "D: \ AppTempData"