Question

J'ai un ServiceReference ajouté à une application C # console qui appelle un service Web qui est exposé à partir d'Oracle.

J'ai tout est configuré et fonctionne comme les pêches quand il est de ne pas utiliser SSL (http). Je suis en train de le configurer en utilisant SSL, et je suis en cours d'exécution dans des problèmes avec l'ajouter aux références de service (ou même des références sur le Web). Par exemple, l'URL (https) que le service est exposé sur, ne retournera pas les méthodes Web appropriés lorsque je tente de l'ajouter dans Visual Studio.

  

La connexion sous-jacente a été fermée: Une erreur inattendue est survenue sur un envoi.   Reçu un EOF inattendu ou 0 octets à partir du flux de transport.   Les métadonnées contiennent une référence qui ne peut être résolu: « https://srs204.mywebsite.ca:7776 / unrépertoire / MyWebService? WSDL '

Une autre situation embarrassante que j'ai est en ce qui concerne la gestion et le déploiement certificat. J'ai environ 1000 sites clients externes qui devront utiliser ce petit utilitaire et dont ils auront besoin du certificat installé dans le magasin de cert approprié afin de se connecter au service Web. Vous ne savez pas sur la meilleure façon de traiter ce sujet. Ont-ils besoin d'être dans le magasin racine?

J'ai passé pas mal de quelques heures sur le Web à la recherche sur les différentes options mais ne peut pas obtenir une bonne réponse propre partout.

Pour résumer, j'ai quelques questions ici:

1) Tout le monde a quelques bons liens sur la mise en place des services Web dans Visual Studio qui utilisent SSL?

2) Comment dois-je enregistrer le certificat? Quel magasin devrait-il exister dans? Puis-je utiliser quelque chose comme CertMgr pour l'enregistrer?

Il doit y avoir un bon livre / tutorial / whatever qui va me montrer les bonnes pratiques communes sur la définition quelque chose comme cela. Je ne arrive pas à le trouver!

Était-ce utile?

La solution

Eh bien, je l'ai compris cela. Il m'a fallu beaucoup plus longtemps que je me soucie de parler, mais je voulais partager ma solution car il est une bête noire énorme de la mienne pour voir la norme. « Oh je l'ai fixé! Merci! » les messages qui laissent tout le monde suspendu à ce qui est arrivé.

.

Le problème de la racine est que par défaut Visual Studio 2008 utilise TLS pour la poignée de main SSL et la Webservice base Oracle / Java que je tente de se connecter à l'aide a été SSL3.

Lorsque vous utilisez le "Ajouter un service de référence ..." dans Visual Studio 2008, vous avez aucun moyen de spécifier que le protocole de sécurité pour le gestionnaire de point de service doit être SSL3.

À moins.

Vous prenez un document WSDL statique et utilisation wsdl.exe pour générer une classe proxy .

wsdl /l:CS /protocol:SOAP /namespace:MyNamespace MyWebService.wsdl

Ensuite, vous pouvez utiliser le C de Sharp compilateur pour transformer cette classe proxy dans une bibliothèque (.dll) et l'ajouter à vos projets .Net « Références ».

csc /t:library /r:System.Web.Services.dll /r:System.Xml.dll MyWebService.cs

À ce stade, vous devez également vous assurer que vous avez inclus dans votre System.Web.Services « Références » aussi bien.

Maintenant, vous devriez être en mesure d'appeler votre service Web sans problème dans le code. Pour ce faire travail vous allez avoir besoin d'une ligne magique code ajouté avant instancier le service.

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Ok, donc je me sentais assez impressionné par moi-même que l'essai était grande sur ma boîte de dev. Ensuite, je déployé à une autre boîte client et il ne se connecter à nouveau en raison d'une autorisations / question d'autorité. Cela sentait comme des certificats pour moi (ce qu'ils sentent comme). Pour résoudre ce problème, je utilisé certmgr.exe enregistrer le certificat pour le site à la racine de confiance sur la machine locale.

certmgr -add -c "c:\someDir\yourCert.cer" -s -r localMachine root

Cela me permet de distribuer le certificat à nos sites clients et installer automatiquement pour les utilisateurs. Je ne suis toujours pas sûr de la façon dont la « sécurité amicale », les différentes versions de Windows seront en ce qui concerne l'enregistrement des certificats automatisés comme celui-ci, mais il a très bien fonctionné jusqu'à présent.

Hope cette réponse aide certaines personnes. Merci à blowdart aussi pour toute votre aide sur celui-ci et fournir un aperçu.

Autres conseils

Il semble que le service Web utilise un certificat auto-signé. Franchement ce n'est pas la meilleure approche.

