Infra

[SSL] SSL 이란?

자라선 2020. 7. 31. 15:13

SSL(Secure Socket Layer) HTTP 서버의 보안을 위한 인증 방식 절차이다.

 

TLS SSL 같은 말이며 TLS 정식 명칭이나 SSL 명칭을 많이 사용한다.

 

SSL 적용하였을때의 장점 다음과 같다.

  1. 3자의 변조를 방지할 있다.
  2. 클라이언트가 접속하려는 서버가 신뢰할 있는지 확인 있다.
  3. 통신 내용이 노출을 방지할 있다.

 

SSL은 공개키 방식 사용하고 있다.

공개키 방식은 클라이언트 뿐만 아니라 공개적인 공개키와 인증기관만 가지고 있는 비밀키로 구성되어 있으며, 공개키로 암호화를 하게 된다면 다시 복호화 하기위해서는 비밀키가 필요하게 된다.

최종적으로는 복호화를 진행해야하는데 비밀키를 외부로 보내 복화하는것이 아닌 공개키로 암호화 비밀키로 복호화하는 방식을 사용하여 대칭키 방식보다 보안력이 강화된 방식을 사용한다.

 

openssl 프로그램을 사용한 예시)

# 비밀키를 생성
openssl genrsa -out private.pem 1024

# 비밀키로 RSA 알고리즘 공개키를 생성한다.
openssl rsa -in private.pem -out public.pem -outform PEM -pubout

# 공개키를 사용하여 file.txt 를 file.ssl로 암호화한다.
openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl;

# 복호화 하기위해서는 비밀키로 암호화가 된 file.ssl를 복호화하여 새로운 파일을 생성한다.
openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt

 

CA(Certificate autority)는 클라이언트가 의도한 서버가 맞는지 인증 및 보장해주는 역할을 하는 인증기관이다.

공인으로 인증받은 기업들이 관리하며 사용자들이 사용하려면 CA로부터 인증서를 구입해야한다.

 

이러한 CA로부터 받은 SSL인증서는 브라우저 내부에서 관리되고 있으며 매번 SSL 인증서들의 업데이트가 진행된다.

그렇게 때문에 공인된 인증서가 아니라면 브라우저에서 인증받지 못한 인증서라며 경고를 하기도한다.

인증되지 않은 기관의 인증서를 등록했을때 브라우저가 경고함

 

CA 인증서는 크게 2가지의 역할을 해주며 클라이언트에게 공개키를 제공하거나 클라이언트에게 접속한 서버가 신뢰할수 있는 서버임을 인증할수 있도록 해준다.

브라우저에 인증서 내용을 자세하게 살펴볼수도 있는데 인증서의 유효기간, 인증서의 인증기관, 인증서의 서버측 공개키등 확인할 있다.

크롬의 경우 URL 왼쪽의 자물쇠에서 인증서를 조회할 수 있음


HandShake

SSL 인증절차
 - 대칭키 방식 : 클라이언트가 A키를 만들고 A키를 사용해 암호화를 한다면 암호화된 문서를 복호화할때는 A키를 써야하므로 서버쪽에서도 A키를 알아야한다. 하지만 A키를 서로 공유해야하는 상황이 생기는데 이때 A키의 공유에 보안에 이슈가 생기게 된다.

 

 - 공개키 방식 : 비밀키를 만들고 비밀키로 공개키를 만든다. 이렇게 만들어진 공개키는 모든 사람에게 보내주고 문서를 암호화할때는 공개키로 암호화 하지만 복호화 할때는 오직 비밀키로만 해야하기 때문에 서버측에서 비밀키를 가지고 클라이언트에서는 공개키를 가진다.

 

  1. 클라이언트는 서버에게 요청시 랜덤 (A), 서버와 같이 사용할 암호화 방식, 세션 아이디 보내준다.(Client Hello)
  2. 서버는 응답으로 랜덤 (B), 클라이언트에게 받은 동일한 암호화 방식을 서버쪽에서도 찾아 동일한 암호화 방식, 인증서 보내준다. (Server Hello)
  3. 클라이언트에서는 서버에가 받은 인증서가 내장되어있는 CA리스트에 있는지 찾고 없으면 경고 메세지를 있다면 해당 인증서의 공개키를 사용하여 인증서를 복호화한다.
    만약 복호화에 성공한다면 서버에서 보내준 인증서는 공인된 인증서임을 확인이 됨으로 해당 서버는 신뢰할수 있다고 판단한다.
    클라이언트는 클라이언트 쪽에서 보낸 랜덤 (A) 서버쪽에서 보내준 랜덤 (B) 조합하여 pre master secret 값을 생성하여 공개키를 사용해 암호화를 하고 서버에게 보내준다. 이떄 암호화 값은 대칭키로써 사용됨으로 절대 외부에 노출이 되어서는 안된다.
  4. 서버는 공개키로 암호화 pre master secret 값을 건네받아 이를 비밀키로 복호화를 하여 클라이언트와 서버 둘다 pre master secret 값을 공유하게 되고, 서버와 클라이언트는 내부적인 작업으로 pre master secret 값을 master secret값으로 만들며 이를 사용해 session key 생성한다.
    이렇게 생성된 session key 가지고 클라이언트와 서버는 서로 대칭키 방식으로 요청응답을 처리하게된다.
  5. 최종적으로는 클라이언트와 서버는 서로 HandShake 단계의 종료를 알려주고 끝을 낸다.

 

간단히 공개키 방식을 사용하지 않고 대칭키와 혼용하여 세션으로 사용하는 이유는 컴퓨터의 자원소모가 극심하기 때문이다.

서버에서 여러 인원이 동시에 인증요청이 들어오게 된다면 공개키 방식만 사용시 매번 요청에 따라 인증서와 복호화를 반복하기 때문에 서버에 부하가 올수 있다.

그래서 최초로 CA 인증서로 인증이 된다면 공개키 방식을 사용하여 중요한 키값을 서로 공유하고 암호화 하여 최종적으로는 서로에게 세션을 사용한 대칭키 방식으로 하여 HandShake 단계를 종료한다.

 

세션이 종료시 인증에 사용된 세션 키을 폐기한다.