먹는게 남는거다!

PushSharp로 APNs 이용중 오류 해결 - 패키지에 제공된 자격 증명을 인식할 수 없습니다

C#, ASP.NET

System.ComponentModel.Win32Exception: 패키지에 제공된 자격 증명을 인식할 없습니다


PushSharp.Apple.ApnsNotificationException: Apns notification error: 'ConnectionError' ---> System.ComponentModel.Win32Exception: 패키지에 제공된 자격 증명을 인식할 수 없습니다

   위치: System.Net.SSPIWrapper.AcquireCredentialsHandle(SSPIInterface SecModule, String package, CredentialUse intent, SecureCredential scc)

   위치: System.Net.Security.SecureChannel.AcquireCredentialsHandle(CredentialUse credUsage, SecureCredential& secureCredential)

   위치: System.Net.Security.SecureChannel.AcquireClientCredentials(Byte[]& thumbPrint)

   위치: System.Net.Security.SecureChannel.GenerateToken(Byte[] input, Int32 offset, Int32 count, Byte[]& output)

   위치: System.Net.Security.SecureChannel.NextMessage(Byte[] incoming, Int32 offset, Int32 count)

   위치: 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.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)

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

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

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

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

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

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

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

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

   위치: PushSharp.Apple.ApnsConnection.<connect>d__25.MoveNext()

--- 예외가 throw된 이전 위치의 스택 추적 끝 ---

   위치: System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

   위치: System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)

   위치: PushSharp.Apple.ApnsConnection.<SendBatch>d__21.MoveNext()

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

   위치: PushSharp.Apple.ApnsServiceConnection.<Send>d__2.MoveNext()



PushSharp을 이용해서 iOS 기기에 푸시를 보낼 때 위와 같은 오류가 발생했습니다.


apple에서 발급 받은 인증서 권한 문제로 보여 구글링을 해보면 다양한 해법이 있습니다.


그 중 대부분이 apple에서 인증서를 발급 받을 때 private만 추출해야 하는데 다 추출해서 발생한 문제입니다.



저 같은 경우는 로컬 컴퓨터에서 테스트시 정상 발송되었기 때문에 인증서 문제는 아니었습니다.


제가 성공한 방법은 PushSharp 샘플처럼 인증서 파일을 직접 사용하는 것이 아니라 저장소에 인증서를 등록하고 불러와서 사용하는 방법입니다.


저장소에 등록한 인증서를 지문(THUMBPRINT)를 통해 가져오는 코드는 아래와 같습니다.



1
2
3
4
5
6
7
8
string thumbprint = "YOUR THUMBPRINT";
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
var certificate = store.Certificates.Find(
    X509FindType.FindByThumbprint, thumbprint, validOnly: false)
    .Cast<X509Certificate2>().SingleOrDefault();
var apnsConfig = new ApnsConfiguration(
    ApnsConfiguration.ApnsServerEnvironment.Production, certificate);
cs


출처: https://stackoverflow.com/questions/23329040/pushsharp-apns-production-the-credentials-supplied-to-the-package-were-not-reco



전 인증서를 로컬 컴퓨터에 저장하였기 때문에 위 코드에서 StoreLocation.CurrentUserStoreLocation.LocalMachine 으로 변경하였습니다.


지문(THUMBPRINT)는 인증서를 더블 클릭 후 나오는 인증서창의 자세히탭에서 확인할 수 있습니다.

(단, thumbprint 변수에 지문을 넣을 때는 공백 없이 입력해야 합니다.)