🔐 starnuri.kr SSL 인증서 갱신 가이드

환경: Windows 미니 PC, Node.js + PM2, Let's Encrypt (90일)

최종 업데이트: 2026-08-18

⚡ 갱신 순서 (이것만 따라 하면 됨)

서버는 끄지 않습니다. 1~5단계는 사이트 켠 채로 진행하고, 6번(재시작)에서만 잠깐 멈춥니다. 관리자 PowerShell 사용.

  1. 관리자 PowerShell 열기
    시작 메뉴 → PowerShell → 우클릭 → 관리자 권한으로 실행
  2. Certbot 실행 (서버는 그대로 둠)
    & "C:\Program Files\Certbot\bin\certbot.exe" certonly --manual --preferred-challenges dns -d starnuri.kr
  3. 예스닉에 TXT 등록 (Enter 치지 말 것)
    네임서버 고급설정 → SPF(TXT) → 호스트 _acme-challenge → Certbot에 나온 value 전체 복사·붙여넣기 → 저장
    숫자 0 / 영문 O, 대문자 I / 소문자 l 을 헷갈리면 실패합니다. 터미널에서 직접 복사하세요.
  4. DNS 전파 확인 후 Enter
    Google DNS TXT 조회에서 data가 Certbot value와 완전히 같을 때만 PowerShell에서 Enter
    성공 문구: Successfully received certificate
  5. archive → ssl 복사 (live 폴더는 쓰지 말 것)
    탐색기에서 C:\Certbot\archive\starnuri.kr\가장 큰 번호 확인 (예: fullchain3.pem · privkey3.pem) 후, 번호를 바꿔 실행:
    Copy-Item -Force "C:\Certbot\archive\starnuri.kr\fullchain3.pem" "C:\server\nurisoft\ssl\starnuri.kr-chain.pem" Copy-Item -Force "C:\Certbot\archive\starnuri.kr\fullchain3.pem" "C:\server\nurisoft\ssl\starnuri.kr-crt.pem" Copy-Item -Force "C:\Certbot\archive\starnuri.kr\privkey3.pem" "C:\server\nurisoft\ssl\starnuri.kr-key.pem"
  6. 서버 재시작 (새 인증서를 메모리에 읽기)
    pm2 restart nurisoft-web
  7. 확인
    관리자 화면 SSL 만료일 ≈ 90일 뒤 · 시크릿 창에서 자물쇠 → 인증서 만료일 확인
    일반 크롬만 “주의 요함”이면 캐시일 수 있음 → 시크릿/Edge로 다시 확인 또는 SSL 상태 지우기
자주 하는 실수
📑 목차

1. 개요 및 인증서 만료 증상

Let's Encrypt 인증서는 90일(약 3개월)마다 갱신이 필요합니다. 만료 시 브라우저에서 "주의 요함" 경고가 표시됩니다.

서비스 정상 가동 중 인증서 갱신하기

사이트가 이미 HTTPS로 잘 떠 있는 상태에서 만료일만 다가온 경우, 서비스를 멈추지 않고 갱신하려면 아래 순서를 따르면 됩니다.

한 줄 요약: 상단 요약 목록 기준으로 4. Node 서버 재시작 이전의 1~3단계까지는 서버를 중지할 필요가 없습니다. (DNS 방식 기준)

  1. 웹서버는 그대로 둡니다. 방문자는 기존 인증서로 계속 접속합니다.
  2. 별도 관리자 PowerShell 창을 연 뒤(요약 0번), 상단 갱신 요약의 Certbot DNS 명령으로 인증을 진행합니다. (예스닉 TXT 등록·10분 대기·Enter는 요약 목록의 발급 단계와 동일.)
  3. Certbot에 Successfully received certificate 가 뜬 것을 확인한 뒤, C:\Certbot\archive\starnuri.kr\가장 최근 번호 fullchainN.pem · privkeyN.pemC:\server\nurisoft\ssl\ 규칙에 맞게 복사합니다. (live의 심볼릭 링크는 사용하지 않음 — 아래 5번 섹션 참고.)
  4. 이제만 Node 서버 콘솔에서 Ctrl+C로 종료한 뒤, 같은 방식으로 다시 실행합니다. 새 PEM이 로드되면 갱신된 인증서로 서비스가 이어집니다. (재시작에 걸리는 시간만큼만 접속이 끊길 수 있습니다.)
