본문 바로가기
안드로이드 공부 노트

[Android] 네트워크 보안 구성 SSL 핀셋(pinset) 검증 SHA-265 키 구하기 - 공개키 핀닝 (android network-security-config pin-set key setting) SSL Pinning을 해야하는 이유 with android Glide javax.net.ssl.SSLHandshakeException: Pin..

by 지게요 2024. 3. 20.
728x90
반응형

이번 공부노트는 안드로이드 SSL Pinning 할 때 여러 가지 방식이 있지만 Network Security Configuration 방식에서 pin-set SHA-265 Key를 구하는 방법을 포스팅해 보겠다.

 

나도 회사에서 받은 프로젝트에 Network Security Configuration로 SSL Pinning이 되어있어서 키 값을 구해야 하는 상황이었다.

구글링을 해보면 전부 Gradle를 통해서 다른 SHA-265 Key 즉 D9:8F:58~~~~ 이런 식으로 되어있는 키 값 구하는 법 밖에 안 나와서 나처럼 pin-set SHA-265 key를 구하고 싶은 사람을 위해 포스팅을 하기로 결정했다.

 

본 포스팅은 SHA-265 key 값을 구하는 게 주목적이기 때문에 SSL Pinning을 해야 하는 이유에 대해서는 간단하게 작성해 보겠다.

# SSL Pinning란? / 사용해야 하는 이유

- SSL 인증서 또는 해당 공개 키(또는 해시)를 앱 내에서 직접 "고정"함으로써 SSL 고정은 중간자(MITM) 공격으로부터 보호하는 보안 기술이다.

저기서 중간자 공격이란 공격자는 사기성 SSL 인증서를 제시하여 앱과 서버 간의 통신을 가로채는 공격이라고 할 수 있다.

그래서 SSL Pinning을 사용해 앱에 고정된 인증서만 사용하도록 해주기 때문에 SSL Pinning을 사용해야 한다.

 

https://www.indusface.com/learning/what-is-ssl-pinning-a-quick-walk-through/

# pin-set SHA-265 key 값 구하는 방법

우선 networksecurityconfig.xml 파일을 구성 방법을 이미 알고 있다고 생각하고 진행하겠다.

구성하는 방법을 모르면 공식문서를 보고 구성해놓고 다시 보길 추천한다.

 

## 1. 서버로부터 인증서 다운로드

윈도우 사용자 경우 OpenSSL을 수동으로 설치해야 한다.

맥은 자동으로 터미널에 설치되어있음

 

윈도우만 OpenSSL 설치 (아래 블로그 참조)

https://aspdotnet.tistory.com/2653

 

Windows 윈도우 10 에 OpenSSL 을 설치하는 방법

OpenSSL은 TLS (Transport Layer Security) 및 SSL (Secure Sockets Layer) 프로토콜을 위한 모든 기능을 갖춘 툴킷 입니다. Apache 스타일 라이센스에 따라 라이센스가 부여됩니다. 이 튜토리얼은 Windows 운영 체제에

aspdotnet.tistory.com

 

맥은 터미널을 열어준다.

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -outform PEM > servercert.pem

위 명령어 중 -connect example.com:443 부분에 example.com을 본인 서버의 도메인을 입력한다.

그럼 위와 같이 나온다.

## 2. 인증서에서 SHA-256 지문 생성

다운로드한 인증서 파일로부터 SHA-256 지문을 생성한다.

openssl x509 -in servercert.pem -pubkey -noout | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -binary | openssl enc -base64

위 명령어는 아무 변형 없이 입력해도 된다.

아래처럼 바로 SHA-256 KEY가 생성이 된다! 

 

바로 저 키를 아래 코드 KEY1에 적으면 성공! (당연히 {}은 제외하고 적어야 한다!)

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
    <domain includeSubdomains="true">example.com</domain>
    <pin-set>
        <pin digest="SHA-256">{KEY1}</pin>
    </pin-set>
</domain-config>
</network-security-config>

 

 

참고
https://munseong.dev/android/apply_ssl_pinning/#network-security-configuration
https://developer.android.com/privacy-and-security/security-config?hl=ko#pin
반응형