ios | ios도 모르고 하이브리드 앱 개발하기 [ 22 APNS 구현 - Received fatal alert: certificate_unknown 오류 ]

2016. 10. 7. 11:45mobile/ios



ios도 모르고 하이브리드 앱 개발하기 [ 22 APNS 구현 - Received fatal alert: certificate_unknown 오류  ]




아래 포스팅에서 알수있듯이 APNS를 성공적으로 만들었다.


21.1 APNS 구현 - APNS 인증서 만들기

21.2 APNS 구현 - APNS 서버 만들기 (프로바이더 구성)

21.3 APNS 구현 - APNS 클라이언트 만들기 (IOS 구성)




그런데 갑자기 오류가 생겼다.

 




PUSH를 보내려고 서버에서 호출을 하면 다음과 같이 오류가 났다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
java.io.IOException: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:467)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1979)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1086)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:709)
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122)
    at java.io.OutputStream.write(OutputStream.java:75)
    at javapns.back.PushNotificationManager.sendNotification(Unknown Source)
    at org.apache.jsp.iosApns_jsp._jspService(iosApns_jsp.java:138)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
    ... 23 more
 
cs





Received fatal alert: certificate_unknown 라는 메시지가 주요한 오류 메시지이다.


인증서를 알수없다고 한다.


어제까지 되던게 갑자기 안된다.


해결방법을 엄청나게 찾아봤던거 같다.


해결방법은 3가지로 좁혀졌다.


1. 인증서가 만료(폐기)됐거나 발급받는 도중에 오류가 있으니 처음부터 다시 발급받아볼 것

2. 서버 실행시 java7을 사용하지말고 java6을 사용해볼 것. javapns 라이브러리와 맞는 jdk를 사용해야 한다는 이유

3. p12 파일을 생성할 때 인증서 1개만 내보내기로 생성할 것


필자는 3개 다 해봤다.


필자에게 맞는 방법은 3번이다.


21.1 APNS 구현 - APNS 인증서 만들기


위 포스팅 본문 중 p12파일 만드는 곳을 보면(본문 중 하단에 있음) 

필자는 인증서를 만들 때 인증서+개인키 를 모두 선택하고 내보내기를 한다.


 




기존에 만든 apns.p12파일을 지우고 

인증서만 선택하고 내보내기를 해서 apns.p12 파일을 생성해 보았다.


그러니 정상동작하였다.









그럼 인증서와 개인키 2개를 선택해서 만든 apns.p12파일로 

실행했을땐 왜 됐던거니 ????????


어쨋든 해결이 되었네 ....






 * 경고


IOS에 무지한 상태에서 구글링만으로 앱 개발 및 포스팅이 진행됨


누구나 따라할 수 있겠지만 결코 완벽한 정답이 아닐 수 있음


아주 주관적인 입장에서의 포스팅임