6
votes

Mise en œuvre du client C # XMLRPC.NET et serveur sur HTTPS

Il est assez difficile de trouver des informations sur la bibliothèque xmlrpc.net utilisée avec https.

La seule documentation dans laquelle une URL "https" peut être définie est ici: http://xml-rpc.net/faq/xmlrpcnetfaq-2-0.html#2.3 mais Pourtant, cela n'explique pas exactement comment peut-on installer correctement. P>

expérimenter sur la base d'échantillons fournis dans les téléchargements http://xmlrpcnet.googlecode.com/files/xml-rpc.net.2.5.0.zip J'ai essayé ceci: p>

changements dans le fichier client.cs de STATENAMESERVER Solution: strong> p> xxx pré>

ce que le code serveur ressemble à strong>

    IDictionary props = new Hashtable();
    props["name"] = "MyHttpChannel";
    props["port"] = 5678;
    HttpChannel channel = new HttpChannel(
    props,
    null,
    new XmlRpcServerFormatterSinkProvider()
    );

    ChannelServices.RegisterChannel(channel, false);

    RemotingConfiguration.RegisterWellKnownServiceType(
    typeof(StateNameServer),
    "statename.rem",
    WellKnownObjectMode.Singleton);


0 commentaires

3 Réponses :


2
votes

Créer un proxy client à l'aide de xmlrpcproxygen.create, en spécifiant l'URL HTTPS (votre interface devrait dériver de ixmlrpcroxy). Si vous devez fournir un certificat (s) client (s), le proxy dispose d'une propriété clientCertificats qui peut être utilisée de la même manière que la propriété correspondante sur la classe System.net.Httpwebrequest.

Je ne pense pas que les télécommandes puissent supporter HTTPS. Vous pouvez utiliser HTTplistener comme décrit dans le FAQ XML-RPC.NET < / a> Mais vous devrez configurer un certificat, par exemple comme décrit dans cette blog


3 commentaires

Merci Charles. J'ai essayé d'utiliser xmlrpcproxygen, mais le client continue d'abandonner une exception lors de la tentative d'envoi de données. Le serveur n'a-t-il pas besoin d'une sorte de certificat aussi?


Ajout du paragraphe sur la mise en œuvre d'un serveur.


Merci pour votre aide Charles, votre lien m'a aidé à trouver la solution. J'ai ajouté le certificat au serveur (mon ordinateur local) ... le reste de la solution ci-dessous dans ma réponse.



4
votes

Premièrement, je voudrais remercier chaleureusement Charles Cook pour son aide sur ce problème et pour développer xmlrpc.net.

second, cet exemple est basé sur l'échantillon XMLRPC.NET STATENAMESERVER DISPONIBLE POUR TÉLÉCHARGER ICI: http://xml-rpc.net/download.html

Donc, voici la solution:

1. Générez ou obtenez un certificat [auto-signé] (à l'aide de Makecert.exe par exemple)

2. Ajoutez ce certificat à votre configuration de votre serveur et spécifiez le port que vous souhaitez utiliser avec votre serveur XMLRPC.NET (dans ce cas 5678) à l'aide de httpcfg.exe ou un autre outil tel que httpsysconfig (source ouverte)

3. Implémentez votre serveur XMLRPC.NET à l'aide du code suivant: xxx

4. Implémenter votre client XMLRPC.NET à l'aide du code suivant (le code crée également un nouveau certificat client X509) xxx

bien sûr, je ne donne pas ici le Mise en œuvre de l'interface pour le serveurStatename, mais vous le trouverez dans les exemples de fichiers à l'aide du lien de téléchargement en haut.

remarque :

système .NET.ServicePointManager.CertificatePolicy = nouveau fidutaleCertificatePolicy () ; permettra à l'implémentation du serveur d'accepter le certificat auto-signé que vous avez généré vous-même. Je pense que cela n'est pas nécessaire avec des certificats émis par les autorités de certification.

Si vous trouvez tout ce qui pourrait être amélioré et qu'il est incorrect, il sera très apprécié.


1 commentaires

Après le test, je peux confirmer que la mise en œuvre fonctionne sur deux machines Windows distinctes.



1
votes

Super article! M'aide beaucoup. Mais les articles 1 et 2 m'ont emmené un jour pour comprendre. Alors voici mon expérience:

  1. Pour générer un certificat auto-signé, j'ai utilisé OpenSSL outil. Il suffit de suivre les instructions dans le lien. Ce certificat dont j'avais besoin pour l'application cliente.
  2. Pour l'application Server, j'avais besoin d'un autre certificat. Le code de serveur utilise la classe HTTplistener qui n'a pas de propriété de certificats. Il n'ya aucun moyen comment appliquer un certificat spécifique à l'instance de la classe HTTplistener. Il y a une autre stratégie:
    • Créer un nouveau certificat en stockage de certificats local. Pour faire ce type 'MMC' dans cmd-> File-> Ajouter / Supprimer instantané-> Certificats-> Add-> Compte informatique-> Computer local-> OK. Aller à Personnel-> Certificats-> Clic droit-> Toutes les tâches-> Demander un nouveau certificat. Suivant-> suivant-> Sélectionnez Server Web-> Cliquez sur le lien bleu -> En gros, vous n'avez besoin que de ne pas ressentir le nom commun ici (mettre le nom de certificat souhaité). Ok-> Inscrivez-vous. Maintenant, vous avez votre certificat dans le stockage local.
    • Bind Certificat Créé à une paire IP / Port spécifique. Pour ce faire exécuter une chaîne suivante dans cmd: netsh http Ajouter SSLCERT IPPORT = 192.168.111.195: 4022 CERTHASH = C8973A86141A7A564A6F509A1ECFEA326A1852A2 Appid = {0A582A74-FC2D-476C-9281-C73B2E4BFB26} , où 'ipport' est IP / paire de ports qui sera utilisé pour la connexion SSL; 'certhash' est un certificat hachage (certificat ouvert que vous avez créé dans l'étape précédente-> aller à des détails -> Recherchez pour ThumbPrint); 'Appid' pourrait être n'importe où.

      Si vous spécifiez "HTTPS" dans votre URL HTTplistener, cette classe recherchera automatiquement des certificats liés.


1 commentaires

Glat ça a aidé! :) J'essaie d'essayer de tes notes.