HTTPS + 인증서

katsukichi·2021년 4월 14일
0

CodeStates_IM

목록 보기
42/48

HTTP + secure

HTTPS

암호화를 통해서 보안성이 향상되었다.

HTTP 는 중간에 끼어들어서 데이터를 다 볼수있엇다.

HTTPS는 중간에 암호화를 하기때문에

중간에 암호화를풀 KEY가 없다면 읽을수없다.

인증서(Certificate)

  • 데이터 제공자 신원 보장

  • 도메인 종속

응답 객체의 도메인과

인증서의 도메인이 같다면 믿을수있다.

하지만 해커가

제 3자공격으로인한 도메인변경을하면

인증서의 도메인과 다르므로 공격을 방지할수있다.

CA?

Certificate Authority

  • 공인 인증서 발급 기관

HTTPS: 비대칭 키 암호화

키 A로 암호화를 했다면

키 B로만 복호화 가능!

A:B 한쌍의 키중 하나는 공개를하는경우가 있고

나머지하나는 비밀로 가지고있는다.

절차

  1. 클라이언트 Hello

  2. 서버 Hello, 공개키,인증서 정보 전달(서버인증서 검증)
    --- 여기까지 Hand Shack 과정

  3. 키 제작용 랜덤 스트링 전송 (클라->서버)

  4. 키 제작용 랜덤 스트링 전송 (서버->클라)
    Client ,Server각각 세션 키 생성
    --- 여기까지 비밀키 생성

  5. 세션키로 암호화 된 메세지 전달 (클라->서버)

  6. 세션키로 암호화된 메세지 전달 (서버->클라)
    --- 여기까지 상호 키 검증
    --- HTTPS 연결 성립

SSL , TLS

SSL 또는 TLS 라는 알고리즘을 이용해, HTTP통신을 하는과정에서 내용을 암호화한다.

SSL? TLS? SSL과 CA(인증기관)은 관계가 있나?

인증에서 HTTPS 는 (상대적으로) 안정적이고, 데이터 제공자의 신원을 보장받을수 있기때문에써야한다.

신원을 보장하는게 왜 중요한데 ?

  • 클라이언트는 데이터 제공자(서버)가 제공해준 데이터를 사용할 수밖에없다.
    클라이언트는 서버에 데이터요청을 하고 이후 받은 데이터를 이용해서 화면을 렌더링 하는 등의 작접을 해야한다.

  • 그렇기 때문에 요청 및 응답을 중간에서 가로채는 중간자 공격에 취약하다.
    '중간자 공격'은 클라이언트와 서버 사이에서 공격자가 서로의 요청,응ㅇ답의 데이터를 탈취 및 변조하여 다시 전송하는 공격이다.

    데이터가 중간에 다른 도메인을 거쳐서 전달되기 때문에 서버가 해당 데이터는 https://example.com 도메인에서 제공되었습니다. 라는 추가 데이터를 응답 객체에 실어 보낸다면, '중간자공격' 으로 인해 다른 도메인에서 데이터를 받은 클라이언트는 데이터를 제공한 도메인과 전달받은 내용의 도메인을 비교하여 '중간자 공격'이 존재하는지 아닌지 확인할 수있다.

    물론 중간자공격으로 인해 이런 추가 데이터 또한 변조할 수있다.

    따라서 해당 데이터를 암호화시키는 작업이 필요하다.

암호화

wireshark 라는 패킷 분석 프로그램 으로 http요청에서 개인정보를 빼낼수있다.

https요청은 암호화되어있으므로 어떤 내용인지 알수 없다.

인증서

https 프로토콜의 또다른 특징중 하나가 브라우저가 응답과 함께 전달된 인증서 정보를 확인할 수 있다는 점이다.

브라우저는 인증서에서 해당 인증서를 발급한 CA 정보를 확인하고 CA가 발급한 인증서가 아니라면 아래와 같이 화면에 경고창을 띄워 서버와 ㅇ연결이 안정하지않다는 화면을 보여준다.

인증서의 도메인과 데이터를 제공한 제공자의 도메인을 비교할 수있기 때문에 인증서으 ㅣ도메인 정보와 데이터 제공자ㅡ ㅣ도메인 정보가 다른 '중간자공격'을 감지하여 보안 위협으로부터 사용자 및 사용자의 데이터를 보호할수있다.

또한 보안 경고창을 보여줌으로써 브라우저들은 인증된 CA가 발급한 인증서를 이용하여 데이터를 제공하는 안전한서버를 사용할수있게 사용자를 유도한다.

인증서 발급 및 HTTPS 서버 구현

mkcert 를 통해서 로컬환경에서 신뢰할수있는 인증서를 만들수있다.

설치

ubuntu

$ sudo apt install libnss3-tools
$ wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64
$ chmod +x mkcert
$ sudo cp mkcert /usr/local/bin/

macOS

$ brew install mkcert

# firefox 인경우
$ brew install nss

인증서 생성

$ mkcert -install

위 명령어를 통해서 로컬을 인증된 발급기관으로 추가해야한다.

다음 로컬환경에 대한 인증서를 만들어야하는데

localhost로 대표되는 로컬환경에 대한 인증서르 ㄹ만들려면 다음 명령어가 필요하다.

$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1

이제 옵션으로 추가한 localhost, 127.0.0.1(IPv4), ::1(IPv6)에서 사용할 수 있는 인증서가 완성되었습니다. cert.pem, key.pem 이라는 파일이 생성된 것을 확인할 수 있습니다.

key와 cert의 차이점 ?

키는 ...키겠지.. cert는 ㅇ인증서파일이겟지 ..?

HTTPS 서버 작성


const https = require('https');
const fs = require('fs');

https
  .createServer(
    {
      key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
      cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
    },
    function (req, res) {
      res.write('Congrats! You made https server now :)');
      res.end();
    }
  )
  .listen(3001);

서버 실행 파일 내부에 파일이 둘다 있어야한다.

그리고 ngrok 에 대한 언급이 있는데

이거는 써봐서 더 잘알겠지만

내가 라즈베리파이로 홈클라우드를 구현할당시에

파일관리권한 문제때문에

https가 아니면 문제가 있었다.

그래서 https터널링을 쓸수밖에없는 상황이여서

그때당시엔 무엇인지도 모르고 사용했던거같다.!

지금은 좀 알꺼같은데.

후..

profile
front-back / end developer / Let's be an adaptable person

0개의 댓글