.NET Framework/C#에서 Apple iPhone, Google Android, Windows Phone으로

Push 메시지를 전송하기 위해 사용할 수 있는 라이브러리 중,

"PushSharp"이라는 아주 편리한 오픈 소스 Push 라이브러리가 있는데,


최근 이 PushSharp으로 Apple APNS로 Push 메시지를 전송하는 코드를 만들어 테스트하던 중에

아래와 같은 오류 메시지와 함께 정상 동작이 되지 않는 현상이 발견되었다.


PushSharp.Apple.ApplePushService -> System.Security.Authentication.AuthenticationException: SSPI를 호출하지 못했습니다. 내부 예외를 참조하십시오. ---> System.ComponentModel.Win32Exception: 예기치 않은 메시지를 받았거나 메시지의 형식이 잘못되었습니다

   --- 내부 예외 스택 추적의 끝 ---

   위치: System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)

   위치: System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)

   위치: System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)

   위치: System.Net.Security.SslStream.AuthenticateAsClient(String targetHost, X509CertificateCollection clientCertificates, SslProtocols enabledSslProtocols, Boolean checkCertificateRevocation)

   ...


물론 이 오류는 Development 환경, 즉 APNS Sandbox에서만 발생하는 오류다. Production 환경에서는 아직까지는 오류가 발생하지 않는다(고 한다).


아무튼,

공개 라이브러리를 사용했는데, 이처럼 라이브러리 내부에서 오류가 발생해서 정상 동작을 하지 않으면

대략 멘붕...;;;;


문제 해결을 위해 한국어로는 백날 검색해 봐야 소용 없고,

위 오류 메시지를 영어로 보면,


A call to SSPI failed, see inner exception. ---> System.ComponentModel.Win32Exception: The message received was unexpected or badly formatted


이렇다. (물론, 한국어 개발 환경에서 오류 메시지를 영어로 볼 방법은 없다. 실제로는 대략 유추하면 되고, 위에 올려놓은 정확한 내용은 구글링한 결과로 찾아서 올려놓은 것이다.)



검색했더니 역시나 수많은 쓰레기 정보들 사이에 숨어 있던, 아래와 같은 페이지가 나왔다.


>> 참조: http://stackoverflow.com/questions/23115394/pushsharp-apple-the-message-received-was-unexpected-or-badly-formatted



위 참조 페이지에서 채택(?)된 내용은 SSL3 대신에 TLS를 사용하면 위 오류가 발생하지 않는다는 내용인데,

직접 수정해서 테스트해보니, 개소리다오류는 여전히 발생한다.


다만, 오류와 함께 전송되지 않고 실패하던 Push 메시지가, 오류는 발생하지만 전송은 된다는 차이만 있었다.

뭐, 전송은 되니까 상관 없는 건가? 문제 해결?


오류를 발생하지 않게 할 방법은 아직 찾지 못했다. 어떤 검색 결과 페이지에서는 X509Certificate 및 X509CertificateCollection을 모두 X509Certificate2 및 X509Certificate2Collection으로 바꾸면 오류가 발생하지 않는다는 얘기도 있었는데, 그것도 말짱 다 거짓말. 다 바꿔봐도 하나도 개선되지 않았다.


뭐, 시간이 지나면 PushSharp 제작자 누군가가 새로 바뀐 APNS Sandbox에 맞게 오류가 발생하지 않는 수정된 버전으로 업데이트해서 올리겠지... 난 몰라. 그냥 내꺼만 잘 되면 되지 뭐, 신경 끌란다;;;





Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]