2016-09-19 4 views
2

Ich muss eine App entwickeln mit cordova Targeting hauptsächlich Windows-Plattform. In dieser App muss ich den Zertifizierungsspeicher manipulieren. Lange Geschichte kurze Antwort, ich muss ein Cordova-Plugin (oder vielleicht ein ActiveX-Trick) tun. Ich habe eine Windows-Laufzeitkomponente in C#, wie erklärt here, um X509Store zu verwenden (wie ich Windows brauche). Ich habe Visual Studio 2015 verwendet, um ein Windows Runtime-Komponentenprojekt zu erstellen (ich habe Universal Windows und 8.1 versucht). Es funktioniert, ich kann C# Methoden in meinen .js aufrufen.cordova plugin x509store

Das Problem ist jedoch: ein Windows-Laufzeitkomponente-Projekt verfügt nicht über den Namespace System.Security.Cryptography.X509Certificates. Daher kann ich nicht auf den X509Store zugreifen.

Als Workaround habe ich eine Klassenbibliothek (. NetCore, .dll) erstellt, die X509Store aufruft und Strings zurückgibt, mindestens um das Zertifikat (Json Stringify) anzuzeigen. Eine klassische Klassenbibliothek kann auch auf x509store zugreifen, führt jedoch einen Zielfehler aus, wenn ich sie in diesem Windows-Laufzeitkomponentenprojekt referenziere. (Ein portables/universelles DLL-Projekt hat auch keinen X509Store). Meine .netcore dll funktioniert, ich habe es in einem Console Application (.NetCore) Projekt versucht und es hat alle meine Zertifikate angezeigt. Aber wenn ich es von der cordova app aus anrufe (cordova app -> plugin -> runtime -> .netcore dll) ist es leer (kein Zertifikat gefunden und der aktuelle Benutzer ist nicht definiert). Ich denke, das liegt daran, dass der Ausführungskontext nicht derselbe ist (Webapp-App oder Konsolen-App). Und ich denke nicht, dass es eine gute Lösung ist (die nicht einmal funktioniert).

Also, wie kann ich auf den Zertifizierungsspeicher (des Windows-Benutzers) in einer Windows-Laufzeitkomponente zugreifen? Wie ich glaube nicht, ist es mit Javascript möglich.

Dank

PS: Ich kann einige Code Quelle bereitstellen, wenn

benötigt

EDIT:
Ich habe vergessen, dass ein Montage Konflikt in der Runtime-Projekt mit dem .netcore dll, die ich das gelöst ist durch Bezugnahme auf Recht dll in plugin.xml Datei (System.Runtime.dll etc ..), wie ich es nicht in Visual Studio zu lösen gelang

//script inside cordova, called after device ready 
signatureplugin.getAllCertNames(function(a) { }, function(a) { }, 0); 

//signatureplugin.js 
var exec = require('cordova/exec'); 

module.exports = { 
    getAllCertNames: function(successCallback, errorCallback, args) { 
     exec(successCallback, errorCallback, "SignaturePlugin", "getAllCertNames", [args]); 
    } 
}; 

//signaturepluginProxy.js 
module.exports = { 
    getAllCertNames: function(successCallback, errorCallback, args) { 
     var res = SignerVerifier.PluginRT.getAllCertNames(); 
     for (var i = 0, len = res.length; i < len; i++) { 
      alert(res[i]); 
     } 
    } 
}; 

require("cordova/exec/proxy").add("SignaturePlugin", module.exports); 


//windows runtime component 
using CertStore; 

namespace SignerVerifier 
{ 
    public sealed class PluginRT 
    { 
     public static string[] getAllCertNames() 
     { 
      var certStore = new StoreManager(); 
      var res = certStore.getAllCertificates(); 
      return res; 
     } 

    } 
} 

//.NetCore dll 
using System.Collections.Generic; 
using System.Security.Cryptography.X509Certificates; 
using Newtonsoft.Json; 
using System; 

namespace CertStore 
{ 
    public class StoreManager 
    { 
     private X509Store store; 

     public StoreManager() 
     { 
      store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 
     } 

     public string[] getAllCertificates() 
     { 
      List<string> res = new List<string>(); 

      store.Open(OpenFlags.ReadOnly); 
      var certificates = store.Certificates; 
      foreach (var cert in certificates) 
      { 
       res.Add(JsonConvert.SerializeObject(cert)); 
      } 
      store.Dispose(); 

      return res.ToArray(); 
     } 
    } 
} 

Wenn ich tue, ein Javascript leeres app Projekt + Windows-Runtime-Komponenten pr oject (Projekte von „universal“, habe ich nicht „Windows Store“ und ich benutze windows 10) fügen Sie dann die .netcore dll ich den Konflikt bekam, die zu einer Ausnahme führen:

System.IO.FileLoadException : Datei oder Assembly 'System.Runtime, Version = 4.1.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der lokalisierten Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

(in cordova verhindere ich diese Ausnahme durch Bezugnahme auf System.Runtime.dll, etc ..., von dem nuget Paket NETStandard.Library.1.6.0 in .netcore verwendet) Ich muss etwas verpassen. .NetCore dll scheint nicht kompatibel, aber das Windows-Runtime-Projekt Ziel .NetCore

EDIT 2: (gelöst)
vcsjones Antwort = Abhilfe nutzlos (und kein Problem aus der vorherige edit). ABER in jedem Fall gibt es ein Sicherheitsproblem, und ich muss "Shared User Certificates" in Funktionen in der appxmanifest

+0

Können Sie das Codebeispiel angeben. Benutzt du einen persönlichen oder maschinellen Laden? Versuchen Sie diesen Link https://blogs.msdn.microsoft.com/stcheng/2013/03/12/windows-store-apphow-to-perform-rs-a-data-encryption-with-x509-certificate-based-key-in -windows-store-application/ Versuchen Sie, eine Windows Store-App zu erstellen, um zu sehen, ob Ihr Code die Liste der Zertifikate zurückgeben kann. Meine Vermutung (wie Sie Code nur eine leere Liste zurückgeben, und es gibt keine Ausnahme), dass es Autorisierung Problem ist. Ein Benutzer, unter dem Sie Ihre App ausführen, hat keinen Zugriff auf Zertifikate/rsa Keys Store. –

+0

Ich habe meinen Beitrag bearbeitet. Ich benutze persönlichen Speicher. Wie Sie sehen können, gibt es einige DLL-Konflikte => Ausnahme. – J3r0M3

Antwort

0

überprüfen WinRT Zertifikatsverwaltung unterscheidet sich von der Desktop und Core-Framework. Für WinRT würden Sie den Windows.Security-Namespace verwenden.

Sie können den Zertifikatspeicher mit der Klasse Windows.Security.Cryptography.Certificates.CertificateStore öffnen und verwalten.

+0

Danke! Ich habe diese Klasse nicht gesehen, keine "Workaround" mehr – J3r0M3