standalone을 쓰는 경우에는 Certbot이 잠시 80번 포트를 점유해야 하므로, 갱신 시도 전에 Node를 내리고 80번이 비었는지 확인해야 합니다. 집/회선에서 80번이 막혀 있으면 실패하기 쉬워, 운영 중에는 DNS 방식이 사실상 필수에 가깝습니다.

2. 실패 원인별 해결 방법

❌ 실패 1: "certbot은(는) 인식되지 않습니다"

원인: Certbot이 설치되지 않았거나, 환경 변수(Path)에 등록되지 않음.

해결:

❌ 실패 2: "No renewals were attempted"

원인: Certbot 재설치 등으로 기존 인증서 설정 파일(renewal config)이 유실됨.

해결: 갱신이 아닌 신규 발급으로 진행해야 함. (아래 DNS 방식 참고)

❌ 실패 3: "Timeout during connect (likely firewall problem)"

원인: Let's Encrypt 서버가 80번 포트로 접속하려 했으나 차단됨.

해결: 80번 포트 개방이 어렵다면 DNS 방식으로 우회 (포트 개방 불필요).

❌ 실패 4: 80번 포트 충돌 (서버를 껐는데도 실패)

원인: Node.js 서버가 HTTP → HTTPS 리다이렉트용 80번 포트를 함께 사용 중. 단순히 콘솔만 멈춘 것이 아니라 프로세스가 완전히 종료되지 않음.

해결:

❌ 실패 5: "Incorrect TXT record found" (DNS 방식 1차 실패)

원인: 예스닉에 TXT 레코드를 등록한 직후 즉시 Enter를 눌러, DNS 정보가 전 세계로 전파되기 전에 인증 시도함.

해결:

❌ 실패 6: 서버 재시작 후에도 "주의 요함"이 계속 뜸

원인: C:\Certbot\live\starnuri.kr\ 폴더의 fullchain.pem, privkey.pem심볼릭 링크(0KB)입니다. 이 파일들을 그대로 복사하면 실제 인증서 데이터가 포함되지 않아 서버가 만료된 인증서를 계속 사용합니다.

해결: C:\Certbot\archive\starnuri.kr\ 폴더의 실제 데이터가 있는 파일을 복사해야 합니다. (아래 5번 섹션 참고)

3. DNS 방식 인증서 발급 (권장)

80번 포트를 열 수 없는 환경에서 가장 확실한 방법입니다. Node 웹서버를 끌 필요도 없습니다. (이미 사이트가 떠 있는 상태에서 갱신하는 절차는 서비스 정상 가동 중 갱신하기 참고.)

3-1. Certbot DNS 방식 명령어

certbot certonly --manual --preferred-challenges dns -d starnuri.kr

3-2. 이메일 주소 입력

질문: 예스닉에 등록된 메일이어야 하나?

답: 아니요. 실제로 사용 중인 개인 이메일(네이버, Gmail 등)을 입력하면 됩니다. Let's Encrypt에서 인증서 만료 알림을 보내는 용도입니다.

3-3. 예스닉(Yesnic) DNS 설정

  1. 예스닉 로그인 → [도메인 관리][네임서버 고급설정]
  2. [SPF(TXT) 레코드 관리] 옆 [관리화면 열기 ▼] 클릭
  3. 입력 정보:
  4. [다음 단계로] → 고객 확인사항 체크 → [신청하기] 클릭
  5. 등록완료 메시지 확인
⚠️ 중요: Enter 치기 전 대기
예스닉 [신청하기] 완료 후 최소 10분 대기해야 합니다. DNS 전파 시간이 필요합니다. 너무 빨리 Enter를 누르면 "Incorrect TXT record found"로 실패합니다.

3-4. 재시도 시 새로운 값이 나온 경우

명령어를 다시 실행하면 새로운 암호 값이 발행될 수 있습니다. 이 경우:

4. 갱신 시도 히스토리

