감자주먹밥

[Java] 식단표 어플제작 이슈 본문

Android

[Java] 식단표 어플제작 이슈

JustHm 2021. 6. 28. 23:02
728x90

대학에 들어와서 어플 개발자를 도전해보고 싶어서

20년도에 학교 기숙사 식단표를 만들어보았다.

어플도 출시 했고 조금이지만 50명 정도의 사용자가 있었다 ㅎㅎ

나름 뿌듯했던 일인데 첫 어플을 만들고 스토어에 올려보는거라 해결하기 힘든 일도 있었고 보안 관련된 이슈도 있었다.

그 중 가장 해결이 오래걸렸던 SSL 인증에 대해 적어보려구 한다.

아직 보안에 대한 개념이 없고 전공교과 중 보안은 3학년에 들어서야만 들을 수 있길래 아주 미흡한 점이 많겠지만

적어놓고 나중에 지식이 쌓이면 천천히 바꿔보기로 하자.


https://github.com/JungHm/AnuTool/tree/master/app/src/main/java/com/anumeal/anutool

 

 

일단 깃헙 주소! JAVA를 처음 배우고 열심히 고민하면서 짜 봤지만 MVP, MVVM 같은 디자인 패턴도 모르는 상태라서 코드가 부끄럽다.

코드를 짜면서 있던 가장 큰 이슈는 바로 HTTPS 접속시 SSL 인증이였다.

JSOUP을 이용해 기숙사 메뉴를 웹에서 가져오고 파싱을 하는 작업을 하려고 했는데

handshake exception이 발생했었다.

HTTPS 에서 SSL 인증을 해주면 풀린다는 글을 보고DOCS에서 한참 찾아서 해 봤지만 이해가 안되는 탓에

처음엔 그냥 SSL 우회하는 코드를 긁어와서 사용했다.

근데 마켓에 업로드 하니 2021년 1월 부로 SSL 우회하는 코드를 포함하는 어플은 빨리 코드를 수정하라고 메일이 오길래 결국은 DOCS를 보고 코드를 이해해보면서 해결하였다.

protected void setSSL() throws IOException, KeyStoreException, NoSuchAlgorithmException, KeyManagementException, CertificateException {
        String certString = "-----BEGIN CERTIFICATE-----\n" +
                "-----END CERTIFICATE-----";
// Load CAs from an InputStream
        // (could be from a resource or ByteArrayInputStream or ...)
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        // From https://www.washington.edu/itconnect/security/ca/load-der.crt

        //InputStream caInput = new BufferedInputStream(new FileInputStream("dormCert.crt"));
        InputStream caInput = new ByteArrayInputStream(certString.getBytes());
        Certificate ca = null;
        try {
            ca = cf.generateCertificate(caInput);
            System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
        } catch (CertificateException e) {
            e.printStackTrace();
        } finally {
            caInput.close();
        }

        // Create a KeyStore containing our trusted CAs
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("ca", ca);

        // Create a TrustManager that trusts the CAs in our KeyStore
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);

        // Create an SSLContext that uses our TrustManager
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);

    }

밑에 코드는 사실 아직도 자세히는 이해가 되지 않지만

흐름을 알고 보면 공개키를 넣어놓고 공개키를 통해 통신할때 인증을 하는 방식으로 이해했다.

이렇게 해결하니 경고없이 마켓에 업로드 할 수 있었지만

어플개발 공부를 하다보니 공개키 등 중요한 정보들은 코드에 직접 적는게 아닌 파일을 읽어오는 방식을

사용해야 한다고 보았다. 깃헙 코드도 언능 바꿔야 하는데...

이 경험을 통해 개발을 하면서 보안도 아주 중요하고 통신에 대한 이해도 꼭 필요하다고 생각이 들었다.

통신-보안등 전공공부 열심히 하면서 개발공부하기

728x90
Comments