0

J'ai un certificat auto-signé avec une clé privée dans un fichier PFX. Il est ajouté en tant que ressource dans une application Xamarin.Android C# dans Visual Studio 2015. Je l'utilise en tant que certificat client pour établir une connexion HTTPS sécurisée à un service Web.xamarin.android Le constructeur/l'importation X509Certificate2 a échoué avec le mot de passe SecureString au lieu de la chaîne normale

Pour cela, j'importe le certificat dans un objet X509Certificate2. Lorsque je fournis le mot de passe pour la clé privée du certificat sous la forme d'un texte simple (chaîne), cela fonctionne bien, mais je voudrais utiliser les constructeurs X509Certificate2/méthodes d'importation qui utilisent SecureString.

Malheureusement, ils jettent

« Impossible de décoder exception du certificat »

dans ce cas, peu importe si le constructeur ou méthode d'importation est utilisé, peu importe si le certificat est passé comme octet [ ] ou le nom du fichier.

Ma question est pourquoi il échoue avec le mot de passe dans un SecureString tout fonctionne bien avec la chaîne de caractères et comment procéder afin d'utiliser SecureString pour le mot de passe.

Merci!

Georgi

Juste pour ajouter que le même code avec la même fichier de certificat et mot de passe fonctionne bien sous Windows 10, .NET 4 Sinon Xamarin.Android est 6.1.1.1 et l'extension Xamarin est 4.1.1.3, Android minimum cible est le niveau API 19, testé sur Android 6.0

+0

Juste pour ajouter que le même code avec la même fichier de certificat et mot de passe fonctionne bien sous Windows 10, .NET 4 Sinon Xamarin.Android est 6.1.1.1 et l'extension Xamarin est 4.1.1.3, Android minimum pour cible est API niveau 19, testé sur Android 6.0 Georgi –

Répondre

0

La raison est que SecureString n'est pas complètement pris en charge en Mono. Voir le source pour un commentaire. Il appelle la classe de certificat méthode Import et passe un (string)null:

[MonoTODO ("SecureString is incomplete")] 
public override void Import (byte[] rawData, SecureString password, X509KeyStorageFlags keyStorageFlags) 
{ 
    Import (rawData, (string) null, keyStorageFlags); 
} 

Notez également que SecureString ne fait pas vos données 100% secure:

Dans l'ensemble, SecureString est plus sûr que des cordes, car elle limite l'exposition des données de chaîne sensibles. Cependant, ces chaînes peuvent toujours être exposées à tout processus ou opération ayant accès à la mémoire brute, comme un processus malveillant s'exécutant sur l'ordinateur hôte, un vidage ou un fichier d'échange affichable par l'utilisateur. Au lieu d'utiliser SecureString pour protéger les mots de passe, l'alternative recommandée consiste à utiliser un handle opaque pour les informations d'identification stockées en dehors du processus.

+0

Merci, Krumelur, tout est clair. Quoi qu'il en soit, ils devraient lancer une autre sorte d'exception dans ce cas comme "Non implémenté" par exemple. À la votre! –

+0

Soumettre une demande de tirage avec le changement ;-) – Krumelur