IT한 것

python에서 SSL/TLS의 client certificate 제출

lovian 2021. 4. 2. 22:55

심심하신 분들은 아래 배경 부분을 읽어보시고, 바쁘시다면 그 다음부터 보시면 됩니다.

 

 

배경

언젠가부터 웹 환경에서 SSL/TLS를 사용하는 것은 아주 일반적인 일이 되었다.

PKI 구조를 활용한 안전하게 설계된 프로토콜을 이용하여 우리의 웹은 안전해졌다고 들었을 것이다.

 

그런데 아쉽게도 생각보다 안전하게 않을 수 있다.

 

바로 단일 인증만들 사용하기 때문이다.

클라이언트가 서버를 인증서하는 절차는 강제이지만, 서버가 클라이언트를 인증하는 절차는 옵션이며, 대부분의 서버가 사용하지 않는 편이다. 만일 쌍방 인증을 하려면, 사용자도 적절한 인증서가 있어야한다.

그러려면 우리가 사용하는 웹 브라우저에 사용자의 SSL/TLS 인증서를 설치, 발급 하는 방법이 마련되어야 한다.

여기서 설치는 이미 웹 브라우저에서 제공되는 기능이지만, 일반 사용자들은 이 기능에 대해 잘 알지도 못하는 편일 것이고, 거기에 필요한 인증서를 발급 받는 것도 요원한 일이다. (서버에서 제공하지 않을테니..)

 

여튼 대부분 환경에서는 서버가 클라이언트를 인증하지 않는 상황에서 사용하니 중간자 공격(Man In The Middle attack)이 성립하기 쉬워진다. 그리고 Fiddler등의 proxy 서버를 사용해본 사람이라면 알겠지만, 이 프로그램에는 SSL Decryption 이라는  proxy 통한 SSL/TLS  데이터를 복호화 하는 기능이 존재한다. SSL/TLS가 그렇게 안전한 프로토콜이라면 왜 이게 가능한지 의문을 가져본 적이 있다면, 지금 읽고 있는 이글이 그 의문을 조금 해소시켜 줄 수 있을 것 같다.

 

조금더 안전한 프로그램을 위해서는 가능하다면 SSL/TLS 사용시 쌍방 인증을 수행한다면, 당신의 프로그램이 도청될 가능성은 상당히 줄어들 것이다.

 

 

파이썬에서 클라이언트 인증서 제출

위에서 배경에 비해 아주 간단한 결과라 기분이 좋다

context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations('../res/rootca.crt')
context.check_hostname = False

certFile = 'client.crt'
priFile = 'client.key'

context.load_cert_chain(certFile, keyfile=priFile)

사실상 아래의 한 줄이 전부이다.

certFile과 priFile은 암호화되지 않은 인증서과, 개인키 파일이며

openssl의 키 생성 방식을 따라서 만들어진 파일이다.