Um X509Certificate pode ser obtido no armazenamento de certificados pelo ASP.NET sem permissões de sistema de arquivos?
-
20-12-2019 - |
Pergunta
Onde deve um certificado que aparece no Trusted Root Certification Authorities
nó em certificadomgr.msc ser mantido para que um aplicativo da web IIS possa obtê-lo e assinar uma declaração SAML com ele?Existe uma maneira de extrair o certificado diretamente da "colmeia" de certificados, que não requer permissões do sistema de arquivos?Ou é necessário exportar o certificado para uma pasta à qual o usuário interno do IIS7 tenha permissões de acesso?
O X509Certificate2.Import()
o primeiro parâmetro do método é fileName
.
Se eu exportar o certificado e colocar o arquivo na hierarquia de pastas do projeto do Visual Studio 2012 e fornecer um caminho totalmente qualificado para o Importar() método, a importação do certificado será bem-sucedida, mas somente se o aplicativo estiver sendo executado no Visual Studio construídas em servidor, não se estiver em execução no servidor Web IIS local.
Eu tentei usar o Nome amigável com X509KeyStorageFlags.MachineKeySet
mas isso não funcionou.
EDITAR:Isso funciona ao usar o servidor Visual Studio integrado, mas não o servidor LOCAL IIS7 no Windows 7:
certStore = New X509Store(StoreLocation.CurrentUser)
certStore.Open(OpenFlags.ReadOnly)
Dim thumbprint As String
thumbprint = ConfigurationManager.AppSettings("thumb").ToString
certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, False)
certStore.Close()
cert = certCollection(0)
então preciso descobrir como conceder acesso ao pool de aplicativos padrão a este certificado no Windows 7.
Solução
Você não "importa", apenas cria uma instância.Formalmente, você abre um armazenamento de chaves e percorre os certificados.E sim, você não precisa de nenhuma permissão do sistema de arquivos, no entanto, para acessar a chave privada, a identidade do seu pool de aplicativos deve ter permissão para a chave, você define a permissão no snap-in do certificado do console mmc.
Editar:o código para acessar o certificado seria algo como:
var store = new X509Store( name, location );
store.Open( OpenFlags.ReadOnly );
foreach ( var cert in store.Certificates )
... loop and match, by thumbprint, friendly name or whatever else