2016-08-04 40 views
0

ich ein selbst signiertes Zertifikat mit einem privaten Schlüssel in einer PFX-Datei habe. Es wird als Ressource in einer Xamarin.Android C# -Anwendung in Visual Studio 2015 hinzugefügt. Ich verwende es als Client-Zertifikat, um eine sichere HTTPS-Verbindung zu einem Webdienst herzustellen.xamarin.android X509Certificate2 Konstruktor/Import mit Secure Passwort anstelle von einfacher Zeichenfolge fehlgeschlagen

Um dies zu tun, ich das Zertifikat in einem X509Certificate2 Objekt importieren. Wenn ich das Passwort für den privaten Schlüssel des Zertifikats als Klartext (String) gebe, funktioniert es gut, aber ich möchte die X509Certificate2 Konstruktoren/Import-Methoden verwenden, die SecureString verwenden.

Leider werfen sie

‚Unable Zertifikat Ausnahme zu entschlüsseln‘

in diesem Fall, egal ob Hersteller oder Importmethode verwendet wird, unabhängig davon, ob das Zertifikat als byte [geben wird ] oder Dateiname.

Meine Frage ist, warum es mit dem Passwort in einer SecureString schlägt, während gut funktioniert mit einfachen Zeichenfolge und wie Sie vorgehen, um SecureString für das Passwort zu verwenden.

Danke!

Georgi

nur hinzufügen, dass der gleiche Code mit gleicher Zertifikatsdatei und das Kennwort auch unter Windows funktioniert 10, .NET 4 Ansonsten Xamarin.Android ist 6.1.1.1 und Xamarin Erweiterung ist 4.1.1.3, Mindest android zu Ziel ist API-Ebene 19, auf Android getestet 6.0

+0

nur hinzufügen, dass der gleiche Code mit gleicher Zertifikatsdatei und das Kennwort auch unter Windows 10, .NET 4 Ansonsten Xamarin.Android funktioniert, ist 6.1.1.1 und Xamarin Erweiterung ist 4.1.1.3, Mindest android Ziel API Level 19, getestet auf Android 6.0 Georgi –

Antwort

0

Der Grund dafür ist, dass SecureString nicht vollständig in Mono unterstützt wird. Sehen Sie die source für einen Kommentar. Sie ruft die Zertifikatsklasse Import Methode und übergibt ein (string)null:

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

Beachten Sie auch, dass SecureString Ihre Daten nicht 100% secure macht:

Insgesamt Secure ist sicherer als String, weil es begrenzt die Exposition von sensiblen String-Daten. Diese Zeichenfolgen können jedoch immer noch ausgesetzt sein, die einen Prozess oder eine Operation mit Raw-Speicher, wie einem bösartigen Prozess auf dem Host-Computer ausgeführt wird, ein Prozess Dump oder eine vom Benutzer sichtbare Auslagerungsdatei. Anstelle der Verwendung von SecureString für zum Schützen von Kennwörtern empfiehlt sich die Verwendung einer undurchsichtigen -Kennung für Anmeldeinformationen, die außerhalb des Prozesses gespeichert werden.

+0

Vielen Dank, Krumelur, alles ist klar. Jedenfalls sollten sie in diesem Fall eine andere Art von Ausnahme wie "Nicht implementiert" zum Beispiel werfen. Prost! –

+0

Reichen Sie eine Pull-Anfrage mit der Änderung ein ;-) – Krumelur