얼마 전부터 Lets’ Encrypt에서 와일드카드 인증서를 지원하기 시작했습니다.
https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579
기존에는 메인 도메인과 필요한 서브 도메인 모두에 대해서 인증서를 발급받아야 되었는데요..
이젠 메인 도메인과 와일드카드 인증서 2개만 받으면 됩니다.
즉, 기존에는 example.com, a.example.com, b.example.com, c.example.com와 같이 메인 도메인과 필요한 모든 서브 도메인에 대해서 인증서가 필요했지만..
이젠 example.com과 *.example.com의 인증서만 받으면 된다는 것입니다.
약 2년 전에 제 블로그에 Lets’ Encrypt SSL 인증서 받는 방법에 대해서 글을 올린 적이 있습니다.
Synology NAS DSM 5.x에서 Lets’ Encrypt SSL 인증서 발급/자동 갱신
해당 게시글에서 웹 서버의 “/.well-known” 설정하는 것과 관련하여 많은 분들이 문의를 주셨고 어려움이 있었습니다.
이번에 소개하는 방법은 웹 서버의 “/.well-known” 설정을 할 필요가 없습니다. 와일드카드 인증서를 발급받기 위해서는 ACME v2 프로토콜을 지원하는 클라이언트를 사용해야 됩니다. 이 말은 DNS의 TXT 레코드를 사용해야 된다는 것을 의미합니다.
이 팁을 따라 하면 최초 한 번만 설치해두면 이후 자동으로 인증서를 갱신해줍니다. 그리고 접속자가 아주 많은 상황이 아니라면 모두 무료로 가능합니다.
참고로 SSL 인증서를 발급받고 나서 기억을 더듬어 작성한 것이라 일부 누락된 내용이 있을 수도 있으니 문제 발생 시 댓글 남겨주시기 바랍니다.
이 팁은 Synology NAS에서 인증서를 발급받는 방법을 설명하지만 다른 시스템에도 거의 그대로 적용 가능합니다.
1. 준비사항
- Bootstrap – 여기서는 따로 설명하지 않겠습니다. 검색하여 각 모델에 맞는 것으로 직접 설치 바랍니다.
- Python 패키지 – [패키지 센터-설정-패키지 소스]에 “http://packages.synocommunity.com/”를 추가, [일반-신뢰 수준]에 “모든 게시자” 설정 후 패키지 센터의 커뮤니티 탭에 있는 Python 설치
- Python Module 패키지
- Telnet or SSH 활성화 – DSM 관리자 페이지에서 활성화합니다.
- 인증서를 발급받고자 하는 도메인
- AWS(Amazon Web Services) 계정 – 결제 신용카드 등록까지 필요
2. 사용 기술 및 서비스
- dehydrated – 인증서 발급/갱신 클라이언트 프로그램
- 아마존 Lightsail – DNS 서비스(3개 도메인까지 무료, 월 3백만 쿼리까지 무료)
- AWS CLI (명령 줄 인터페이스, Command Line Interface)
3. 각종 툴/라이브러리 설치
먼저 이 팁에서 사용하는 각종 툴을 설치합니다.
1 2 3 |
$ ipkg install bash git bind |
- bash: 인증서를 발급/갱신하는 쉘 스크립트에서 사용
- git: dehydrated 소스코드를 내려받기 위해서 사용
- bind: 도메인의 TXT 레코드 값을 확인하기 위해서 사용
4. Amazon Lightsail 설정 및 네임서버 변경
와일드카드 인증서를 발급받으려면 도메인의 TXT 레코드를 추가해야 됩니다. dehydrated 프로그램이 인증서 발급 과정 중 자동으로 TXT 레코드를 갱신하고, 그 값을 확인하는 과정이 있습니다. 그래서 이 팁에서는 API로 TXT 레코드를 추가/갱신할 수 있는 Amazon Lightsail 서비스를 이용합니다. 여러 DNS 서비스를 찾아보았는데 일반적인 환경에서는 무료로 사용할 수 있고 API도 지원해서 Lightsail로 선정했습니다.
아래는 Amazon Lightsail 사이트에 있는 내용입니다.
Amazon Lightsail이란 무엇입니까?
Amazon Lightsail은 간단한 VPS(가상 프라이빗 서버) 솔루션이 필요한 개발자, 소규모 비즈니스, 학생 및 다른 사용자가 AWS를 시작할 수 있는 가장 쉬운 방법입니다. Lightsail은 개발자에게 클라우드에서 웹사이트와 웹 애플리케이션을 배포하고 관리할 수 있는 컴퓨팅, 스토리지 및 네트워킹 용량 및 기능을 제공합니다. Lightsail에는 프로젝트를 빠르게 시작하는 데 필요한 모든 것(가상 머신, SSD 기반 스토리지, 데이터 전송, DNS 관리, 고정 IP)이 포함되어 있으며 고객은 이러한 서비스를 저렴하고 예측 가능한 월간 요금으로 사용할 수 있습니다.
Lightsail DNS 관리 비용은 얼마나 됩니까?
Lightsail 내에서 DNS 관리 비용은 무료입니다. 최대 3개의 DNS 영역과 각 DNS 영역에 대해 원하는 만큼 많은 수의 레코드를 만들 수 있습니다. 또한, 이러한 영역에 대해 매달 3백만 건의 DNS 쿼리가 사용할 수 있습니다. 처음 주어진 월별 3백만 개의 쿼리 횟수를 초과하면 DNS 쿼리 1백만 개당 0.40 USD의 요금이 청구됩니다.
저는 DNS 쿼리가 월평균 20만 건 정도 되어서 무료 쿼터 내에서 충분히 이용할 수 있습니다. DNS 쿼리의 경우 캐시의 영향이 있어서 직접 계산하기는 어렵고, DNS 서비스 업체에서 해당 정보를 제공해주는지 확인해보세요.
이제 DNS 서비스를 이용하기 위해서 Amazon Lightsail 사이트에 접속합니다. 먼저 아마존 웹서비스(AWS)에 가입되어 있어야 됩니다.
https://lightsail.aws.amazon.com/ls/webapp/home/networking
위 사이트에 접속하여 “DNS 영역 생성” 버튼을 눌러 도메인을 입력하고 진행합니다.
그리고, 기존에 사용하던 DNS 레코드를 그대로 모두 입력합니다. DNS 서비스를 이전하기 전에 미리 설정해두는 것이 좋습니다.
DNS 레코드를 모두 설정한 후 화면 제일 아래에 표시되는 “이름 서버”를 자신이 도메인을 등록한 업체의 웹사이트에 접속해서 네임서버의 정보에 모두 입력합니다.
네임서버 정보가 변경되기까지 서비스 업체별로 시간이 조금 다릅니다. DNS 레코드에 새로운 서브도메인을 하나 추가해두고 ping 테스트를 해보면 변경되었는지 쉽게 확인할 수 있습니다.
이 팁에서는 필요치 않지만 참고로 Lightsail의 VPS를 저렴한 가격에 이용할 수 있습니다. 아래는 리눅스 인스턴스의 경우 비용입니다.
5. AWSCLI 설치
먼저 패키지에서 Python Module을 설치합니다. awscli를 사용하기 위해 필요합니다. 참고로 전 Python 2.7 패키지와 Python Module 패키지를 설치했습니다.
그리고, 아래 명령을 차례로 입력해서 awscli를 설치합니다.
1 2 3 4 5 6 7 8 9 10 |
$ /usr/bin/wget https://pypi.python.org/packages/5f/ad/1fde06877a8d7d5c9b60ef f7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip#md5=c6c59594a7b180af 57af8a0cc0cf5b4a $ unzip distribute-0.7.3.zip $ cd distribute-0.7.3/ $ python setup.py install $ easy_install pip $ pip install awscli --upgrade --user |
/root/.profile 파일의 PATH에 “~/.local/bin“을 추가합니다.
1 2 3 4 |
PATH=/opt/bin:/opt/sbin:~/.local/bin:$PATH export PATH |
아래 명령으로 쉘에 바로 적용합니다. 또는 터미널에 재접속합니다.
1 2 3 |
$ source ~/.profile |
아래 명령으로 awscli가 제대로 설치되었는지 확인합니다.
1 2 3 4 |
$ aws --version aws-cli/1.14.63 Python/2.7.9 Linux/3.10.35 botocore/1.9.16 |
6. AWS 액세스키 발급 및 설정
awscli가 AWS Lightsail에 접근할 수 있도록 액세스 키를 생성합니다. 아래 URL에 접속하여
https://lightsail.aws.amazon.com/ls/webapp/account/advanced
고급 – IAM 콘솔로 이동 – 보안 자격 증명으로 계속 – 액세스 키(액세스 키 ID 및 보안 액세스 키) – 새 액세스 키 만들기를 해서 생성합니다.
터미널로 접속하여 아래 명령을 내려서 생성한 액세스 키를 등록합니다. region에는 us-east-1로 입력하고, output format은 json으로 입력합니다.
1 2 3 4 5 6 7 |
$ aws configure AWS Access Key ID [None]: AQIXXXXXXXXXXBQ AWS Secret Access Key [None]: Va5XXXXXXXXXXCt Default region name [None]: us-east-1 Default output format [None]: json |
다시 설정하고자 할 경우 aws configure 명령을 다시 입력하면 됩니다.
이제 아래 명령으로 awscli가 제대로 동작하는지 테스트합니다. 도메인 이름에는 자신의 도메인을 입력하세요.
1 2 3 |
$ aws lightsail get-domain --domain-name example.com |
5단계에서 설정한 DNS 레코드가 JSON 형식으로 모두 표시되면 제대로 된 것입니다.
참고로 A 레코드의 값을 변경하려면 아래 명령을 내리면 됩니다. 유동아이피 환경에서 활용하면 됩니다.
1 2 3 |
$ aws lightsail update-domain-entry --domain-name example.com --domain-entry '{"type":"A","isAlias":false,"target":"123.456.789.123","id":"-1794602113","name":"example.com"}' |
* DNS 관련 명령어 외에는 되도록 사용하지 않는 것이 좋습니다. 일부 서비스의 경우 비용이 발생될 수 있습니다.
7. dehydrated 설치 및 설정
인증서 발급/갱신 클라이언트 프로그램인 dehydrated를 설치합니다. (설치 디렉토리는 원하는대로 변경하면 됩니다.)
1 2 3 4 5 |
$ mkdir /volume1/system/usr/local $ cd /volume1/system/usr/local $ git clone https://github.com/lukas2511/dehydrated |
이제 아래 URL에서 Amazon Lightsail과 연동하기 위한 스크립트를 받습니다.
https://github.com/isul/dehydrated-hook-lightsail
(위 스크립트는 제가 만든 것이니 혹시나 동작에 문제가 있을 경우 댓글 남겨주시기 바랍니다)
1 2 3 4 5 6 7 8 9 |
$ cd /volume1/system/usr/local/dehydrated $ mkdir hooks $ git clone https://github.com/isul/dehydrated-hook-lightsail hooks/lightsail $ cp hooks/lightsail/domains.txt ./ $ cp hooks/lightsail/run.sh ./ $ chmod 755 run.sh $ cp docs/examples/config ./ |
위 명령은 dehydrated 디렉토리 아래의 hooks/lightsail에 Amazon Lightsail과 연동을 위한 훅 스크립트를 내려받고, dehydrated 디렉토리에 각종 설정 파일과 와일드카드 인증서 발급을 위한 스크립트를 복사하는 것입니다.
dehydrated 디렉토리 내에 있는 domains.txt에 자신의 도메인을 설정합니다.
1 2 3 |
example.com *.example.com > example.com |
dehydrated 디렉토리 내에 있는 run.sh에서 아래 설정을 변경합니다. (dehydrated 디렉토리 경로와 자신의 도메인을 설정합니다.)
1 2 3 4 5 6 7 |
# Path to a directory containing dehydrated DEHYDRATED_DIR=/volume1/system/usr/local/dehydrated # your domain DOMAIN=example.com |
dehydrated 디렉토리 내에 있는 config 파일을 아래와 같이 변경합니다.
1 2 3 4 5 6 7 8 9 10 11 |
# Which challenge should be used? Currently http-01 and dns-01 are supported #CHALLENGETYPE="http-01" CHALLENGETYPE="dns-01" #HOOK= HOOK=${BASEDIR}/hooks/lightsail/hook-lightsail.sh # E-mail to use during the registration (default: <unset>) CONTACT_EMAIL=you@example.com |
혹시나 인증서 발급 후 인증서를 사용하는 웹서버 등을 재시작할 경우에는 아래 파일을 수정합니다.
/volume1/system/usr/local/dehydrated/hooks/lightsail/hook-lightsail.sh
위 파일의 deploy_cert() 함수 중 126 라인부터 수정합니다. 아래의 경우 시놀로지 나스의 haproxy 패키지를 사용하는 경우입니다.
1 2 3 4 5 6 7 8 9 10 |
cat ${FULLCHAINFILE} ${KEYFILE} > ${FULLCHAINFILE}.${DOMAIN} echo "Saved certificate to ${FULLCHAINFILE}.${DOMAIN}" if [[ $DOMAIN != *"*."* ]]; then echo "Restarting haproxy..." killall haproxy /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/var/haproxy.cfg -p /usr/local/haproxy/var/haproxy.pid fi |
haproxy 패키지를 사용할 경우 위 설정과 추가로 아래 명령으로 심볼릭 링크를 생성해두어야 됩니다. (example.com은 자신의 도메인으로 변경 필요)
1 2 3 4 |
$ rm -rf /usr/local/haproxy/var/crt/default.pem $ ln -s /volume1/system/usr/local/dehydrated/certs/example.com/fullchain.pem.example.com /usr/local/haproxy/var/crt/default.pem |
8. 인증서 발급
아래 명령을 실행합니다. (최초 1회만 필요)
1 2 3 4 |
$ cd /volume1/system/usr/local/dehydrated $ ./dehydrated --register --accept-terms |
이제 아래 명령으로 인증서를 발급받습니다.
1 2 3 4 |
$ cd /volume1/system/usr/local/dehydrated $ ./run.sh |
run.sh 스크립트는 위 7번 과정에서 https://github.com/isul/dehydrated-hook-lightsail hooks/lightsail에서 받은 것을 복사한 것으로, 하나의 도메인의 경우 dehydrated -c 명령으로 인증서를 발급받으면 되는데요.. 기본 도메인과 와일드카드 도메인을 하나의 인증서로 받으려고 run.sh를 사용했습니다.
위 명령 실행 결과 아래와 같은 내용이 표시되면 인증서 발급이 제대로 된 것입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
$ ./run.sh # INFO: Using main config file /volume1/system/usr/local/dehydrated/config Processing *.isulnara.com + Creating new directory /volume1/system/usr/local/dehydrated/certs/isulnara.com ... + Signing domains... + Generating private key... + Generating signing request... + Requesting new certificate order from CA... + Received 1 authorizations URLs from the CA + Handling authorization for isulnara.com + 1 pending challenge(s) + Deploying challenge tokens... Creating TXT record(_acme-challenge.isulnara.com) for isulnara.com... { "operation": { "status": "Succeeded", "resourceType": "Domain", "isTerminal": true, "statusChangedAt": 1522582047.5880001, "location": { "availabilityZone": "all", "regionName": "global" }, "operationType": "CreateDomainEntry", "resourceName": "isulnara.com", "id": "1ad32d75-d92a-414a-af0c-7941d932f997", "createdAt": 1522582047.5880001 } } + Settling down for 20s... Token value(rCTJTgcf6XOI-niyfWl7tmAiTX5jluyXGZkJbJ27dKo) is valid! + Responding to challenge for isulnara.com authorization... + Challenge is valid! + Requesting certificate... + Checking certificate... + Done! + Creating fullchain.pem... Saved certificate to /volume1/system/usr/local/dehydrated/certs/isulnara.com/fullchain.pem.*.isulnara.com + Done! # INFO: Using main config file /volume1/system/usr/local/dehydrated/config Processing isulnara.com with alternative names: *.isulnara.com + Checking domain name(s) of existing cert... changed! + Domain name(s) are not matching! + Names in old certificate: *.isulnara.com + Configured names: *.isulnara.com isulnara.com + Forcing renew. + Checking expire date of existing cert... + Valid till Jun 30 10:27:52 2018 GMT (Longer than 30 days). Ignoring because renew was forced! + Signing domains... + Generating private key... + Generating signing request... + Requesting new certificate order from CA... + Received 2 authorizations URLs from the CA + Handling authorization for isulnara.com + Found valid authorization for isulnara.com + Handling authorization for isulnara.com + 1 pending challenge(s) + Deploying challenge tokens... Updating TXT record(oesyg5Jd5LmoRLI-ubLvjKMl0H6rYSpsefEiSnQNlGc) for isulnara.com... { "operations": [ { "status": "Succeeded", "resourceType": "Domain", "isTerminal": true, "statusChangedAt": 1522582094.8970001, "location": { "availabilityZone": "all", "regionName": "global" }, "operationType": "DeleteDomainEntry", "resourceName": "isulnara.com", "id": "fd3ee9d5-ab8d-404d-cb0e-2bd14f6f5e02", "createdAt": 1522582094.8970001 }, { "status": "Succeeded", "resourceType": "Domain", "isTerminal": true, "statusChangedAt": 1522582094.9389999, "location": { "availabilityZone": "all", "regionName": "global" }, "operationType": "CreateDomainEntry", "resourceName": "isulnara.com", "id": "e0688724-50c0-4b6d-a1be-8d1840a15db8", "createdAt": 1522582094.9389999 } ] } + Settling down for 20s... + Settling down for 20s... Token value(oesyg5Jd5LmoRLI-ubLvjKMl0H6rYSpsefEiSnQNlGc) is valid! + Responding to challenge for isulnara.com authorization... + Challenge is valid! + Requesting certificate... + Checking certificate... + Done! + Creating fullchain.pem... Saved certificate to /volume1/system/usr/local/dehydrated/certs/isulnara.com/fullchain.pem.isulnara.com Restarting haproxy... + Done! Deleting TXT record(_acme-challenge.isulnara.com) for isulnara.com... { "operation": { "status": "Succeeded", "resourceType": "Domain", "isTerminal": true, "statusChangedAt": 1522582144.112, "location": { "availabilityZone": "all", "regionName": "global" }, "operationType": "DeleteDomainEntry", "resourceName": "isulnara.com", "id": "9dd0a7ab-fe00-4b96-b19a-41524e78f0d7", "createdAt": 1522582144.112 } } |
이제 인증서 발급이 완료되었습니다. 아래 위치에 인증서 파일이 생성되어 있습니다.
/volume1/system/usr/local/dehydrated/certs/example.com
혹시나 인증서 발급에 실패할 경우 여러 번 재시도하면 Let’s encrypt의 요청 수 제한에 걸려서 일정 기간 동안 테스트가 불가능하니 config 파일에서 CA 설정을 아래처럼 변경하여 테스트하기 바랍니다. 테스트 후 발급에 성공하면 다시 주석 처리하고 재발급 받으면 됩니다.
1 2 3 4 5 6 |
# Path to certificate authority (default: https://acme-v02.api.letsencrypt.org/directory) #CA="https://acme-v02.api.letsencrypt.org/directory" # Staging URL CA="https://acme-staging-v02.api.letsencrypt.org/directory" |
인증서를 다시 발급 받으려면 아래 명령으로 관련 데이터를 모두 삭제하고 재시도하면 됩니다.
1 2 3 4 5 |
$ cd /volume1/system/usr/local/dehydrated $ rm -rf ./accounts/* $ rm -rf ./certs/* |
이제 인증서를 웹 서버에서 사용하도록 설정합니다. 이 부분은 각자 알아서 설정하기 바랍니다.
참고로 저는 haproxy를 사용 중이며 7번 과정에서 deploy_cert() 함수에 자동 적용되도록 설정하였습니다.
자신의 웹사이트에 https로 접속해서 인증서가 제대로 표시되는지 확인합니다. 크롬으로 접속하면 아래처럼 표시됩니다.
유효기간은 90일이고, “주체 대체 이름”에 기본 도메인과 와일드카드 도메인 두 개가 모두 표시되면 정상 발급된 것입니다.
기본 도메인 외에 서브 도메인으로 접속해서 인증서가 유효한 것으로 표시되는지도 확인하시기 바랍니다.
90일 후 인증서가 만료되기 때문에 cron 등의 스케줄러를 사용해서 run.sh가 주기적으로 실행되도록 설정합니다.
이상입니다.
*2020-04-11
아래는 도커로 쉽게 처리하는 방법입니다. 본문의 복잡한 과정없이 간단히 처리할 수 있습니다.
https://isulnara.com/wp/archives/2495
[…] https://isulnara.com/wp/archives/1581 […]
Amazon Lightsail 로 사용해볼려고 하는데 이슬님은 고정ip 사용중인가요?
유동아이피면 Amazon Lightsail 사용을 못할거 같아서요
저도 집에서 사용하는 거라서 유동아이피입니다. 그런데 3년 동안 한 번도 아이피가 바뀌지 않네요^^
유동 아이피라도 Amazon Lightsail 사용에 문제가 없습니다.
공유기에 DDNS 설정하시구요. Lightsail에 등록한 도메인을 CNAME으로 DDNS 도메인 설정해주면 됩니다.
예를 들면 공유기에서 DDNS로 example.asuscomm.com을 받았다면 Lightsail에 mydomain.com 영역에 CNAME으로 도메인 추가하고 example.asuscomm.com로 설정해주면 됩니다.
아니면 본문에 나와 있는 스크립트 조금 수정해서 A 레코드를 갱신해줘도 됩니다. 언제 시간 내어서 A 레코드 자동 갱신하는 스크립트 만들어서 공유기나 나스에서 주기적으로 갱신하도록 처리해볼까 생각 중입니다.
답변 감사합니다. 많은 도움 되었습니다.
안녕하세요 시놀 개인나스서버에서 와일드카드 적용해보려고 하다가 이 블로그를 방문하고 따라해보고 있는데요.
궁금한점이 있어서 이렇게 글을 남깁니다.
저의 상황은 duckdns에서 abc.duckdns.org를 사용하고 있구요
리버스프록시 기능을 이용하여
plex.abc.duckdns.org
photo.abc.duckdns.org
이렇게 구성해서 사용하면서 일일이 다 인증서를 발급 받았는데 이런문제를 해결하고자 시도해보았습니다.
제가 도메인관련된 부분은 좀 무지한 것 같아서 질문이 좀 이상하더라도 양해부탁드려요.
제가 4번과정에서 막혔는데요. 우선 AWS에 가입까지 완료하고 DNS생성을 해보려고 했습니다.
우선 처음엔 DNS 레코드입력하라고 했는데 뭔지 몰라서 검색해봤는데…. 그래서 무엇을 입력해야할 지 몰라서 그냥 입력하려고보니. 하위 도메인을 입력하라는 것 같아서. plex.abc.duckdns.org입력하고 그 옆에는 IP를 입력해야해서.. 리버스 프록시처럼 나스 ip입력하고 포트를 입력하려고 하니 우선 포트가 입력이 안되길래 ip까지만 입력했습니다.
그리고 이제 이름서버를 도메인의 네임서버에 등록하라고 하셨는데.. 이부분을 잘 모르겠습니다.
duckdns 네임서버 등록 이런걸로 검색해봤는데 나오지 않는 것을 보니 duckdns에서는 지원하지 않는건가요?
조언 부탁드립니다.
감사합니다.
안녕하세요.
이 글은 자신의 도메인을 보유했을 때 적용 가능합니다. 즉 저와 같이 본인 소유의 도메인(isulnara.com)을 보유했을 때 메인 도메인(isulnara.com)과 각종 서브도메인(abc.isulnara.com, efg.isulnara.com)의 인증서를 와일드카드 인증서를 받아서 적용할 수 있는 것입니다.
Lets’ Encrypt에서 제공하는 와일드카드 인증서가 도메인의 소유를 확인하는 방식이라서 본인 소유가 아닌 duckdns.org의 경우는 적용할 수 없습니다.
이슬님 친절한 답변 감사드립니다. 그냥 열심히 인증서 많이 만들어야겠네요
와일드카드로 받은 인증서 renew가 되든가요?
cron으로 등록해뒀는데 갱신이 안되서 검색 해보니 certbot renew가 안된다고 합니다.
혹시 해보신건지요..
안녕하세요.
인증서 갱신할 때 에러가 발생하는 문제가 있어서 지난 달 초에 스크립트(run.sh)를 수정하였습니다.
인증서를 최초 생성할 때는 잘되는데 기존 인증서 파일이 있는 상태에서 하면 에러가 발생되더군요.
스크립트(run.sh)를 수정하였으니 아래 사이트에서 받아서 교체하시고 설정 사항을 변경하시거나, 기존 파일에서 아래 수정된 부분을 추가해 주시면 됩니다.
https://github.com/isul/dehydrated-hook-lightsail
참고로 run.sh에서 수정된 부분은 아래와 같습니다.
이용에 불편을 드려 죄송합니다.
인증서를 한 번 발급받고 나면 일정 시간이 지나야 갱신할 수 있어서 곧바로 갱신 테스트를 할 수가 없었습니다.
이번에 저도 갱신하면서 문제를 발견하였습니다.
적용해보시고 결과 남겨 주시면 고맙겠습니다.
설명해주신 와일드 카드 아카이브에 댓글이 안남겨집니다..
root@east9Nas:~# /usr/bin/wget https://pypi.python.org/packages/5f/ad/1fde06877a8d7d5c9b60ef
–2020-03-03 10:41:19– https://pypi.python.org/packages/5f/ad/1fde06877a8d7d5c9b60ef
Resolving pypi.python.org… 151.101.228.223, 2a04:4e42:36::223
Connecting to pypi.python.org|151.101.228.223|:443… connected.
HTTP request sent, awaiting response… 301 Redirect to Primary Domain
Location: https://pypi.org/packages/5f/ad/1fde06877a8d7d5c9b60ef [following]
–2020-03-03 10:41:20– https://pypi.org/packages/5f/ad/1fde06877a8d7d5c9b60ef
Resolving pypi.org… 151.101.128.223, 151.101.64.223, 151.101.0.223, …
Connecting to pypi.org|151.101.128.223|:443… connected.
HTTP request sent, awaiting response… 301 Moved Permanently
Location: https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60ef [following]
–2020-03-03 10:41:21– https://files.pythonhosted.org/packages/5f/ad/1fde06877a8d7d5c9b60ef
Resolving files.pythonhosted.org… 151.101.229.63, 2a04:4e42:36::319
Connecting to files.pythonhosted.org|151.101.229.63|:443… connected.
HTTP request sent, awaiting response… 404 Not Found
2020-03-03 10:41:22 ERROR 404: Not Found.
눈뜨자마자 작업하는데 댓글이 계속 안남겨지네용..
아무튼 파일이 없다고 하는것 같은데.. 어떻게 해야할까요.
영어로 등록되는 스팸이 많아서 스팸 차단 플러그인을 설치했더니 댓글에 영어가 아주 많으면 스팸으로 분류됩니다.
명령을 잘못 내렸습니다.
5번 과정의 첫 명령어를 3줄(2~4번 라인) 전체를 복사해서 사용해야 됩니다.
아래가 명령입니다.
/usr/bin/wget https://pypi.python.org/packages/5f/ad/1fde06877a8d7d5c9b60ef
f7de2d452f639916ae1d48f0b8f97bf97e570a/distribute-0.7.3.zip#md5=c6c59594a7b180af
57af8a0cc0cf5b4a
아하 그래서 안달린거였네용..
적어주신내용 그대로 복사해서 넣어도 날짜가 포함되서 명령어가 실행되요
맥 터미널 환경입니다..
날짜요?
메모장 같은 곳에 먼저 붙여넣은 후 복사해서 해보세요.
명령어는 /usr/bin/wget으로 시작해서 57af8a0cc0cf5b4a로 끝납니다.
안되면 아래 명령어로 해보세요.
/usr/bin/wget https://fft.kr/o
위 명령도 안되면 웹브라우저 주소창에 https://fft.kr/o 를 넣고 엔터키를 치신 후 distribute-0.7.3.zip 파일이 받아지면 나스의 특정 폴더에 올려두고 터미널에서 그 폴더로 접속한 다음에 그 다음 명령부터 수행해도 됩니다.
안녕하세요 알려주신대로 다운받고 실행하고
무난히 8번까지진행하다가
./run.sh 를 실행시키면
권한이 없다고 뜨네용….
안녕하세요. 아래 명령으로 해당 파일에 실행권한을 주시고
chmod 755 run.sh
다시 아래 명령으로 실행해보세요.
./run.sh
다행히 정상적으로 다운을 받았습니다! 정말 감사합니다
다 다운받고
https://isulnara.com/wp/archives/1209
이 페이지에서
아파치(apache) 가상호스트 설정 파일에 인증서 적용
/etc/httpd/sites-enabled-user/httpd-ssl-vhost.conf-user에 아래와 같이 설정합니다. (도메인은 자신의 환경에 맞게 변경)
이것을 적용했는데요
폴더가 없어서 폴더도 만들어서 파일을 넣었습니다 그리고 내용은
…
SSLCertificateFile /volume1/system/usr/local/dehydrated/certs/mydomain.com/cert.pem
SSLCertificateKeyFile /volume1/system/usr/local/dehydrated/certs/mydomain.com/privkey.pem
SSLCertificateChainFile /volume1/system/usr/local/dehydrated/certs/mydomain.com/chain.pem
SSLCACertificateFile /volume1/system/usr/local/dehydrated/certs/mydomain.com/fullchain.pem
…
이것을 넣었습니다
경로 바꾸고 물론 도메인은 제것으로 변경했구요
그리고 dms재부팅후
도메인으로 들어갔더니 ssl이 적용이 안되네요… 제가 빠트린게 있을까요?
당연히 dsm내의 인증서에는 뜨는게 아니지요?
아 그리고 이것을 만지면서 터미널에 접속하면
-sh: [2: command not found
-sh: 3R/profile:: No such file or directory
이런에러도 뜨네요 왜이런걸까요..
정말 죄송합니다 욕심은 많은데 진짜 지식이 없네요..
일단 터미널 접속 시 “command not found” 메시지 나오는 것은 /root/.profile 파일 수정하면서 뭔가 잘못 설정한 것 같습니다.
아래 명령 내린 결과를 보내주시면 오류를 확인할 수 있을 것 같습니다.
cat /root/.profile
그리고 아파치 설정 관련된 사항으로는..
/etc/httpd/sites-enabled-user/httpd-ssl-vhost.conf-user 파일은 사용자용 웹 서버에 적용되는 파일입니다.
DSM 관리자용 웹 서버에는 적용 안됩니다.
관리자용 웹 서버에 적용하는 건 저도 더 확인해봐야 됩니다.
전 HAProxy 패키지를 사용해서 처리하고 있어서 정확히 모르겠네요.
찾아보고 댓글 달겠습니다.
cat /root/.profile
#This fixes the backspace when telnetting in.
#if [ “$TERM” != “linux” ]; then
# stty erase
#fi
HOME=/root
export HOME
#only for console (ssh/telnet works w/o resize)
isTTY=$(ps | grep $$ | grep tty)
#only for bash (bash needs to resize and can support these commands)
isBash=$(echo $BASH_VERSION)
#only for interactive (not necessary for “su -“)
isInteractive=$(echo $- | grep i)
if [ -n “$isTTY” -a -n “$isBash” -a -n “$isInteractive” ]; then
shopt -s checkwinsize
checksize=’echo -en “\E7 \E[r \E[999;999H \E[6n”; read -sdR CURPOS;CURPOS=${CURPOS#*[}; IFS=”?; \t\n”; read lines columns <<< "$(echo $CURPOS)"; unset IFS'
eval $checksize
# columns is 1 in Procomm ANSI-BBS
if [ 1 != "$columns" ]; then
export_stty='export COLUMNS=$columns; export LINES=$lines; stty columns $columns; stty rows $lines'
alias resize="$checksize; columns=\$((\$columns – 1)); $export_stty"
eval "$checksize; columns=$(($columns – 1)); $export_stty"
alias vim='function _vim(){ eval resize; TERM=xterm vi $@; }; _vim'
else
alias vim='TERM=xterm vi $@'
fi
alias vi='vim'
alias ps='COLUMNS=1024 ps'
fi
#PATH=$PATH:/opt/bin:/opt/sbin
#export PATH
PATH=$PATH:/opt/bin:/opt/sbin:~/.local/bin:$PATH
export PATH
요롷게 뜨고있어용..
두가지 방법으로 가능합니다.
1. 아파치 사용자 설정 파일에 프록시 설정
위와 같이 설정하면 https://nas.mydomain.com 으로 접속하면 DSM 관리자 페이지가 표시됩니다.
2. DSM 제어판 – 보안 – 인증서 – 추가 – 인증서 가져오기에서 생성한 인증서 파일 가져오기
– 개인키: prvkey.pem, 인증서: cert.pem, 중간인증서: 생략
* 와일드카드 인증서를 발급 받는 것이 목적이라면 저는 아파치에 설정하는 것보다는 UI가 지원되는 HAProxy 패키지를 추천드리고, 아니라면 2번 과정에서 Lets’Encrypt 무료 인증서를 받는 것을 추천드립니다.
성공했습니다…… 드디어
HAproxy는 설치하지 못했습니다 검색이 안되더라구요
python3 말고는 보이지도 않고 커뮤니티 사이트도 지금 에러가 있는듯 싶고용..
그래서 8번 인증서 받기로하고
cp -r /volume1/system/usr/local/dehydrated/certs/mydomain.com /volume1/web 로 카피해서 맥으로 다운받아서
수동으로 등록했습니다…….
이렇게 하는게 맞는지요?
이방법을 3개월에 1번씩 해야하는건가요?
이렇다면 이걸 자동으로 스케쥴러를 등록은 못하는거겟죠?
진짜 3주동안 인터넷업체에도 문의하고 나스공급사에도 문의하고 쌩쑈를 했는데 이설님때문에 해결했습니다.. 진짜 감사합니다..
축하드립니다^^
[DSM 제어판 – 보안 – 인증서 – 추가 – 인증서 가져오기]에서 하신 거죠? 만약 그렇다면 자동화하는 방법은 모르겠습니다. 3개월에 1번씩 run.sh 실행하시고 수작업으로 인증서 등록해야 됩니다.
HAProxy의 경우 아래 게시글에 설치 방법과 설정 방법이 있습니다.
https://isulnara.com/wp/archives/1362
ㅎㅎ 네 그쵸,, 수동으로 해야겟죠?
마지막으로
http://www.domain.com 은 되는데
domain.com 이놈은 안먹히네요
dns레코드 설정을 어떻게 해야 되는건지 알수있을까요?ㅠㅠ
라이트세일 네트워크에서 호스트 등록할때 호스명을 @로 입력하면 됩니다
domain.com 으로 등록했으면
처음부터 다시해야하는건가요??ㅠㅠ
아닙니다. 본문대로 했으면 와일드카드 인증서를 발급 받은 것이라서 domain.com, *.domain.com(abc.domain.com, test.domain.com 등)에서 재발급없이 사용할 수 있습니다. 메인 도메인이 바뀌지 않았으면 그대로 사용하면 됩니다.
죄송합니다만 이해가 잘 안갑니다.
네트워크 관리에서
domain.com 으로해서 적용했고 댓글 남겨주셔서
@.domain.com 을 추가로 햇더니
ns레코드로 등록이 되는데
요것을 네임서버로 보고 가비아 사이트에 네임서버를 변경하면 된다는 건가요??
도메인을 등록한 가비아에서 해당 도메인의 네임서버 정보를 [Aws 라이트세일-네트워킹-해당 도메인 선택-스크롤바 제일 아래로 내리면 나오는 이름 서버]를 등록해야 되구요. (이건 단 한 번만 해주면 됩니다)
이렇게 해주시면 이젠 도메인 갱신을 제외하고는 모두 AWS 라이트세일에서 관리하면 됩니다.
https://domain.com 으로 접속했을 때 나스의 관리자 페이지로 연결하고자 한다면
라이트세일에서 해당 도메인 DNS 영역에서 A 레코드 또는 CNAME 레코드를 생성해야 됩니다.
이때 하위 도메인에 @, 확인에는 A 레코드일 경우 나스가 있는 곳의 공인 아이피 주소를, CNAME일 경우 나스가 있는 곳의 공인 아이피 주소와 연결된
다른 도메인(DDNS 등)을 입력하면 됩니다.
나스가 있는 곳이 고정 아이피면 A 레코드를 사용하면 되구요.
유동 아이피 환경이라면 CNAME 레코드를 사용하고 공유기에서 제공하는 DDNS 주소를 입력하면 됩니다.
NS 레코드로 등록된 것은 추가하실 때 레코드 타입을 잘못 설정한 것 같습니다.
제가 *.domain.com 이 인증서를 등록해놨엇네용..
새로 발급받아서 등록하고.. 하니 됩니다..
진짜 3주동안의 고통이 싹 씻겨내려갔습니다.
진심으로 감사합니다. 번거롭게 계속 괴롭힌것은 아닌가 죄송스럽고 감사합니다.
물리적 보답은 당장 할 수 없지만
저도 이설님에게 도움받은것 누군가 필요로한다면 똑같이 나눔하겟습니다. 감사합니다!!
도움이 되어 기쁩니다^^
저도 SSL 인증서 적용한다고 초기에 고생 좀 했었습니다.
현재 본문에 있는 과정이 복잡하기도 하고, 3개월 마다 자동으로 갱신하는 부분도 약간 문제가 있고해서 도커 이용해서 간단히 처리할 수 방법을 준비하려고 합니다.
한 번씩 들러주세요^^
iptime nas2dual에서 되나요?
Python이 설치되면 가능할 것 같습니다만…
nas2dual에서는 안해봐서 정확히 모르겠습니다. 제 nas4dual에 설치된 디스크가 손상되어 지금은 테스트할 수가 없습니다.