공돌이의 지식 저장소

iptime ddns를 이용한 무료 ssl 인증서 발급 + nodejs express로 서버 구동(추 후 HTTPS에 대한 세부 내용 추가 예정) 본문

SERVER/Raspberry Pi(Ubuntu Server)

iptime ddns를 이용한 무료 ssl 인증서 발급 + nodejs express로 서버 구동(추 후 HTTPS에 대한 세부 내용 추가 예정)

도오라에몽 2023. 8. 18. 04:52

HTTP/HTTPS

서버를 구성하기 전에 http와 https에 대하여 간단히 이야기하겠다.

HTTP(Hyper Text Transfer Protocol)

HTTP는 인터넷에서 데이터를 주고받을 수 있는 프로토콜(통신 규약)이다. 이러한 약속이 없으면 정보를 주고 받을 때 각 정보를 이루는 데이터의 형태가 다를 수 있는데 그렇게 된다면 정보의 일관적인 처리를 할 수 없게 된다. 반대로 말하면 정보를 이루는 데이터의 형태가 일정하면 일관적인 처리를 할 수 있어 효율적이라고 할 수 있다.

HTTP에 대하여 조금 더 자세하게 이야기 하면 OSI(Open Systems Interconnection) 네트워크 통신 모델의 애플리케이션 계층 프로토콜이며 여러 유형의 요청과 응답을 정의한다. 웹 사이트를 불러올 때는 HTTP GET 요청을 전송하며 이러한 요청에 대한 응답으로는 아래와 같이 숫자로 나타난다.

  • 200 : OK
  • 404 : Resource not found
  • 500 : Internal server error
    더 자세한 응답 내용은 [(이쪽)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status)에서 확인 가능하다.

이런 HTTP에도 문제가 있었는데 바로 보안 문제다. HTTP는 암호화가 되지 않은 평문 데이터를 전송하는 프로토콜이기 때문에 제3자가 중요한 정보를 감청할 수 있는 위험성이 있다. 이러한 보안이 요구되어 나온 것이 HTTPS인 것이다.

HTTPS(Hyper Text Transfer Protocol Secure)

HTTP에 데이터 암호화가 추가된 프로토콜이다. HTTP에서는 제3자가 HTTP 메세지를 감청할 수 있다고 하면 HTTPS는 암호화 되었기에 감청 가능성이 매우 낮아졌다고 할 수 있다.

참고로 HTTP는 80 포트를 사용하고 HTTPS는 443 포트를 사용한다.

HTTPS 암호화 방식

HTTPS는 대칭키 암호화 방식과 비대칭키 암호화 방식 모두 사용한다.

  • 대칭키 암호화(Symmetric-key cryptography)
    클라이언트와 서버가 동일한 키를 사용해 암호화/복호화를 한다는 특징이 있다.

    이미지 출처: 위키피디아
  • 공개키/비대칭키 암호화(Public-key/Asymetric-key cryptography)
    암호화와 복호화에 사용하는 키가 서로 다른 암호화 방식을 의미한다.

HTTPS 웹 사이트는 독립된 인증 기관(CA)에서 SSL/TLS 인증서를 획득해야 합니다. 이러한 웹 사이트는 신뢰를 구축하기 위해 데이터를 교환하기 전에 브라우저와 인증서를 공유합니다. SSL 인증서는 암호화 정보도 포함하므로 서버와 웹 브라우저는 암호화된 데이터나 스크램블된 데이터를 교환할 수 있습니다. 프로세스는 다음과 같이 작동합니다.

  1. 사용자 브라우저의 주소 표시줄에 https:// URL 형식을 입력하여 HTTPS 웹 사이트를 방문합니다.
  2. 브라우저는 서버의 SSL 인증서를 요청하여 사이트의 신뢰성을 검증하려고 시도합니다.
  3. 서버는 퍼블릭 키가 포함된 SSL 인증서를 회신으로 전송합니다.
  4. 웹 사이트의 SSL 인증서는 서버 아이덴티티를 증명합니다. 브라우저에서 인증되면, 브라우저가 퍼블릭 키를 사용하여 비밀 세션 키가 포함된 메시지를 암호화하고 전송합니다.
  5. 웹 서버는 프라이빗 키를 사용하여 메시지를 해독하고 세션 키를 검색합니다. 그런 다음, 세션 키를 암호화하고 브라우저에 승인 메시지를 전송합니다.
  6. 이제 브라우저와 웹 서버 모두 동일한 세션 키를 사용하여 메시지를 안전하게 교환하도록 전환합니다.
    위 내용 출처 : https://aws.amazon.com/ko/compare/the-difference-between-https-and-http/

    이제 진짜 간단하게 환경설정과 서버 업로드까지 해보겠다.

간단 설명

이 사이트에서 무료로 서비스 등록
https://www.sslforfree.com/
iptime ddns에서 caa 항목이 존재하지 않기 때문에 인증서를 받지 못하는 문제가 생김
따라서 iptime에서 운용하는 ddns가 아니라 무료 ddns 서비스를 이용해야 함
duckdns라는 사이트인데 사용하기 좋음. https://www.duckdns.org/

https://www.duckdns.org/install.jsp

위 링크를 참조하면 다양한 환경에서 설정할 수 있도록 함
필자는 라즈베리파이에 ubuntu server를 올려 사용 중임
따라서 pi를 선택

(대충 설명하는 글 적기 croton 설정하는 내용)

iptables를 이용하여 네트워크 정책을 만들기

그 다음 express 코드

const express = require("express");
const app = express();

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

// 본인이 안전하다고 생각되는 위치에 인증서 파일들 넣기
const credentials = {
    ca: fs.readFileSync("./path/ca_bundle.crt"),
    key: fs.readFileSync("./path/private.key"),
    cert: fs.readFileSync("./path/certificate.crt"),
};

const httpsServer = https.createServer(credentials, app);
app.set("port", 8080);

app.use(express.static("public"));

app.get("/", (req, res, next) => {
    res.send("https 접속 성공!!");
    res.status(200).json({ message: "https access success" });
});

httpsServer.listen(app.get("port"), () => {
    console.log(`Port ${app.get("port")} is listening.`);
});

https://도메인.duckdns.org로 접속해서 https 접속 성공!! 이라는 글이 써진 페이지가 보이면 https 통신을 성공적으로 하는 것이다.

Comments