단계 시도 내용 결과 이유 및 조치 사항
1단계 Certbot 기본 갱신 (certbot renew) 실패 프로그램 미설치/환경변수 미등록, 기존 설정 유실 → Certbot 재설치 및 신규 발급 필요
2단계 Standalone 방식 (certbot certonly --standalone -d starnuri.kr) 실패 Timeout: 80번 포트를 외부에서 접근 불가(공유기/방화벽). Node.js HTTP 리다이렉트 서버가 80번 포트 점유 중이었음 → 완전 종료 후에도 80번 포트 외부 차단으로 실패
3단계 DNS 인증 방식 (1차) 실패 TXT 레코드(BpSbN3Il...) 등록 후 즉시 Enter → DNS 전파 시간 부족 → "Incorrect TXT record found"
4단계 DNS 인증 방식 (2차) 성공 새로운 값(5BwgpXrX...) 예스닉 등록 완료 → 10분 대기 → Enter → 인증 성공

5. 성공 후 파일 교체 및 서버 재시작

인증 성공 시 "Successfully received certificate" 메시지가 표시됩니다.

⚠️ 심볼릭 링크 주의
C:\Certbot\live\starnuri.kr\ 폴더의 파일은 심볼릭 링크(0KB)이므로 복사하면 안 됩니다. 반드시 아래 archive 폴더의 실제 파일을 사용하세요.
📌 최종 마무리 절차

파일을 복사하고 서버를 재시작했는데도 "주의 요함"이 사라지지 않는다면, 심볼릭 링크(0KB) 파일을 복사했을 가능성이 높습니다.

해결: C:\Certbot\archive\starnuri.kr\ 폴더의 fullchain1.pem, privkey1.pem을 사용하여 위 5번 절차를 다시 수행하세요.

7. 브라우저별 표시 차이 (크롬 캐시)

증상: 엣지(Edge)에서는 자물쇠가 정상 표시되는데, 크롬에서만 "주의 요함"이 계속 뜸.

원인: 크롬이 이전 만료된 인증서 정보를 캐시에 저장해 두고 새로 요청하지 않음.

해결 방법 (순서대로 시도):

엣지에서 정상 표시된다면 서버 설정과 인증서 교체는 성공한 것이므로, 크롬 캐시만 초기화하면 됩니다.

8. 자동/반자동 갱신

DNS 방식(manual)으로 발급받은 경우, 예스닉에 직접 TXT 값을 입력해야 하므로 100% 완전 자동 갱신은 어렵습니다. 하지만 환경에 따라 자동화 수준을 높일 수 있습니다.

8-1. 80번 포트를 열 수 있는 경우 (완전 자동화)

공유기와 방화벽에서 80번 포트를 개방할 수 있다면, Windows 작업 스케줄러에 등록하여 3개월마다 자동 갱신할 수 있습니다.

certbot renew --pre-hook "taskkill /f /im node.exe" --post-hook "cd C:\server\nurisoft && node app.js"

작업 스케줄러에서 매월 1일 새벽 등으로 실행 주기를 설정하면, 3개월마다 자동으로 인증서를 갱신합니다. 단, 갱신 후 파일 복사(5번 절차)가 필요할 수 있으므로 post-hook에 복사 스크립트를 추가하는 것이 좋습니다.

8-2. DNS 방식을 써야 하는 경우 (반자동화)

80번 포트를 열기 어려운 현재 환경에서는 다음 방법을 활용하세요.

renew_ssl.bat 예시:

@echo off certbot certonly --manual --preferred-challenges dns -d starnuri.kr pause

C:\server\nurisoft\renew_ssl.bat 등으로 저장 후, 3개월 뒤 이 파일을 관리자 권한으로 실행하면 예스닉에 넣을 값 확인 단계로 바로 넘어갑니다.

💡 갱신 주기 및 알림
Let's Encrypt 인증서는 90일마다 갱신이 필요합니다. 만료 2주 전(예: 5월 중순)에 구글 캘린더나 미리 알림에 등록해 두면 놓치지 않고 갱신할 수 있습니다. 이 문서를 3개월마다 참고하세요.