6

Ich verwende den folgenden Code für Push-Benachrichtigungen.Problem in der IOS-Push-Benachrichtigung - Die Authentifizierung ist fehlgeschlagen, weil die Gegenstelle den Transportstream geschlossen hat

public void PushNotificationIOS(string message, string registrationKey) 
{ 

    string deviceID = registrationKey; 
    int port = 2195; 
    String hostname = System.Configuration.ConfigurationManager.AppSettings["HostName"];//"gateway.sandbox.push.apple.com"; 
    string certPath = string.Empty; 
    certPath = System.Configuration.ConfigurationManager.AppSettings["CertificatePath"] + System.Configuration.ConfigurationManager.AppSettings["Cer 
    String certificatePath = System.Web.HttpContext.Current.Server.MapPath(certPath); 
    string certPassword = System.Configuration.ConfigurationManager.AppSettings["CertificatePassword"]; 
    TcpClient client = new TcpClient(hostname, port); 
    try 
    { 

     X509Certificate2 clientCertificate = new X509Certificate2(System.IO.File.ReadAllBytes(certificatePath), certPassword); 
     X509Certificate2Collection certificatesCollection = new X509Certificate2Collection(clientCertificate); 
     SslStream sslStream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
     sslStream.AuthenticateAsClient(hostname, certificatesCollection, SslProtocols.Tls, false); 
     MemoryStream memoryStream = new MemoryStream(); 
     BinaryWriter writer = new BinaryWriter(memoryStream); 
     writer.Write((byte)0); 
     writer.Write((byte)0); 
     writer.Write((byte)32); 
     writer.Write(StringToByteArray(deviceID.ToUpper())); 
     String payload = "{\"aps\":{\"alert\":\"" + message + "\",\"badge\":0,\"sound\":\"default\"}}"; 
     writer.Write((byte)0); 
     writer.Write((byte)payload.Length); 
     byte[] b1 = System.Text.Encoding.UTF8.GetBytes(payload); 
     writer.Write(b1); 
     writer.Flush(); 
     byte[] array = memoryStream.ToArray(); 
     sslStream.Write(array); 
     sslStream.Flush(); 
     client.Close(); 
    } 
    catch (System.Security.Authentication.AuthenticationException ex) 
    { 

     client.Close(); 
    } 

} 

Ich erhalte die folgenden Fehler Authentifizierung fehlgeschlagen, da die anderen Teilnehmer den Transportstrom geschlossen haben. On Trace, erhalte ich die folgenden

System.Net.Security.SslState.CheckThrow(Boolean authSucessCheck) 
    at System.Net.Security.SslState.get_SecureStream() 
    at System.Net.Security.SslStream.Write(Byte[] buffer) 

Ich habe versucht, alle in verschiedenen Post erwähnt Dinge, aber ich bin nicht in der Lage, das Problem zu lösen.

+0

die Version von .NET Sie 4.0 oder 4.5 oder 4.6 verwenden? –

+0

ist es MVC 4.5 Framework. Visual Studio 2015 –

+0

Fehler behoben, wenn ich Zertifikat nur mit privatem Schlüssel erstellen. Geben Sie außerdem dem Ordner, in dem .p12 liegt, die Berechtigung. –

Antwort

1

Vergewissern Sie sich, dass das Zertifikat gültig ist & ist nicht beschädigt. Sie können das Zertifikat regenerieren, um sicher zu sein.

versuchen, alle Optionen für SecurityProtocolType wie die Bereitstellung:

alle Optionen auch, aber Transport Layer Security 1.1 oder nach unten verhandeln
sslStream.AuthenticateAsClient(hostname, certificatesCollection, SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls, false); 

SecurityProtocolType.Tls12 versuchen sicher zu sein.

enter image description here

Weitere Einzelheiten zu SecurityProtocolType siehe:

https://msdn.microsoft.com/en-us/library/system.net.securityprotocoltype(v=vs.110).aspx

+0

Ich habe bereits ein neues Zertifikat erstellt auch das Zertifikat auf dem iPhone selbst versucht und die Benachrichtigung funktioniert ordnungsgemäß. Ich habe auch den folgenden Code verwendet. versuchen { sslStream.AuthenticateAsClient (Hostname, certificatesCollection, SslProtocols.Tls, false); } catch (Ausnahme e) { mylog (e.message); } versuchen { sslStream.AuthenticateAsClient (Hostname, collectsCollection, SslProtocols.Tls11, false); } catch (Ausnahme e) { mylog (e.message); } versuchen { sslStream.AuthenticateAsClient (Hostname, certificatesCollection, SslProtocols.Tls12, false); } catch (Ausnahme e) { mylog (e.message); } In jedem Fang habe ich den gleichen Fehler. –

+0

Schreiben Sie nicht alle Varianten zur gleichen Zeit versuchen Sie eins nach dem anderen. ODER Verwenden Sie das Rohrsymbol ... –

+0

Nein, immer noch der gleiche Fehler. –

Verwandte Themen