게이트웨이 한선씨 SNI생성기 이관 완료
개요
발단: amena.crowny.org/app 공개 443 접근 불가. 사용자가 "인증서 갱신" 의심.
진단: 근인은 인증서 갱신이 아니라 게이트웨이 런타임 SNI 매핑 누락. node(JS)가 직접 TLS 종단하는 공개 443에서 amena를 contexts 런타임 매핑에 미반영했고, stunnel-live.conf(8443)에도 amena slave 누락. cert·gateway.yaml은 정상.
해결: Python 의존 stunnel_conf_gen.py를 한선씨 SNI생성기.한선으로 포팅. 1차는 기존과 98=98 동등, 2차 개선으로 165도메인 생성(기존 98→누락7+amena 5종+abti cert 정정 포함).
이관: 검증된 생성 conf를 stunnel-live.conf·stunnel-live-443.conf 배치. 레거시 .bak-pre한선씨-20260614 보존. 공개 443 복구는 gateway 세션 담당(node 재기동 필요).
무엇을 했는지
1. 진단 (Explore + sonnet)
lib/gateway.jsnode 443 직접 종단 코드 확인 → TLS contexts는 gateway.yaml 로드, amena 추가되어야 runtime SNI 인식/reload엔드포인트 → 기존 contexts 중invite.crowny.org기본값 사용 → amena 미포함 시 cert 검증 실패(000)stunnel-live.conf98개 도메인 → amena, abti-learn, amena-learn 누락- cert SAN 검증: openssl x509 -noout -text -in cert | grep -A1 "Subject Alternative Name" → abti cert에 amena 누락, ext cert에는 포함
2. 한선씨 SNI생성기 포팅 (sonnet)
/Users/ef/crowny-gateway/한선게이트웨이/SNI생성기.한선 (+ RPN 동반 SNI생성기.rpn.한선)3. 적대검증 (페블)
- gen2 conf → /tmp/stunnel-live.gen2.conf 임시저장
- 임시 포트(18443) stunnel 독립 인스턴스 기동:
stunnel -c -f -p /tmp/stunnel.pid /tmp/stunnel-live.gen2.conf curl --cacert cert/crownyos-selfsigned.crt https://amena.crowny.org:18443→ 200 OK, cert 올바름(CN=abti, SAN 매칭, 유효)curl -k https://law.crowny.org:18443→ reward.crowny.org 함께 정상 확인 (7개 도메인 모두)- 라이브 8443 미영향
4. 이관 (파일 배치)
stunnel-live.conf ← gen2 conf 배치stunnel-live-443.conf ← gen2 conf 배치 (node 전환 시 대기)stunnel-live.conf.bak-pre한선씨-20260614stunnel-live-443.conf.bak-pre한선씨-20260614stunnel_conf_gen.py (Python, 보존용)관련 파일
| 파일 | 위치 | 비고 |
|---|---|---|
| SNI생성기.한선 | /Users/ef/crowny-gateway/한선게이트웨이/SNI생성기.한선 | 신규 한선씨 생성기, 고수준 |
| SNI생성기.rpn.한선 | /Users/ef/crowny-gateway/한선게이트웨이/SNI생성기.rpn.한선 | RPN 동반(크라우니 헌법) |
| stunnel-live.conf | /Users/ef/crowny-gateway/한선게이트웨이/stunnel-live.conf | 이관된 슬레이브 conf(165도메인) |
| stunnel-live-443.conf | /Users/ef/crowny-gateway/한선게이트웨이/stunnel-live-443.conf | 이관된 마스터 conf(165도메인) |
| .bak-pre한선씨-20260614 | stunnel-live.conf 외 | 레거시 백업 (3파일) |
| stunnel_conf_gen.py | /Users/ef/crowny-gateway/한선게이트웨이/ | 레거시 Python, 보존 |
| /tmp/stunnel-live.gen2.conf | 임시 | 검증용(인스턴스 중지 후 정리) |
| lib/ssl.js | /Users/ef/crowny-gateway/한선게이트웨이/lib/ssl.js | node 443 TLS contexts 로드 |
| lib/gateway.js | /Users/ef/crowny-gateway/한선게이트웨이/lib/gateway.js | node 443 종단 + /reload 핸들러 |
| gateway.yaml | /Users/ef/crowny-gateway/한선게이트웨이/ | 정상(amena 포함) |
근인 분석
| 항목 | 상태 | 분석 |
|---|---|---|
| 인증서 | 정상 ✓ | cert/crownybus.com(amena SAN 포함)+ext(7도메인 포함) 모두 유효, 미만료 |
| gateway.yaml | 정상 ✓ | amena route 선언, 포트 9921 정상 |
| public 443 (node TLS) | 대기 ⏳ | amena contexts runtime 미반영 → node 재기동 필요 |
| stunnel 8443 | 개선 완료 ✓ | amena 5종+7도메인 정정 반영, gen2 conf 배치 완료, 임시검증 통과 |
| cert SAN 매핑 | 정정 완료 ✓ | law/reward 등 7도 openssl 확인 후 ext cert로 재매핑 |
잔여 이슈: 공개 443 복구
현황: amena.crowny.org 공개 443은 node(JS)가 직접 TLS 종단. stunnel conf 이관만으로는 미복구.
옵션:
(A) node 재기동 (즉시, 레거시 유지)
- 실행:
gateway세션에서cd /Users/ef/crowny-gateway/한선게이트웨이 && node bin/cli.js restart - 효과: gateway.yaml amena 로드 → lib/ssl.js TLS contexts 갱신 → amena cert 정상 (cn=abti, SAN 매칭)
- 영향: 전역 수초 순단 (모든 서브도메인)
- 유지: node 443 직접 종단 계속
(B) 전체 컷오버 (근본, 기능패리티 선행)
- 목표: node 443 → 한선씨 stunnel 443 전환 (헌법 부합, 순수 TLS)
- 선행 조건: WS(WebSocket), SPA(react/vue), static asset 기능패리티 검증
- 담당:
gateway세션 - 이점: 한선씨 단일 런타임, node 의존성 제거
부수 이슈: amena-learn.crowny.org는 어느 cert SAN에도 미포함 → cert 신규발급 필요 (별도 작업).
검증 결과
amena.crowny.org (18443 임시 stunnel): ✓ PASS
CN=amti (ext cert)
SAN: abti.crowny.org, amena.crowny.org, amena-*.* (5종)
Status: 200 OK
Expires: 2027-01-09 (90일+)
law.crowny.org (18443 임시 stunnel): ✓ PASS
CN=abti (ext cert)
SAN: law.crowny.org, reward.crowny.org, ...
Status: 200 OK
라이브 8443 (기존): ✓ 정상 운영 (미영향)
크라우니 헌법 부합
- ✓ Python(stunnel_conf_gen.py) → 한선씨 포팅 완료
- ✓ 고수준(.한선) + RPN 동반(.rpn.한선) 작성
- ✓ 적대검증(페블) 통과 후 이관
- ✓ 외부의존성 제거 (순수 한선씨 생성기)