Domanda

Ciao, sto riscontrando problemi nel tentativo di pubblicare una richiesta Web in Https.

ho ricevuto i seguenti errori

1.-La connessione sottostante è stata chiusa: impossibile connettersi al server remoto.

2.-l'operazione TimeOut

3-La connessione sottostante è stata chiusa: impossibile stabilire un canale sicuro per SSL / TLS.

Ho provato con circa 3 o 4 proxy diversi della mia azienda e dell'azienda cliente e nemmeno quando sono direttamente con il provider ISP senza restrizioni, ottengo i suddetti errori quando eseguo il seguente metodo

WebRequest.GetRequestStream() 

questo si verifica dietro un proxy o meno, la richiesta può essere inviata con successo solo da un singolo PC che si trova dietro un proxy. il proxy non ha un certificato client installato.

questo è in .net framework 1.1 e la richiesta contiene già credenziali di rete.

cosa potrebbe essere?

Aggiornamento

l'eccezione interna il terzo errore è il seguente:  La funzione è stata completata correttamente, ma deve essere richiamata per completare il contesto

secondo iisper.h documentazione questo errore appartiene al

//
// MessageId: SEC_I_CONTINUE_NEEDED
//
// MessageText:
//
//  The function completed successfully, but must be called
//  again to complete the context
//
#define SEC_I_CONTINUE_NEEDED            ((HRESULT)0x00090312L)

su MSDN si riferisce a

SEC_I_CONTINUE_NEEDED  Il client deve inviare il token di output al server e attendere un token di ritorno. Il token restituito viene quindi passato in un'altra chiamata a InitializeSecurityContext (Schannel). Il token di output può essere vuoto.

significa che al PC manca un certificato client?

È stato utile?

Soluzione

Ci sono un numero intero di cose che potrebbero complicare le cose, per quanto riguarda le incoerenze con i certificati SSL, ecc. Ma prima, dovresti fare un debug di base per escludere le cose ovvie:

- Hai provato a inviare una semplice richiesta Web ad altri server? Prova sia http (non garantito) che https (protetto)

- Hai provato a connetterti da un altro computer o da un'altra rete? Hai detto che il client è dietro un proxy; prova prima un computer senza proxy, per escluderlo.

- Stai facendo più richieste Web all'interno della sessione? C'è un limite al numero di richieste aperte, quindi assicurati di chiuderle dopo aver ottenuto WebResponse. Forse fai un programma di test con una sola richiesta.

Se ciò non lo restringe, probabilmente è qualcosa di più complicato, con il loro server o proxy. Puoi tracciare i pacchetti di rete in uscita con un programma come netshark per provare a rintracciare dove le cose si bloccano.

Altri suggerimenti

Puoi tracciare il traffico HTTP usando Fiddler o uno strumento di sniffing di pacchetti di rete come Ethereal Whireshark sulla macchina su cui sta lavorando e su una delle altre macchine e confronta i risultati. Si tratta di un livello abbastanza basso, ma potrebbe far luce sul problema.

  • Se puoi telnet da macchine diverse a 443, allora non sono le prime due, poiché ciò significa che la macchina client sta ricevendo richieste su quella porta.

Su Windows che sarebbe

telnet <domainname> 443

e se si collega lo schermo diventerà vuoto (premi Invio alcune volte per uscire)

  • I proxy possono o meno interessarsi alla tua richiesta se è sotto HTTPS in quanto non possono leggerlo.

  • Sulle altre macchine è installato il certificato client e la catena di certificati?

Il nome del certificato SSL probabilmente non corrisponde. Questo è spesso il caso dei certificati autofirmati.

La soluzione è scrivere la propria routine di autenticazione in cui si restituisce sempre true o si esegue l'autenticazione necessaria per assicurarsi che il certificato sia valido.

// .NET 2.0+
...
ServicePointManager.ServerCertificateValidationCallback += MyValidationCallback
...
public bool MyValidationCallback(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors err)
{
  return true;
}

// .NET 1.1
public class MyCertificatePolicy : ICertificatePolicy
{
  public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
  {
    return true;
  }
}
...
ServicePointManager.CertificatePolicy = new MyCertificatePolicy();
...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top