En supposant que vous êtes une grande organisation et il est interne, vous pouvez configurer votre propre autorité de certification de confiance, ce qui est particulièrement facile avec active Directory. A partir de ce CA le serveur qui héberge le service Oracle pourrait demander un certificat et vous pouvez utiliser la politique AD faire confiance à votre certificat racine de CA interne en le plaçant dans la racine de confiance du magasin de la machine. Cela éliminerait la nécessité de faire confiance à la main ou accepter le certificat sur le service Web.

Si les machines clientes sont externes, alors vous allez devoir obtenir les gens d'exposer le service pour acheter un certificat « réel » de l'une des autorités de certification bien connus comme Verisign, Thawte, GeoTrust, etc. ou dans le cadre de votre paquet installer le certificat public et l'installer dans des autorités de certification racine de confiance au niveau de la machine sur chaque machine. Cela a des problèmes, par exemple aucun moyen de révoquer le certificat, mais supprime l'invite.

Merci pour ce bon conseil, a pris un coup d'œil autour de vos trucs et vous avez beaucoup de bonnes idées en cours. Voici mon petit peu à ajouter - je déterminer webMethods et il a les mêmes problèmes que le serveur d'applications Oracle vous connecté à (SSL3 au lieu de TLS) (surprise!). Votre approche fonctionnait très bien, voici mon addendum.

Compte tenu de la classe statique "Factory," fournissent ces deux éléments-dandy pratique:

/// <summary>
/// Used when dispatching code from the Factory (for example, SSL3 calls)
/// </summary>
/// <param name="flag">Make this guy have values for debugging support</param>
public delegate void CodeDispatcher(ref string flag);

/// <summary>
/// Run code in SSL3 -- this is not thread safe. All connections executed while this
/// context is active are set with this flag. Need to research how to avoid this...
/// </summary>
/// <param name="flag">Debugging context on exception</param>
/// <param name="dispatcher">Dispatching code</param>
public static void DispatchInSsl3(ref string flag, CodeDispatcher dispatcher)
{
  var resetServicePoint = false;
  var origSecurityProtocol = System.Net.ServicePointManager.SecurityProtocol;
  try
  {
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3;
    resetServicePoint = true;
    dispatcher(ref flag);
  }
  finally
  {
    if (resetServicePoint)
    {
      try { System.Net.ServicePointManager.SecurityProtocol = origSecurityProtocol; }
      catch { }
    }
  }
}

Et puis consommer ce genre de choses (comme vous avez sans doute déjà deviné, mais mettez un rouleau de tambour ici de toute façon):

    var readings = new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading[] {
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 1, created = DateTime.Now.AddDays(-1), reading = 17.34, userID = 2
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 2, created = DateTime.Now.AddDays(-2), reading = 99.76, userID = 3
      },
      new ArchG2.Portal.wmArchG201_Svc_fireWmdReading.wmdReading() {
        attrID = 3, created = DateTime.Now.AddDays(-5), reading = 82.17, userID = 4
      }
    };
    ArchG2.Portal.Utils.wmArchG201.Factory.DispatchInSsl3(ref flag, (ref string flag_inner) =>
    {
      // creates the binding, endpoint, etc. programatically to avoid mucking with
      // SharePoint web.config.
      var wsFireWmdReading = ArchG2.Portal.Utils.wmArchG201.Factory.Get_fireWmdReading(ref flag_inner, LH, Context);
      wsFireWmdReading.fireWmdReading(readings);
    });

Ce le tour est joué -. Quand je serai un peu plus de temps, je vais résoudre le problème de filetage (ou non)

Depuis que je n'ai pas la réputation de commenter, je voudrais mentionner que la réponse de Mat Nadrofsky et l'exemple de code pour forcer SSL3 est aussi la solution pour une erreur similaire à

  

Une erreur tout en rendant le   requête HTTP à https: // xxxx / whatever .   Cela pourrait être dû au fait que la   certificat de serveur n'est pas configuré   correctement avec HTTP.SYS dans le protocole HTTPS   Cas. Cela pourrait aussi être causée par un   inadéquation de la sécurité de liaison   entre le client et le serveur.

Il suffit d'utiliser

// We're using SSL here and not TLS. Without this line, nothing workie.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

comme indiqué par Mat. Testé avec un serveur SAP NetWeaver PI dans le protocole HTTPS. Merci!

Mat,

J'avais des questions aussi et j'avoir un moyen d'éviter d'utiliser certmgr.exe pour ajouter des certificats à la racine de confiance sur une machine distante.

X509Store store;
store = new X509Store("ROOT", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

Le « objet de certificat » peut être créé comme ceci:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top