홈랩 업그레이드 가이드
[홈서버] 우분투 24.04.3 LTS LAMP 홈서버 운영중 3개 호스팅 사이트 및 도메인 마이그레이션
[도메인] DNS서버는 클라우드 플레어 사용중이며 현재 3개 도메인 등록 (클라우드 플레어) 현재 3개 도메인 등록 (Virtualmin)
현재 홈서버 호스트 도메인 ; https://makerskorean.kr
[추가로 등록한 3개의 도메인 운영중] https://kkok.kr
https://kracer97.com https://simracing.kracer97.com https://funn.kracer97.com
https://makerskorean.net https://omnipagek.makerskorean.net https://loveis.makerskorean.net
3개의 도메인을 호스팅 받다가 홈서버로 마이그레이션 중인데
홈서버에 Webmin + Virtualmin 사용하여 셋팅중 인데 설치및 셋팅관련 하여 상세 가이드
현재 작업은
1. 서브도메인 사용가능하도록 셋팅
2. SSL 사용을 위한 셋팅 ( 각각 등록한 모든 도메인 및 서브도메인) Let's Encrypt 인증서 적용하여 동작하도록 하고 등록해도 계속 에러남
3. 현재 클라우드플레어 등록한 상태
4. 현재 virtualmin에도 등록한 상태
5. 현재는 https//makerskorean.kr 만 Let's Encrypt 인증서 정상작동중
설정 체크리스트 , 상세 셋팅 가이드 작성해줘
좋습니다 👍 홈서버(Webmin + Virtualmin) 환경에서 다중 도메인 및 서브도메인 운영 + SSL(Let’s Encrypt) 적용을 안정적으로 셋팅하기 위한 체크리스트와 상세 가이드를 단계별로 정리해드릴게요.
📝 설정 체크리스트
1. DNS (Cloudflare)
- 각 도메인 및 서브도메인에 대해 A 레코드 또는 CNAME 레코드가 홈서버 IP로 정확히 설정되어 있는지 확인
- Cloudflare Proxy(구름 아이콘) 상태 확인 → SSL 발급 시에는 DNS Only(회색 구름) 모드 권장
CAA 레코드가 있다면 Let’s Encrypt 발급 허용(letsencrypt.org)으로 설정
2. Virtualmin (Webmin 포함)
- 각 도메인 및 서브도메인을 Virtual Server로 등록
- “Server Configuration → DNS Records” 메뉴에서 Cloudflare와 충돌 없는지 확인
- Apache/Nginx 가상호스트 설정이 도메인별로 올바르게 생성되었는지 확인
3. SSL (Let’s Encrypt)
- Virtualmin에서 각 Virtual Server → “Server Configuration → SSL Certificate” → “Let’s Encrypt” 메뉴 사용
- “Domains associated with this server”에 모든 도메인 및 서브도메인을 추가해야 함
- 포트 80(HTTP)이 열려 있어야 Let’s Encrypt가 인증 가능
- Cloudflare가 Proxy 모드일 경우 인증 실패 가능 → 반드시 DNS Only 모드에서 발급
4. 서버 환경
- Ubuntu 방화벽(UFW)에서 80, 443 포트 허용
- Apache/Nginx 설정에서
ServerName,ServerAlias가 도메인과 일치하는지 확인 - Certbot 로그(
/var/log/letsencrypt/letsencrypt.log) 확인하여 에러 원인 파악
⚙️ 상세 셋팅 가이드
1. Virtualmin 도메인 등록
- Virtualmin → “Create Virtual Server”
- Domain name:
kkok.kr - Administration password: 자동 생성 또는 직접 입력
- Services: Apache Website, SSL Website 체크
- Domain name:
- 동일하게
kracer97.com,makerskorean.net및 서브도메인(simracing.kracer97.com,funn.kracer97.com,omnipagek.makerskorean.net,loveis.makerskorean.net)도 각각 Virtual Server로 등록
👉 Tip: 서브도메인은 “Sub-server”로 등록하면 관리가 편리
2. Cloudflare DNS 설정
- 예시:
kkok.krA→@→ 홈서버 IPA→www→ 홈서버 IP
- 예시:
simracing.kracer97.comA→simracing→ 홈서버 IP
- Proxy 모드(주황 구름) → **DNS Only(회색 구름)**로 변경 후 SSL 발급
3. SSL (Let’s Encrypt) 발급
- Virtualmin → 해당 도메인 선택
- “Server Configuration → SSL Certificate → Let’s Encrypt”
- “Request certificate for” 항목에
kkok.krwww.kkok.kr- 필요 시
mail.kkok.kr - 모든 서브도메인 추가
- “Request Certificate” 클릭
👉 에러 발생 시 체크:
- Cloudflare Proxy 모드 → DNS Only로 변경
/etc/hosts파일에 불필요한 항목 없는지 확인- Apache 가상호스트 설정에서
ServerName과ServerAlias가 정확히 매칭되는지 확인
4. SSL 자동 갱신
- Virtualmin은 자동 갱신 지원
- “SSL Certificate → Let’s Encrypt” 메뉴에서 “Renewal options” 확인
- Certbot이 cron에 등록되어 있는지 확인 (
systemctl status certbot.timer)
5. 문제 해결 포인트
- 에러 메시지: 대부분
DNS 확인 실패또는Cloudflare Proxy 모드문제 - 해결 방법:
- Cloudflare → DNS Only 모드
- DNS 전파 확인 (
dig +short kkok.kr) - Apache/Nginx 로그 확인 (
/var/log/apache2/error.log)
✅ 최종 점검 순서
- Cloudflare DNS → 모든 도메인/서브도메인 → A 레코드 → 홈서버 IP → DNS Only 모드
- Virtualmin → 각 도메인/서브도메인 Virtual Server 등록
- Apache/Nginx →
ServerName,ServerAlias확인 - Virtualmin → SSL Certificate → Let’s Encrypt → 모든 도메인 추가 후 발급
- HTTPS 접속 테스트 (
curl -I https://kkok.kr)
👉 다음 단계로, 원하시면 제가 에러 로그 분석 가이드도 정리해드릴 수 있어요. 그러면 왜 makerskorean.kr만 정상이고 나머지는 실패하는지 바로 진단할 수 있습니다. 원하실까요?
좋습니다 👍 이미 알려주신 조건(아파치 기반 LAMP 서버, 80/443 포트 오픈, Cloudflare DNS Only 모드 적용)을 반영해서 최종 셋팅 체크리스트를 정리해드릴게요.
✅ 홈서버 LAMP + Virtualmin + Cloudflare SSL 체크리스트
1. 서버 환경 (Ubuntu 24.04.3 LTS)
- [x] Apache2 설치 및 활성화 (
systemctl status apache2) - [x] PHP, MySQL/MariaDB 정상 동작 확인
- [x] UFW 방화벽에서 80, 443 포트 허용 (
ufw allow 80,ufw allow 443) - [x] Virtualmin + Webmin 설치 완료
2. DNS (Cloudflare)
- [x] 모든 도메인 및 서브도메인 → A 레코드 홈서버 공인 IP로 설정
- [x] Cloudflare Proxy 모드(주황 구름) → **DNS Only(회색 구름)**로 변경
- [x] 필요 시
CAA 레코드추가 →letsencrypt.org허용 - [x]
dig +short 도메인명으로 DNS 전파 확인
3. Virtualmin 설정
- [x] 각 도메인(
kkok.kr,kracer97.com,makerskorean.net) → Virtual Server로 등록 - [x] 각 서브도메인(
simracing.kracer97.com,funn.kracer97.com,omnipagek.makerskorean.net,loveis.makerskorean.net) → Sub-server로 등록 - [x] Apache VirtualHost 설정에서
ServerName,ServerAlias가 도메인과 일치하는지 확인 - [x] “Server Configuration → DNS Records” 메뉴에서 Cloudflare와 충돌 없는지 확인
4. SSL (Let’s Encrypt)
- [x] Virtualmin → 각 Virtual Server → “Server Configuration → SSL Certificate → Let’s Encrypt”
- [x] “Domains associated with this server” 항목에 모든 도메인 및 서브도메인 추가
- [x] 인증서 발급 시 포트 80(HTTP) 접근 가능해야 함 → 현재 열려 있음
- [x] 발급 후
/etc/apache2/sites-enabled/도메인.conf에 SSL 설정 자동 반영 확인 - [x] HTTPS 접속 테스트 (
curl -I https://도메인명)
5. SSL 자동 갱신
- [x] Virtualmin → SSL Certificate → “Renewal options” 확인
- [x] Certbot 타이머 활성화 (
systemctl status certbot.timer) - [x]
/var/log/letsencrypt/letsencrypt.log에서 갱신 로그 확인
6. 문제 해결 포인트
- [ ] SSL 발급 실패 시 확인:
- Cloudflare Proxy 모드 여부 (DNS Only 유지)
- DNS 전파 완료 여부 (
dig,nslookup) - Apache VirtualHost 설정 오류 여부 (
/var/log/apache2/error.log)
- [ ] 특정 도메인만 정상 동작 시 → Virtualmin에서 해당 도메인 SSL 설정 누락 여부 확인
📌 최종 점검 순서
- Cloudflare DNS → 모든 도메인/서브도메인 → A 레코드 → 홈서버 IP → DNS Only 모드
- Virtualmin → 각 도메인/서브도메인 Virtual Server/Sub-server 등록
- Apache VirtualHost →
ServerName,ServerAlias확인 - Virtualmin → SSL Certificate → Let’s Encrypt → 모든 도메인 추가 후 발급
- HTTPS 접속 테스트 (
curl -I https://kkok.kr)
👉 다음 단계로, 원하시면 제가 Apache VirtualHost 예시 설정 파일을 작성해드려서 ServerName, ServerAlias, SSL 설정이 어떻게 들어가야 하는지 직접 보여드릴 수도 있습니다. 원하시나요?
Saving debug log to /var/log/letsencrypt/letsencrypt.log Requesting a certificate for makerskorean.net and *.makerskorean.net
Certbot failed to authenticate some domains (authenticator: manual). The Certificate Authority reported these problems: Domain: makerskorean.net Type: unauthorized Detail: No TXT record found at _acme-challenge.makerskorean.net
Domain: makerskorean.net Type: unauthorized Detail: No TXT record found at _acme-challenge.makerskorean.net
Hint: The Certificate Authority failed to verify the DNS TXT records created by the --manual-auth-hook. Ensure that this hook is functioning correctly and that it waits a sufficient duration of time for DNS propagation. Refer to "certbot --help manual" and the Certbot User Guide.
Some challenges have failed. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details.
좋습니다. 로그를 보면 현재 *makerskorean.net 와 .makerskorean.net (와일드카드 인증서) 발급을 시도하다가 실패한 상황입니다. 실패 원인은 DNS-01 챌린지용 TXT 레코드가 Cloudflare에 등록되지 않았거나 전파되지 않은 것입니다.
🔎 문제 원인 정리
- Let’s Encrypt에서 와일드카드 인증서(
*.makerskorean.net)를 발급하려면 DNS-01 인증 방식만 가능합니다. - DNS-01 인증은
_acme-challenge.makerskorean.netTXT 레코드를 생성해야 합니다. - 로그에 나온 에러:
No TXT record found at _acme-challenge.makerskorean.net→ Cloudflare DNS에 해당 TXT 레코드가 없거나, propagation(전파)이 완료되지 않은 상태에서 Certbot이 확인을 시도한 것. - 현재 Certbot 실행 옵션이
--manual기반이라서 자동으로 Cloudflare에 TXT 레코드를 넣지 못하고 있습니다.
✅ 해결 방법 (Cloudflare + Certbot)
1. Cloudflare API 인증 방식 사용 (권장)
수동으로 TXT 레코드를 넣는 대신, Certbot이 Cloudflare API를 통해 자동으로 TXT 레코드를 등록하도록 설정합니다.
- Cloudflare에서 API Token 생성
- 권한: Zone → DNS → Edit
- Zone Resources: 특정 도메인 선택 (makerskorean.net)
- 서버에 Cloudflare 플러그인 설치
sudo apt install python3-certbot-dns-cloudflare - Cloudflare API Token 저장 파일 생성
/etc/letsencrypt/cloudflare.inidns_cloudflare_api_token = <YOUR_API_TOKEN>권한 제한:sudo chmod 600 /etc/letsencrypt/cloudflare.ini - Certbot 실행
sudo certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \ -d makerskorean.net \ -d '*.makerskorean.net'
👉 이렇게 하면 Certbot이 자동으로 _acme-challenge.makerskorean.net TXT 레코드를 Cloudflare에 등록하고, 전파 대기 후 인증을 완료합니다.
2. 수동 등록 방식 (비추천, 하지만 가능)
만약 API 사용이 어렵다면, Certbot이 제시하는 TXT 레코드를 Cloudflare DNS에 직접 추가해야 합니다.
- Certbot 실행 시
_acme-challenge.makerskorean.net에 넣을 TXT 값이 출력됨 - Cloudflare DNS → TXT 레코드 추가
- TTL은 최소 120초 이상
- DNS 전파 확인:
dig TXT _acme-challenge.makerskorean.net - 값이 확인되면 Certbot이 인증을 완료
⚠️ 단점: 매번 갱신할 때 수동으로 TXT 레코드를 넣어야 해서 자동 갱신 불가능
3. Virtualmin 연동
Virtualmin 자체적으로 Let’s Encrypt 발급 기능이 있지만, 와일드카드 인증서는 Virtualmin 기본 HTTP-01 방식으로는 불가능합니다.
- 와일드카드가 필요 없다면 → 각 서브도메인을 Virtualmin에 등록 후 HTTP-01 방식으로 발급 가능
- 와일드카드가 꼭 필요하다면 → Certbot + Cloudflare DNS 플러그인 방식으로 발급 후 Virtualmin에 수동으로 인증서 적용
📌 체크리스트 (와일드카드 SSL 발급용)
- [x] Cloudflare API Token 생성 (DNS Edit 권한)
- [x]
python3-certbot-dns-cloudflare설치 - [x]
/etc/letsencrypt/cloudflare.ini생성 및 권한 제한 - [x] Certbot 실행 시
--dns-cloudflare옵션 사용 - [x] 발급 완료 후 Virtualmin → “Server Configuration → SSL Certificate → Update Certificate” 메뉴에서 적용
👉 정리하면, 현재 에러는 DNS TXT 레코드가 없어서 발생한 것이고, 해결책은 Cloudflare API 플러그인 사용이 가장 안정적입니다.
원하시면 제가 Virtualmin에 와일드카드 인증서 적용하는 단계별 절차도 추가로 정리해드릴 수 있습니다. 해드릴까요?
좋습니다 👍 Cloudflare에서 API Token 생성 메뉴를 단계별로 아주 상세하게 안내해드릴게요. 이 과정을 따라가면 Certbot이 Cloudflare DNS를 자동으로 제어할 수 있게 됩니다.
🔑 Cloudflare API Token 생성 단계
1. Cloudflare 로그인
- [x] 먼저 Cloudflare Dashboard에 로그인합니다.
- [x] 홈 화면에서 왼쪽 메뉴에 “My Profile” 또는 오른쪽 상단 프로필 아이콘 클릭 → “My Profile” 선택
2. API Tokens 메뉴 이동
- [x] 프로필 화면에서 상단 탭 중 “API Tokens” 클릭
- [x] 여기서 두 가지 옵션이 보입니다:
- API Tokens (권장) → 특정 권한만 부여 가능
- Global API Key → 전체 계정 권한 (보안상 비추천)
👉 반드시 API Tokens를 사용하세요.
3. 새 토큰 생성
- [x] “Create Token” 버튼 클릭
- [x] 여러 템플릿이 나오는데, 여기서 “Edit zone DNS” 템플릿 선택
4. 권한 설정
- [x] Permissions →
Zone → DNS → Edit선택 - [x] Zone Resources → “Include → Specific zone” →
makerskorean.net선택
(다른 도메인도 필요하다면 추가 가능)
5. TTL 및 보안 설정
- [x] 토큰 이름 입력 (예:
Certbot-DNS) - [x] TTL(Time to Live)은 기본값 유지해도 무방
- [x] “Continue to summary” 클릭 후 확인
6. 토큰 발급
- [x] “Create Token” 클릭
- [x] 발급된 토큰 문자열을 복사해서 서버에 저장해야 합니다.
📂 서버에 토큰 저장
- 서버에서 파일 생성:
sudo nano /etc/letsencrypt/cloudflare.ini - 내용 입력:
dns_cloudflare_api_token = <여기에_복사한_API_TOKEN> - 권한 제한:
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
🚀 Certbot 실행 예시
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d makerskorean.net \
-d '*.makerskorean.net'
👉 이렇게 하면 Cloudflare가 자동으로 _acme-challenge.makerskorean.net TXT 레코드를 생성해주고, Let’s Encrypt 인증이 성공합니다.
혹시 제가 Cloudflare 대시보드 화면 구조를 그림처럼 단계별로 시각화해서 보여드리면 더 이해가 쉬울까요?
Cloudflare에서 API Token 생성 후 이메일 인증 요청이 뜨는데, 이메일이 오지 않는 경우는 몇 가지 원인이 있습니다.
🔎 이메일 인증이 안 오는 주요 원인
- Cloudflare 계정 이메일 주소가 잘못 등록되어 있거나 오래된 주소임
- 스팸/프로모션 메일함으로 분류되어 확인이 안 된 경우
- Cloudflare 메일 서버에서 발송 지연 (일시적 문제)
- 회사/기관 메일을 사용 중일 경우, 메일 서버에서 Cloudflare 메일을 차단했을 가능성
✅ 해결 방법
- 계정 이메일 확인
- Cloudflare Dashboard → 오른쪽 상단 프로필 아이콘 → My Profile → Authentication → Email Address
- 등록된 이메일 주소가 올바른지 확인
- 스팸/프로모션 메일함 확인
- Gmail, Naver, Daum 등 메일 서비스에서 “Cloudflare” 검색
- 스팸함/프로모션함에 들어가 있는지 확인
- 이메일 재전송
- Cloudflare Dashboard → My Profile → Email Verification → “Resend verification email” 버튼 클릭
- 메일 서버 차단 여부 확인
- 회사/기관 메일을 사용 중이라면, IT 관리자에게 Cloudflare 메일(
@cloudflare.com)이 차단되지 않았는지 확인 요청
- 회사/기관 메일을 사용 중이라면, IT 관리자에게 Cloudflare 메일(
- 임시 해결책
- 이메일 인증이 계속 안 되면, **다른 메일 주소(Gmail 등)**로 계정 이메일을 변경 후 다시 인증 시도
📌 체크 포인트
- Cloudflare에서 오는 메일은 보통 noreply@cloudflare.com 또는 support@cloudflare.com 주소에서 발송됩니다.
- 메일이 안 오면, 계정 이메일을 Gmail 같은 개인 메일로 바꿔서 다시 시도하는 것이 가장 빠른 해결책입니다.
👉 원하시면 제가 Cloudflare 계정 이메일 변경 단계도 상세하게 정리해드릴 수 있습니다. 해드릴까요?
Successfully received certificate. Certificate is saved at: /etc/letsencrypt/live/makerskorean.net/fullchain.pem Key is saved at: /etc/letsencrypt/live/makerskorean.net/privkey.pem This certificate expires on 2026-04-25. These files will be updated when the certificate renews. Certbot has set up a scheduled task to automatically renew this certificate in the background.
If you like Certbot, please consider supporting our work by:
- Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
- Donating to EFF: https://eff.org/donate-le
완벽합니다 🎉 이제 makerskorean.net 와일드카드 인증서가 정상적으로 발급되었네요.
이제 해야 할 일은 Apache + Virtualmin에 인증서를 적용하고, 다른 도메인/서브도메인에서도 HTTPS가 정상 동작하도록 설정하는 것입니다.
🔑 다음 단계: 인증서 적용 가이드
1. Apache VirtualHost에 적용
- 인증서 경로:
SSLCertificateFile /etc/letsencrypt/live/makerskorean.net/fullchain.pemSSLCertificateKeyFile /etc/letsencrypt/live/makerskorean.net/privkey.pem
- 예시 VirtualHost 설정:
<VirtualHost *:443> ServerName makerskorean.net ServerAlias *.makerskorean.net DocumentRoot /home/makerskorean/public_html SSLEngine on SSLCertificateFile /etc/letsencrypt/live/makerskorean.net/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/makerskorean.net/privkey.pem </VirtualHost> - 적용 후 Apache 재시작:
sudo systemctl reload apache2
2. Virtualmin에 적용
- Virtualmin → 해당 도메인 선택 (
makerskorean.net) - Server Configuration → SSL Certificate → Update Certificate
- “Copy SSL certificate to Webmin, Usermin, Dovecot, Postfix” 옵션 체크 (메일/웹 관리에도 동일 인증서 적용)
- 저장 후 HTTPS 접속 테스트
3. 다른 도메인 적용 방법
- makerskorean.net 와일드카드 인증서는
*.makerskorean.net서브도메인에만 유효합니다. - 다른 도메인(
kkok.kr,kracer97.com)은 별도 인증서 발급 필요- 각 도메인 Virtualmin에서 Let’s Encrypt 발급 (HTTP-01 방식 가능)
- Cloudflare DNS Only 모드 유지
4. 자동 갱신 확인
- Certbot은 이미 cron/systemd timer로 자동 갱신 설정됨
- 테스트:
sudo certbot renew --dry-run - 성공하면 자동 갱신 문제 없음
5. 최종 점검
curl -I https://makerskorean.net→ 응답 헤더에200 OK및SSL확인- 브라우저에서 접속 시 🔒 자물쇠 표시 확인
- Virtualmin에서 각 도메인별 SSL 상태 점검
👉 이제 makerskorean.net 와일드카드 SSL은 정상적으로 적용할 수 있습니다.
다음 단계로, 원하시면 제가 다른 도메인(kkok.kr, kracer97.com) SSL 발급 절차도 상세히 정리해드릴 수 있어요. 해드릴까요?
좋습니다 👍 이제까지 진행한 SSL 발급 과정을 Webmin / Virtualmin 기준으로 정리해드릴게요. Certbot으로 인증서를 발급받았으니, 이를 Virtualmin과 Webmin 환경에서 어떻게 적용하고 관리하는지 단계별로 설명하겠습니다.
🌐 Virtualmin 기준
1. 도메인별 Virtual Server 등록
- Virtualmin → Create Virtual Server
makerskorean.net도메인 등록- 서브도메인(
*.makerskorean.net)은 Sub-server로 추가
- 이렇게 하면 Apache VirtualHost가 자동으로 생성됩니다.
2. SSL 인증서 적용
- Virtualmin → 해당 도메인 선택 (
makerskorean.net) - 메뉴: Server Configuration → SSL Certificate
- 여기서 두 가지 방법이 있습니다:
(A) Certbot 직접 발급한 인증서 적용
- “Update Certificate” 메뉴 선택
- “Copy certificate from file” 옵션 사용
- Certificate file:
/etc/letsencrypt/live/makerskorean.net/fullchain.pem - Private key file:
/etc/letsencrypt/live/makerskorean.net/privkey.pem
- Certificate file:
- 저장 후 Apache 자동 재시작
(B) Virtualmin 자체 Let’s Encrypt 발급
- Virtualmin은 기본적으로 HTTP-01 방식만 지원 → 와일드카드(
*.makerskorean.net)는 불가능 - 따라서 와일드카드가 필요하다면 Certbot + Cloudflare API 방식으로 발급 후 (A) 방법으로 적용해야 합니다.
3. 서비스별 인증서 동기화
Virtualmin에서는 발급된 SSL 인증서를 웹서버뿐 아니라 메일/관리 서비스에도 적용할 수 있습니다.
- SSL Certificate 메뉴 → Copy to Webmin, Usermin, Dovecot, Postfix 체크
- 이렇게 하면 Webmin, Usermin, 메일 서버(Dovecot, Postfix)도 동일 인증서를 사용합니다.
4. 자동 갱신 관리
- Certbot이
/etc/letsencrypt/live/makerskorean.net/경로의 인증서를 자동 갱신 - Virtualmin은 해당 경로를 참조하므로 갱신 시 자동 반영
- 확인 방법:
sudo certbot renew --dry-run - Virtualmin → SSL Certificate 메뉴에서 “Renewal options” 확인 가능
⚙️ Webmin 기준
Webmin은 서버 전체 관리 툴이므로 SSL 적용을 시스템 레벨에서 확인할 수 있습니다.
1. Apache 설정 확인
- Webmin → Servers → Apache Webserver
- VirtualHost 설정에서
SSL enabled확인 SSLCertificateFile과SSLCertificateKeyFile경로가 Certbot 발급 경로(/etc/letsencrypt/live/makerskorean.net/)로 되어 있는지 확인
2. Webmin 자체 SSL 적용
- Webmin → Webmin Configuration → SSL Encryption
- “Use existing certificate” 선택
/etc/letsencrypt/live/makerskorean.net/fullchain.pem/etc/letsencrypt/live/makerskorean.net/privkey.pem지정- 저장 후 Webmin 재시작 → Webmin 접속도 HTTPS로 가능
✅ 최종 점검 순서 (Webmin + Virtualmin)
- Virtualmin → 각 도메인 Virtual Server/Sub-server 등록
- Certbot 발급 인증서 → Virtualmin SSL Certificate 메뉴에서 적용
- “Copy to Webmin, Usermin, Dovecot, Postfix” 체크 → 전체 서비스에 적용
- Webmin → Apache Webserver → SSL VirtualHost 설정 확인
- Webmin → Webmin Configuration → SSL Encryption → 동일 인증서 적용
curl -I https://makerskorean.net또는 브라우저 접속 → 🔒 자물쇠 확인
👉 이렇게 하면 Virtualmin은 도메인별 SSL 관리, Webmin은 서버 전체 SSL 관리를 담당하게 됩니다.
다음 단계로, 원하시면 제가 다른 도메인(kkok.kr, kracer97.com)도 Virtualmin에서 SSL 발급 및 적용하는 절차를 이어서 정리해드릴 수 있습니다. 원하시나요?
SSL Options for makerskorean.net:443 Enable SSL
Yes
No
Default SSL protocols
SSLv2
SSLv3
TLSv1
TLSv1.1
TLSv1.2
TLSv1.3
좋습니다 👍 지금 Webmin/Virtualmin에서 SSL Options for makerskorean.net:443 화면을 보고 계신 거군요. 여기서 어떤 옵션을 켜야 하는지 정리해드릴게요.
🔐 SSL Options 설정 가이드 (Webmin/Virtualmin)
1. Enable SSL
- 반드시 Yes 선택
- 이렇게 해야 Apache VirtualHost가 443 포트에서 SSL을 활성화합니다.
2. SSL Protocols
여기서 중요한 점은 보안 취약한 프로토콜은 끄고, 최신 TLS만 켜는 것입니다.
- SSLv2 → ❌ (매우 취약, 절대 사용 금지)
- SSLv3 → ❌ (POODLE 취약점, 사용 금지)
- TLSv1.0 → ❌ (구형 브라우저만 지원, 보안 취약)
- TLSv1.1 → ❌ (더 이상 권장되지 않음)
- TLSv1.2 → ✅ (현재 대부분 브라우저/앱에서 표준 지원)
- TLSv1.3 → ✅ (최신, 가장 안전하고 빠름)
👉 따라서 체크해야 할 것은 TLSv1.2 + TLSv1.3 두 가지입니다.
3. 적용 후 확인
- 저장 후 Apache 재시작 (Virtualmin이 자동으로 처리)
- SSL 테스트:
curl -I https://makerskorean.net→ 응답 헤더가 정상적으로 나오면 SSL 활성화 완료 - 외부 SSL 검사 도구 사용 (예: SSL Labs Test)
→ TLS 1.2/1.3만 활성화되어 있는지 확인
📌 최종 권장 설정
- Enable SSL → Yes
- SSL Protocols → TLSv1.2, TLSv1.3만 체크
👉 다음 단계로, 원하시면 제가 Webmin에서 Cipher Suite(암호화 알고리즘) 최적화 설정까지 정리해드릴 수 있습니다. 그러면 보안 점수가 더 올라갑니다. 해드릴까요?
Per-Directory Options Path Type Directory /home/makerskorean/public_html Directory Directory /home/makerskorean/cgi-bin Directory Directory /var/www/html/.well-known/acme-challenge/ Directory Files awstats.pl Files Files regexp .php$ Files regexp
Directory /var/www/html/.well-known/acme-challenge/이 디렉토리는 삭제 해야 하나?
좋은 질문이에요 👍/var/www/html/.well-known/acme-challenge/ 디렉토리는 Let’s Encrypt 인증서 발급 과정에서 사용되는 임시 디렉토리입니다.
🔎 역할
- HTTP-01 인증 방식을 사용할 때, Certbot이나 Virtualmin이 이 디렉토리에 임시 파일을 생성합니다.
- 인증 서버(Let’s Encrypt)가
http://도메인/.well-known/acme-challenge/경로로 접근하여 파일을 확인함으로써 도메인 소유권을 검증합니다. - 따라서 이 디렉토리는 SSL 발급 및 갱신 과정에서 필요할 수 있습니다.
✅ 삭제 여부
- 삭제하지 않는 것이 안전합니다.
- 인증서 갱신 시 다시 사용될 수 있습니다.
- Virtualmin/Certbot이 자동으로 관리하는 경우, 디렉토리가 없으면 인증 실패가 발생할 수 있습니다.
- 만약 와일드카드 인증서처럼 DNS-01 방식만 사용하는 경우라면 이 디렉토리가 직접적으로 필요하지 않을 수 있습니다.
- 하지만 Virtualmin은 기본적으로 HTTP-01을 사용하기 때문에 유지하는 것이 좋습니다.
📌 권장 방안
- 디렉토리를 그대로 두고, Apache VirtualHost 설정에서
.well-known/acme-challenge/경로가 접근 가능하도록 유지하세요. - 만약
/var/www/html를 사용하지 않고 모든 사이트가/home/makerskorean/public_html같은 Virtualmin 홈 디렉토리에서만 운영된다면, Virtualmin이 자동으로 각 도메인별.well-known/acme-challenge/를 생성합니다. - 이 경우
/var/www/html/.well-known/acme-challenge/는 사실상 필요 없지만, 삭제하지 않고 그냥 두는 편이 안전합니다.
👉 정리하면: 삭제하지 말고 그대로 두세요.
혹시 원하시면 제가 Virtualmin에서 .well-known/acme-challenge 디렉토리 경로를 도메인별로 어떻게 관리하는지도 단계별로 설명해드릴 수 있습니다.
Failed to install certificate : Certificate file /etc/letsencrypt/live/makerskorean.net/privkey.pem must be under the virtual server's home directory
이 에러 메시지는 Virtualmin이 SSL 인증서를 적용할 때, 인증서 파일이 해당 Virtual Server의 홈 디렉토리 안에 있어야 한다고 강제하기 때문입니다.
지금은 /etc/letsencrypt/live/makerskorean.net/privkey.pem 경로에 인증서가 저장되어 있는데, Virtualmin은 기본적으로 /home/makerskorean/ 아래에 인증서가 있어야 한다고 판단해서 설치를 거부한 것입니다.
🔎 원인
- Virtualmin은 각 Virtual Server가 독립적으로 인증서를 관리하도록 설계되어 있습니다.
- Let’s Encrypt(Certbot)는
/etc/letsencrypt/live/도메인명/경로에 인증서를 저장합니다. - Virtualmin이 “홈 디렉토리 밖의 인증서”를 직접 참조하려 하면 보안 정책 때문에 거부됩니다.
✅ 해결 방법
방법 1: Virtualmin에서 직접 Let’s Encrypt 발급 (권장)
- Virtualmin → 해당 도메인 선택 (
makerskorean.net) - Server Configuration → SSL Certificate → Let’s Encrypt
- “Request certificate for” 항목에 도메인/서브도메인 입력 후 발급
- 이렇게 하면 Virtualmin이 자동으로
/home/makerskorean/아래에 인증서를 저장하고 Apache에 적용합니다.
👉 단, 와일드카드(*.makerskorean.net)는 Virtualmin 기본 HTTP-01 방식으로는 불가능합니다.
방법 2: Certbot 발급 인증서를 Virtualmin 홈 디렉토리로 복사
- 인증서 파일 복사:
sudo cp /etc/letsencrypt/live/makerskorean.net/fullchain.pem /home/makerskorean/ssl.cert sudo cp /etc/letsencrypt/live/makerskorean.net/privkey.pem /home/makerskorean/ssl.key - 권한 설정:
sudo chown makerskorean:makerskorean /home/makerskorean/ssl.* sudo chmod 600 /home/makerskorean/ssl.* - Virtualmin → SSL Certificate 메뉴 → “Copy certificate from file” 선택
- Certificate file:
/home/makerskorean/ssl.cert - Private key file:
/home/makerskorean/ssl.key
- Certificate file:
방법 3: 심볼릭 링크 사용 (가능하지만 권장하지 않음)
/home/makerskorean/아래에 심볼릭 링크를 만들어/etc/letsencrypt/live/makerskorean.net/파일을 참조하게 할 수 있습니다:ln -s /etc/letsencrypt/live/makerskorean.net/fullchain.pem /home/makerskorean/ssl.cert ln -s /etc/letsencrypt/live/makerskorean.net/privkey.pem /home/makerskorean/ssl.key- 그러나 Virtualmin 업데이트나 권한 문제로 깨질 수 있어 안정성은 떨어집니다.
📌 권장 시나리오
- 와일드카드 인증서가 꼭 필요하다면 → Certbot + Cloudflare API로 발급 후 방법 2 (복사) 적용
- 일반 도메인/서브도메인만 필요하다면 → Virtualmin 자체 Let’s Encrypt 발급 기능 사용
👉 지금 상황에서는 makerskorean.net 와일드카드 인증서를 Certbot으로 발급했으니, **방법 2 (복사)**로 /home/makerskorean/ 아래에 인증서를 두고 Virtualmin에서 불러오는 것이 가장 안정적입니다.
원하시면 제가 복사 후 Virtualmin에서 적용하는 단계별 화면 메뉴 흐름을 더 자세히 정리해드릴 수 있습니다. 해드릴까요?
Request Certificate In domain makerskorean.net Requesting a certificate for makerskorean.net, www.makerskorean.net, mail.makerskorean.net, admin.makerskorean.net, webmail.makerskorean.net from Let's Encrypt .. .. request failed : Web-based validation failed : Saving debug log to /var/log/letsencrypt/letsencrypt.log Renewing an existing certificate for makerskorean.net and 4 more domains
Certbot failed to authenticate some domains (authenticator: webroot). The Certificate Authority reported these problems: Domain: admin.makerskorean.net Type: unauthorized Detail: 182.213.104.92: Invalid response from http://admin.makerskorean.net/.well-known/acme-challenge/uywIwXcW2TVudQi6DV7KDCipWj-TCq9u0DT4Xp7o-yw: 404
Domain: mail.makerskorean.net Type: unauthorized Detail: 182.213.104.92: Invalid response from http://mail.makerskorean.net/.well-known/acme-challenge/vT5T6C6WuL3zbZMEavn_pP9p0zzkwZbK5gHrvyuJsnI: 404
Domain: webmail.makerskorean.net Type: unauthorized Detail: 182.213.104.92: Invalid response from http://webmail.makerskorean.net/.well-known/acme-challenge/p4AVf76kaZ-Jd5PNVfdstjeti3dI8aOQAMvD2_d0cN0: 404
Domain: www.makerskorean.net Type: unauthorized Detail: 182.213.104.92: Invalid response from http://www.makerskorean.net/.well-known/acme-challenge/Nm8Va-d0eY4HuXreffHXtbc_7u3UjSEVMKGpkb45y6k: 404
Hint: The Certificate Authority failed to download the temporary challenge files created by Certbot. Ensure that the listed domains serve their content from the provided --webroot-path/-w and that files created there can be downloaded from the internet.
Some challenges have failed. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details. DNS-based validation failed : Saving debug log to /var/log/letsencrypt/letsencrypt.log Renewing an existing certificate for makerskorean.net and 4 more domains
Certbot failed to authenticate some domains (authenticator: manual). The Certificate Authority reported these problems: Domain: www.makerskorean.net Type: dns Detail: DNS problem: NXDOMAIN looking up TXT for _acme-challenge.www.makerskorean.net - check that a DNS record exists for this domain
Domain: admin.makerskorean.net Type: unauthorized Detail: No TXT record found at _acme-challenge.admin.makerskorean.net
Domain: mail.makerskorean.net Type: unauthorized Detail: No TXT record found at _acme-challenge.mail.makerskorean.net
Domain: webmail.makerskorean.net Type: unauthorized Detail: No TXT record found at _acme-challenge.webmail.makerskorean.net
Hint: The Certificate Authority failed to verify the DNS TXT records created by the --manual-auth-hook. Ensure that this hook is functioning correctly and that it waits a sufficient duration of time for DNS propagation. Refer to "certbot --help manual" and the Certbot User Guide.
Some challenges have failed. Ask for help or search for solutions at https://community.letsencrypt.org. See the logfile /var/log/letsencrypt/letsencrypt.log or re-run Certbot with -v for more details
좋습니다. 지금 상황을 정리해보면 **makerskorean.net 및 여러 서브도메인(www, mail, admin, webmail)**에 대해 Virtualmin/Certbot으로 SSL을 발급하려 했는데, 두 가지 방식 모두 실패했습니다:
- HTTP-01(Webroot) 인증 실패 →
.well-known/acme-challenge/경로에 파일이 생성되었지만 외부에서 접근 시 404 에러 발생 - DNS-01(Manual) 인증 실패 →
_acme-challenge.서브도메인TXT 레코드가 Cloudflare DNS에 없어서 인증 불가
🔎 원인 분석
- HTTP-01 방식 실패
- 각 서브도메인(
www,mail,admin,webmail)이 Virtualmin에서 실제로 웹사이트로 호스팅되지 않음 - 따라서
http://서브도메인/.well-known/acme-challenge/요청이 Apache에서 처리되지 않고 404 발생
- 각 서브도메인(
- DNS-01 방식 실패
- 와일드카드 또는 특정 서브도메인 인증 시 필요한 TXT 레코드가 Cloudflare DNS에 자동으로 생성되지 않음
- 수동 등록을 하지 않았거나 propagation(전파)이 완료되기 전에 Certbot이 확인을 시도
✅ 해결 방법
방법 1: 실제로 필요한 도메인만 인증
makerskorean.net+www.makerskorean.net정도만 SSL 필요하다면, Virtualmin에서 HTTP-01 방식으로 발급 가능mail,admin,webmail은 웹사이트가 아니라 메일/관리용 호스트명 → SSL 인증서에 반드시 포함할 필요 없음- Virtualmin에서 “Request certificate for” 항목에서 불필요한 호스트명을 제거
방법 2: DNS-01 + Cloudflare API 플러그인 사용 (와일드카드 포함)
- Cloudflare에서 API Token 생성 (DNS Edit 권한)
- 서버에 플러그인 설치:
sudo apt install python3-certbot-dns-cloudflare - 인증서 발급:
sudo certbot certonly \ --dns-cloudflare \ --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \ -d makerskorean.net \ -d '*.makerskorean.net'
👉 이렇게 하면 www, mail, admin, webmail 등 모든 서브도메인이 자동으로 커버됩니다.
방법 3: 수동 TXT 레코드 등록
- Certbot 실행 시
_acme-challenge.도메인에 넣을 TXT 값이 출력됨 - Cloudflare DNS → TXT 레코드 추가
- 예:
_acme-challenge.admin.makerskorean.net→ 값 입력 dig TXT _acme-challenge.admin.makerskorean.net로 확인 후 Certbot 진행
👉 하지만 자동 갱신이 불가능하므로 운영에는 비추천
📌 권장 시나리오
- 운영 편의성: makerskorean.net 와일드카드 인증서 발급 → 모든 서브도메인 커버
- Virtualmin 적용: 발급된 인증서를
/home/makerskorean/아래로 복사 후 Virtualmin SSL 메뉴에서 불러오기 - 불필요한 호스트 제거: mail/admin/webmail 같은 관리용 호스트는 SSL 대상에서 제외하거나 와일드카드로 커버
👉 정리하면, 지금 에러는 서브도메인들이 실제 웹루트에 연결되지 않아 HTTP-01 인증 실패 + Cloudflare DNS TXT 레코드 미등록으로 DNS-01 인증 실패입니다.
가장 안정적인 해결책은 Cloudflare API 플러그인으로 와일드카드 인증서 발급 후 Virtualmin에 적용하는 것입니다.
원하시면 제가 Virtualmin에 와일드카드 인증서를 적용하는 단계별 메뉴 흐름을 구체적으로 정리해드릴 수 있습니다.
