2016. 10. 7. 11:45ㆍmobile/ios
ios도 모르고 하이브리드 앱 개발하기 [ 22 APNS 구현 - Received fatal alert: certificate_unknown 오류 ]
아래 포스팅에서 알수있듯이 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번이다.
위 포스팅 본문 중 p12파일 만드는 곳을 보면(본문 중 하단에 있음)
필자는 인증서를 만들 때 인증서+개인키 를 모두 선택하고 내보내기를 한다.
기존에 만든 apns.p12파일을 지우고
인증서만 선택하고 내보내기를 해서 apns.p12 파일을 생성해 보았다.
그러니 정상동작하였다.
그럼 인증서와 개인키 2개를 선택해서 만든 apns.p12파일로
실행했을땐 왜 됐던거니 ????????
어쨋든 해결이 되었네 ....
* 경고 IOS에 무지한 상태에서 구글링만으로 앱 개발 및 포스팅이 진행됨 누구나 따라할 수 있겠지만 결코 완벽한 정답이 아닐 수 있음 아주 주관적인 입장에서의 포스팅임 |