Pergunta

Então, eu tenho uma ServiceReference adicionado a uma aplicação C # consola que chama um serviço Web que é exposta da Oracle.

Eu tenho tudo setup e ele funciona como pêssegos quando não está usando SSL (http). Eu estou tentando configurá-lo usando SSL agora, e eu estou correndo em problemas com a adição-lo para as Referências de serviço (ou referências da Web mesmo). Por exemplo, a URL (https) que o serviço está sendo exposto em, não está retornando os métodos da web apropriadas quando eu tentar adicioná-lo em Visual Studio.

A conexão subjacente foi fechada: Ocorreu um erro inesperado em um envio. Recebeu um EOF inesperado ou 0 bytes do fluxo de transporte. Metadados contém uma referência que não pode ser resolvido: ' https://srs204.mywebsite.ca:7776 / algumdiretorio / MyWebService? WSDL '

Outro dilema que eu tenho é no que diz respeito à gestão e implantação de certificados. Eu tenho cerca de 1000 sites de clientes externos que precisarão usar este pequeno utilitário e eles precisam do certificado instalado na loja cert apropriado, a fim de conectar-se ao Web Service. Não tenho certeza sobre a melhor abordagem para lidar com isso. Eles precisam estar no arquivo de raiz?

Eu passei algumas horas na web olhando para várias opções, mas não pode obter uma boa resposta em qualquer lugar limpo.

Para resumir, eu tenho um par de perguntas aqui:

1) Alguém tem alguns bons links sobre a criação de Web Services no estúdio que o uso de SSL Visual?

2) Como devo registrar o certificado? Que loja que deve existir em? Eu só posso usar algo como certmgr para registrá-lo?

Tem de haver um bom livro / tutorial / whatever que vai me mostrar práticas comuns boas sobre como definir algo como isso. Eu só não consigo encontrá-lo!

Foi útil?

Solução

Bem, eu já descobriram isso. Levei muito mais tempo do que eu gostaria de falar sobre, mas eu queria compartilhar minha solução, já que é um animal de estimação implicância enorme da mina para ver o padrão. "Oh, eu fixa-lo! Obrigado!" mensagens que deixam todo mundo pendurado sobre o que realmente aconteceu.

Então.

A raiz do problema era que, por padrão o Visual Studio 2008 usa TLS para o aperto de mão SSL eo Webservice com base Oracle / Java que eu estava tentando se conectar a estava usando SSL3.

Quando você usa o "Add Service Reference ..." no Visual Studio 2008, você tem nenhuma maneira para especificar que o protocolo de segurança para o gerenciador de ponto de serviço deve ser SSL3.

A menos.

Você pega um documento WSDL estático e uso wsdl.exe para gerar uma classe de proxy .

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

Em seguida, você pode usar o C afiada Compiler para transformar essa classe de proxy em uma biblioteca (.dll) e adicioná-lo aos seus projetos .Net "Referências".

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

Neste ponto, você também precisa ter certeza de que você incluiu System.Web.Services em seus "Referências" também.

Agora você deve ser capaz de chamar o serviço de web sem um problema no código. Para torná-lo trabalho você vai precisar de uma linha mágica de código adicionado antes de instanciar o serviço.

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

Ok, então eu estava me sentindo muito impressionado comigo mesmo como o teste foi ótimo na minha caixa de dev. Então eu implantado para outra caixa cliente e ele não iria ligar novamente devido a um permissões / issue autoridade. Este cheirava certificados para mim (o que eles cheiram como). Para resolver isso, eu usado Certmgr.exe para registrar o certificado para o site do Trusted Root na máquina local.

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

Isso me permite distribuir o certificado para os nossos sites de clientes e instalá-lo automaticamente para os usuários. Eu ainda não tenho certeza de como "segurança friendly" as diferentes versões do Windows será em relação aos registros de certificados automatizados como este, mas tem funcionado muito bem até agora.

Hope essa resposta ajuda a algumas pessoas. Graças a blowdart demais para toda a sua ajuda em um presente e fornecer algum insight.

Outras dicas

Parece que o serviço web está usando um certificado auto-assinado. Francamente isso não é a melhor abordagem.

Assumindo que você é um grande organização e é interna, você pode configurar o seu próprio autoridade de certificação confiável, isto é especialmente fácil com Diretório Ativo. A partir desse CA do servidor que hospeda o serviço do Oracle pode solicitar um certificado e você pode usar a política AD confiar certificado raiz da sua CA interna, colocando-o na raiz confiável da loja de máquina. Isso eliminaria a necessidade de confiança manualmente ou aceitar o certificado no serviço de web.

Se as máquinas clientes são externos, então você vai ter que começar a gente expondo o serviço que quer comprar um certificado "real" de um dos CAs bem conhecidas como Verisign, Thawte, GeoTrust etc. ou como parte de sua instalação pacote o certificado público e instalá-lo em autoridades de certificação raiz confiáveis ??no nível da máquina em cada máquina. Isto tem problemas, por exemplo, não há maneira de revogar o certificado, mas irá remover o prompt.

Obrigado por esta grande dica, deu uma olhada rápida ao redor em suas coisas e você tem um monte de boas idéias acontecendo. Aqui é o meu pouco para adicionar - Eu estou tentando descobrir webMethods e ele tem os mesmos problemas que o servidor de aplicações do Oracle que você conectado a (SSL3 vez de TLS) (surpresa!). Sua abordagem funcionou muito bem, aqui está o meu aditamento.

classe estática dado "Factory," fornecer esses dois itens handy-dandy:

/// <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 { }
    }
  }
}

E, em seguida, para consumir essas coisas (como você sem dúvida já adivinhou, mas colocar um rolo de tambor aqui de qualquer maneira):

    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);
    });

Isso faz o truque -. Quando eu ficar mais algum tempo eu vou resolver o problema de segmentação (ou não)

Como não tenho reputação ao comentário, eu gostaria de mencionar que a resposta e código de exemplo de Mat Nadrofsky para forçar SSL3 é também a solução para um erro semelhante ao

Ocorreu um erro ao fazer a HTTP solicitação para https: // xxxx / whatever . Isto pode ser devido ao fato de que o certificado de servidor não está configurado corretamente com HTTP.SYS no HTTPS caso. Isso também pode ser causado por um incompatibilidade da segurança obrigatório entre o cliente eo servidor.

Apenas uso

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

como mencionado por Mat. Testado com um servidor SAP NetWeaver PI em HTTPS. Obrigado!

Mat,

Eu tive esses problemas também e eu tenho uma maneira de evitar o uso de Certmgr.exe para adicionar certificados de raiz confiável em uma máquina remota.

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

O 'objeto de certificado' pode ser criado assim:

X509Certificate2 certificate = new X509Certificate2("Give certificate location path here");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top