본문 바로가기
안드로이드 자바

[Android][Java] 안드로이드에서 socket.io 로 SSL 통신할 때 Trust all certificates 설정해주기

by teamnova 2023. 9. 7.
728x90

안녕하세요 오늘은 socket.io로 통신할 때 Trust all certificates를 설정해주는 방법을 알려드리겠습니다

trust all certificates 는 js 클라이언트의 rejectUnauthorized: false 와 동일합니다.

 

trust all certificates 는 보안 연결을 사용하는 목적에 어긋나므로 주의해서 사용해야합니다.

 

 

1. 안드로이드 manifest폴더 밑에 있는 파일에 다음과 같은 코드를 추가해주세요

<uses-permission android:name="android.permission.INTERNET" />

 

 

2. 안드로이드에서 socket.io 사용하려면 build.gradle  파일 에 다음과 같은 코드 추가해주세요

주의) 안드로이드의 socket.io 버전에 따라 서버와 통신이 불가능할 수 도 있습니다. 버전 호환성을 확인해주세요

https://socketio.github.io/socket.io-client-java/installation.html

(버전 호환성 확인할 수 있는 사이트)

 

socket.io-client – Compatibility

Compatibility Client version Socket.IO server 0.9.x 1.x 1.x 2.x (or 3.1.x / 4.x with allowEIO3: true) 2.x 3.x / 4.x Installation The latest artifact is available on Maven Central. Maven Add the following dependency to your pom.xml. io.socket socket.io-clie

socketio.github.io

implementation('io.socket:socket.io-client:2.1.0') {
    exclude group:'org.json', module:'json'
}

파일 위치

참고 사이트 : https://socketio.github.io/socket.io-client-java/initialization.html#Trust_all_certificates

 

socket.io-client – Initialization

Initialization Table of content Creation of a Socket instance URI uri = URI.create("https://example.com"); IO.Options options = IO.Options.builder() // ... .build(); Socket socket = IO.socket(uri, options); Unlike the JS client (which can infer it from the

socketio.github.io

 

다음은 socket.io 에서 Trust all certificates 설정 후에 서버와 통신하는 코드입니다.

packagecom.example.webrtc1.tutorial;


import staticio.socket.client.Socket.EVENT_CONNECT;
import staticio.socket.client.Socket.EVENT_CONNECT_ERROR;

importandroid.os.Bundle;
importandroid.util.Log;

importandroidx.appcompat.app.AppCompatActivity;

importcom.example.webrtc1.R;

importjava.net.URISyntaxException;
importjava.security.KeyManagementException;
importjava.security.NoSuchAlgorithmException;
importjava.security.cert.X509Certificate;
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.concurrent.TimeUnit;

importjavax.net.ssl.HostnameVerifier;
importjavax.net.ssl.SSLContext;
importjavax.net.ssl.SSLSession;
importjavax.net.ssl.TrustManager;
importjavax.net.ssl.X509TrustManager;

importio.socket.client.IO;
importio.socket.client.Socket;
importokhttp3.OkHttpClient;


public classCompleteActivity_noCheckServerextendsAppCompatActivity {
private static finalStringTAG="CompleteActivity";
private static final intRC_CALL= 111;
    OkHttpClientokHttpClient;
privateSocketsocket;


privateArrayList<String>userList=newArrayList<>();


    @Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.socket_test_for_newo);


        HostnameVerifier hostnameVerifier =newHostnameVerifier() {
            @Override
public booleanverify(String hostname, SSLSession sslSession) {
return true;
            }
        };

        X509TrustManager trustManager =newX509TrustManager() {
publicX509Certificate[] getAcceptedIssuers() {
return newX509Certificate[] {};
            }

            @Override
public voidcheckClientTrusted(X509Certificate[] arg0, String arg1) {
// not implemented
}

            @Override
public voidcheckServerTrusted(X509Certificate[] arg0, String arg1) {
// not implemented
}
        };

        SSLContext sslContext =null;
try{
            sslContext = SSLContext.getInstance("TLS");
        }catch(NoSuchAlgorithmException e) {
throw newRuntimeException(e);
        }
try{
            sslContext.init(null,newTrustManager[] { trustManager },null);
        }catch(KeyManagementException e) {
throw newRuntimeException(e);
        }

okHttpClient=newOkHttpClient.Builder()
                .hostnameVerifier(hostnameVerifier)
                .sslSocketFactory(sslContext.getSocketFactory(), trustManager)
                .readTimeout(1, TimeUnit.MINUTES)// important for HTTP long-polling
.build();

        start();
        };


private voidstart() {


            socketConnect();//시그널링와 이벤트를 주고 받을 소켓 생성및 시그널링 서버와 연결


}

private voidSocketEventListener(){//생성된 소켓의 연결 상태를 알려주는 역할

socket.on(EVENT_CONNECT_ERROR,args -> {
            Log.d(TAG,"소켓 연결 에러 "+ Arrays.toString(args));
        });

    }

private void socketConnect() {

        String URL ="통신할 서버 url :8086";// https://서버url :port번호 형식으로 작성
Log.d(TAG,"REPLACE ME: IO Socket:"+ URL);

        IO.Options options =newIO.Options();
        options.callFactory=okHttpClient;
        options.webSocketFactory=okHttpClient;
try{
socket= IO.socket(URL,options);
        }catch(URISyntaxException e) {
throw newRuntimeException(e);
        }
socket.connect();
        Log.d(TAG,"소켓 connect연결 시도");

socket.on(EVENT_CONNECT, args -> {
            Log.d(TAG,"소켓 연결 됨 args : "+args);

        });
    }


}