Eu encontrei o problema e a solução.
Problema:
O webservice usa um certificado X509Certificate2. Os construtores de classe X509Certificate2 tentam importar o certificado para o perfil de usuário da conta de usuário em que o aplicativo é executado. Muitas vezes, os aplicativos ASP.NET e COM + representam clientes. Quando o fazem, eles não carregam os perfis de usuário para o usuário representado por motivos de desempenho. Portanto, eles não podem acessar o armazenamento de certificados "Usuário" para o usuário representado.
O mesmo código funcionará quando executado a partir de um aplicativo interativo ou de um serviço do Windows em execução em uma conta de usuário, porque o perfil é carregado quando o usuário está conectado ou o serviço é iniciado.
Solução:
-
Um administrador na máquina onde o aplicativo ASP.NET/COM+ é executado deve instalar o certificado no armazenamento de certificados da máquina, chamado de armazenamento "Computador Local". Isso deve ser feito quando o aplicativo ASP.NET/COM+ estiver instalado.
-
O administrador deve definir as permissões na chave privada associada ao certificado para fornecer ao processo ASP.NET e aos usuários representados o acesso à chave. Isso é necessário porque somente a conta de usuário que instala o certificado ou a chave privada no armazenamento "Computador Local" pode usar posteriormente a chave privada RSA associada ao certificado. Use WinHttpCertCfg.exe disponível nas ferramentas do Windows Resource Kit ( link ( link )) para configurar as permissões.
-
O código do aplicativo ASP.NET/COM+ deve usar o certificado instalado em vez de tentar instalar um a partir de um arquivo PFX. Ter o código localizar o certificado instalado usando a classe X509Store.
Consulte o link para obter mais informações.