2010-11-11 25 views
1

J'ai une application qui utilise la classe .NET SslStream avec des certificats client et serveur. Cette application fonctionne très bien sur Windows XP. Toutefois, sur Windows 7 (probablement Vista trop), l'exception ci-dessous apparaît lorsque vous appelez SslStream.AuthenticateAsClient:Éviter l'accès administrateur pour SslStream.AuthenticateAsClient?

System.ComponentModel.Win32Exception: The credentials supplied to the package were not recognized 
    at System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc) 
    at System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential) 
    at System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint) 
    at System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output) 
    at System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest) 
    at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult) 
    at System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation) 

Si l'application est "exécuté comme" Administrateur sur Windows 7, tout fonctionne très bien. Je suppose que la cause principale ici est que AuthenticateAsClient a besoin de la clé privée pour le certificat client (qui est installé dans le magasin de certificats personnels de la machine locale) et que cette action nécessite un accès administrateur.

Ma question est de savoir s'il y a quelque chose qui peut être fait pour y remédier? Ou est-ce simplement une réalité que l'utilisation de AuthenticateAsClient avec un certificat client nécessite des privilèges d'administrateur?

Répondre

2

Avez-vous essayé d'attribuer les droits d'accès utilisateur actuels au certificat à l'aide de WinHttpCertCfg?

Quelque chose comme:

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -a TESTUSER 

Pour plus d'informations, voir this article.

+0

Ceci est parfait et exactement ce que je cherchais !! – zdv

+0

Note mineure; pouvez utiliser -C CURRENT_USER \ TrustedPublisher sans l'espace entre Trusted et Publisher. Non Trusted_Publisher ou "CURRENT_USER \ Trusted Publisher". Merci WinHttpCertCfg d'ignorer silencieusement mes erreurs. –

1

La console MMC (Microsoft Management Console) permet aux administrateurs d'importer des certificats client sur un ordinateur local. Cependant, l'importation d'un certificat n'accorde pas automatiquement l'accès à la clé privée pour les autres comptes. Cette clé privée est requise pour l'authentification du certificat client. L'outil de configuration de certificat Microsoft Windows HTTP Services (WinHTTP) permet d'accorder l'accès à des comptes supplémentaires, tels que le compte IWAM, lorsque cela est nécessaire.

https://msdn.microsoft.com/en-us/library/aa384088(VS.85).aspx#_using