2016-11-11 2 views
2

Smack API를 사용하여 Openfire 서버를 사용하여 애플리케이션을 채팅하고 있습니다. 클라이언트와 서버의 묻는 인증서 사이의 연결을 설정하는 동안 그래서, 같은Smack API를 사용하여 Xmpp Connection에서 트러스트 관리자를 기억하는 중, 안드로이드 클라이언트의 퍼미션을 요구하지 않으려면 어떻게해야합니까?

SSLContext sslContext = null; 
try { 
      sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null,MemorizingTrustManager.getInstanceList(getApplicationContext()), new SecureRandom()); 
     } catch (NoSuchAlgorithmException | KeyManagementException e) { 
      e.printStackTrace(); 
     } 
     XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); 
     configBuilder.setCustomSSLContext(sslContext); 

을 신뢰 관리자를 암기 사용하지만 문제는 MemorizingTrustManager가

enter image description here

처럼 사용자로부터 허가를 받아야 팝업을 보여주고 있는가 어떤 방법 으로든 이것을 처리 할 수 ​​있습니다. 어떤 사람이 귀하의 제안을 게시하시기 바랍니다. 미리 감사드립니다.

+0

나는이 질문을하지 않는다 : 시스템 (예 : 설치된 CA를 통해)에서 서비스의 인증서를 확인할 수없는 경우이 대화 상자를 표시하는 것은 MTM이 수행해야하는 작업과 정확히 같습니다. – Flow

+0

@Flow, 백그라운드에서 받아 들일 수 있습니까? 내가 필요한 것은이 팝업을 사용자에게 보여주고 싶지 않거나 MTM이 아닌 인증서를 제공하는 다른 방법입니다. – Priya

+0

희망은 내 대답은 여기에 도움이 : http://stackoverflow.com/a/33148123/4629102 또한 내 블로그 : http://smackssl.blogspot.in/2015/10/ssl-implementation-in-android-for-smack .html – Iqbal

답변

0

memorizingTrustManager의 출처를 살펴보면 두 개의 트러스트 스토어를 처리하게됩니다. 하나는 시스템 기본 트러스트 스토어이고, 하나는 응용 프로그램 트러스트 스토어입니다. 귀하가 요청한 허가는 해당 상점에서 인증서를 확인할 수 없음을 의미합니다. 그래서 한 가지 방법과 적절한 방법은 해당 인증서를 앱 트러스트 스토어에로드하는 것입니다. 이렇게하면 ssl handshake 동안 신뢰 저장소가 내부적으로 검사하고 서버의 인증서를 수락합니다.

/** Creates an instance of the MemorizingTrustManager class that falls back to a custom TrustManager. 
* 
* You need to supply the application context. This has to be one of: 
* - Application 
* - Activity 
* - Service 
* 
* The context is used for file management, to display the dialog/
* notification and for obtaining translated strings. 
* 
* @param m Context for the application. 
* @param defaultTrustManager Delegate trust management to this TM. If null, the user must accept every certificate. 
*/ 

public MemorizingTrustManager(Context m, X509TrustManager defaultTrustManager) { 
    init(m); 
    this.appTrustManager = getTrustManager(appKeyStore); 
    this.defaultTrustManager = defaultTrustManager; 
} 

, 그래서 null을 전달하지 않습니다 여기 MemorizingTrustManager

소스를 확인하여 서버 인증서를 가지고 트러스트 매니저를 제공합니다.