본문 바로가기
  • 냥냥냥
OS

4. HTTPS 인증서 및 도메인 연결

by 프로그래밍데 2025. 6. 20.

지난 번에 한 일 

https가 아닌 https로 연결한 걸 테스트 하는 이유로 

cloudflare의 프록시 설정을 잠깐 꺼두고

example:커스텀포트번호 로 요청해서 

 

ios로 접속 가능한 것 까지 했습니당.

 

오늘은 HTTPS 설정을 통해 

보안 설정 + nginx로 443 포트와 제 로컬 커스텀 포트를 연결해주는 작업에 대한 글을 작성하려고 합니당.

 

사실 이 과정은 HTTPS가 아니라 HTTP도 가능한데

저희집 와이파이 자체가 80포트는 지원을 안하더라구요?? 

 

관련해서 알아두실 점이

http://example.com 검색
=> http의 경우 자동으로 80포트로 전송
=> cloudflare에서 도메인의 ip:80포트를 우리집 공인 와이파이로 전송
=> 공인 와이파이에서 DNAT을 통해 이 80포트를 내부의 서버로 전달을 해야하는데

문제는 이 DNAT이었어요. 안되더라구요 ? 
80을 지원을 안해주더라구요 ㅋㅋㅋ (일 잘하네 . . )
그래서 어쩔 수 없이 443은 지원을 하길래 
HTTPS 설정을 먼저 해주기로 했습니당.

 

1. HTTPS (TLS 인증서) 하기 

이 HTTPS와 HTTP에 대한 차이를 여기서 많이 언급하기는 어렵고 

https://blog.naver.com/programming_my00/223719812000

 

3. HTTPS의 기본 개념과 심화 개념 + SSL 핸드셰이크

지난 포스팅에서는 HTTP의 심화 개념에 대해서 공부해봤어요 HTTP의 Keep-alive 속성이나, 비연결...

blog.naver.com

뭐 제 네이바 블로그 글에 요런요런 글을 작성을 해놨었기 때문에 다시 읽어보면서 리마인드 하겠습니당.

 

아무튼, 인증서를 만들어 줘야해요 

https://goldsony.tistory.com/223

 

SSL 사설 인증서 생성하기(feat, openssl)

#223 1. SSL(Secure Sockets Layer) 인증서란? 웹 서비스를 이용하는데 신원을 확인하고 암호화 통신을 하기위해 사용되는 디지털 인증서입니다. SSL 프로토콜을 사용하여 SSL 인증서로 불립니다. 서비스하

goldsony.tistory.com

=> 저는 기왕하는거 직접 인증서 만들어보는거 어떠냐는 어떠한 개발자의 자문에 의해 괜찮다는 생각이 들어

OpenSSL로 직접 만들었습니다 ㅎ;

보통 뭐 만들지 않으신다면

Let's Encrypt => 무료사이트라 인증된 사이트로 많이 쓰고 DigiCert 등등 인터넷에 많으니 인증서 발급을 잘 해보아욤 

 

아무튼 이렇게 만든 

인증서 키를 nginx로 HTTPS 적용 하면 되거든요 !!

 

2. Nginx에 HTTPS 적용

server {
    listen 443 ssl;
    server_name your.domain.com;

    ssl_certificate     [crt 파일 경로]
    ssl_certificate_key [인증키 경로]

    location / {
        proxy_pass http://localhost:[커스텀도메인]; # 내부 서비스
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

 

그리고 방화벽에서도 이제 443 포트를 열어주어야 해요 

sudo ufw allow 443

( ㅎ ; 블로그에 올렸다가 해킹당할까봐 무서워서 웬만한 거 다 안올리는데

  https가 443인건 뭐 모두가 다 아는 사실이니까 이 정돈 올려도 되겠죠 .. ) 

 

이쯤에서 흐름을 좀 보자면

 

1. 사용자가 https://example.com에 접속

브라우저가 URL을 입력하거나 클릭하면

어떤 일이 발생하냐면

 

example.com의 IP 주소를 찾기 위해 DNS 질의 발생

 

2. DNS 질의 → Cloudflare가 응답

  • 사용자의 PC가 example.com에 대해 Cloudflare 네임서버에 질의
    (그렇다 보니, 이 CloudFlare가 어떻게 보면 프록시 역할을 해주고 있는 거라고 볼 수 있져.'
    바로 저희집 공인 ip로 연결 안하니까 보안적으로 좋습니다)
  • Cloudflare가 DNS 응답:
    example.com → [저희집 공유기의 공인 IP]

 

3. 브라우저가 공인 IP로 HTTPS 요청 (443 포트)

  • 브라우저가 다음 요청을 보냄:
 
GET / HTTP/1.1 Host: example.com
GET / HTTP/1.1 Host: example.com
→ 대상: [공유기 공인 IP]:443
  • TLS Handshake도 포함돼 있음 

 

4. 공유기(라우터)가 요청을 받음

  • 공유기 NAT에서 포트포워딩(DNAT) 규칙 확인:
    외부 443 → 내부 192.168.0.10:443
  • 그래서 요청을 내부 서버로 전달함
외부 443 → 우분투 서버의 내부ip:443으로 (예를 들어192.168.0.10:443)

 

5. 내부 서버의 Nginx가 443 요청 수신

  • 서버에서는 Nginx가 443 포트를 listen 중
  • Nginx는 ssl_certificate로 인증서 사용해 TLS 핸드셰이크 완료
  • 클라이언트와 보안 연결 성립

 

6. Nginx가 내부 커스텀 포트로 프록시 요청

location / { proxy_pass http://localhost:9000; }
location / { proxy_pass http://localhost:9000; }
  • TLS 복호화된 후 HTTP 요청을 내부 앱으로 전달

 

7. 내부 앱이 응답 → 다시 브라우저까지 역방향으로 전송

  • 내부 앱이 HTTP 응답 → Nginx가 받아서
  • HTTPS로 다시 암호화 → 공유기 → 공인IP → 인터넷 → 클라이언트 브라우저

 

 

최종 요약 흐름도

[1] example.com 입력
 ↓
[2] Cloudflare DNS 응답: A → [공유기 공인 IP]
 ↓
[3] 브라우저: HTTPS 요청 (443) → 공유기 공인 IP
 ↓
[4] 공유기: 443 포트포워딩 → 내부 IP:443
 ↓
[5] Nginx(443): 인증서로 TLS 처리
 ↓
[6] Nginx → 내부 커스텀 포트 프록시
 ↓
[7] 앱 응답 → Nginx → 암호화 → 클라이언트로 응답
 

이렇게 됩니다. 

그 결과 

 

 

 

이런식으로

포트번호 없이 https://구입도메인 

으로 내부 우분투 서버에 띄운 프로그램을 ios 앱으로 접속할 수 있게 되었습니다 ㅎㅎㅎㅎㅎㅎㅎ티히키

최근댓글

최근글

skin by © 2024 ttuttak