오늘 아침 5시부터 잘 돌아가고 있던 서비스의 api가 동작하지 않는 일이 일어났다.
그래서 해당 기업의 대표님 한테서 연락이 와있어서 출근하기 전 빠르게 원인을 알아보려고 했는데, 내 웨일 브라우저에서는 에러가 발생하지 않았다.
웹 빌더의 배포과정에서 에러가 난걸까? 하고 여러가지 계정을 통해 확인해보았지만 에러는 발생하지 않았다.
그래서 회사에서 차분히 대표님의 브라우저나 계정을 확인해보고 테스트 해 보았는데 try-catch로 예외 처리를 해둔 에러문구가 발생했다.
(정말 예외 처리의 중요성을 다시한번..ㅠㅠ)
크롬 브라우저에서 아래와 같은 에러가 발생하고 있었는데 구글링을 잠깐 해보니 SSL이 만료되어서 발생하는 에러인 것 같았다.
GET "https://api~~" NET::ERR_CERT_DATE_INVALID
그래서 SSL Shopper 라는 SSL을 체크해주는 서비스가 있어서 사용해보았고 4일전에 SSL 인증서가 만료되었다고 떳다.
그럼 왜 크롬 외의 브라우저에서는 제대로 동작했는가에 대해선 조금 의문점이 남아있다.
문제를 해결하기 위해선 EC2 내부의 SSL 인증서를 재발급 해야하는 상황이였는데, 해당 프로젝트의 api만 받아서 썻지 백엔드 구조에 대한 이해는 거의 없어서 난감했다..
하지만, 군대가 사람이 빠져도 어떻게든 돌아가던걸 경험해서 그런지 똑같은 개발인데 그냥 하면 되지 않을까 생각했다.
(사실 실제로 운영되고 있던 서비스라 큰일이 나면 어쩌지라는 생각도 있었는데 에러를 고치는게 더 급했던 것 같다)
해결과정
우선 AWS EC2에 접근을 해보려고 했는데 되지 않았다. 그래서 putty를 통해서 EC2에 접근해야 했다.
putty를 통한 AWS 접근 과정은 해당 블로그 글을 참고하면 좋을 것 같다.
(만약 Connection > SSH > Auth로 접근했는데 "private key file for authentication:" 이 없다면, Connection > SSH > Auth > Credentials로 가면 있을 것이다!)
해당 프로젝트의 경우 Let's Encrypt를 사용하고 있었기에, certbot을 통해 ssl 인증서를 발급, 갱신 해야 했다.
EC2에 접속 해서 우선 $sudo certbot renew
을 실행시켜 보았는데 에러가 발생했다.
만약 다음과 같이 log가 나왔다면 실패한 것이다. (your.domain 부분은 원래 도메인을 임의로 가려둔 것이다.)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your.domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator apache, Installer apache
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for your.domain
Waiting for verification...
Challenge failed for domain your.domain
http-01 challenge for your.domain
Cleaning up challenges
Attempting to renew cert (your.domain) from /etc/letsencrypt/renewal/your.domain.conf produced an unexpected error: Some challenges have failed.. Skipping.
All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/your.domain/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
All renewal attempts failed. The following certs could not be renewed:
/etc/letsencrypt/live/your.domain/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)
IMPORTANT NOTES:
- The following errors were reported by the server:
Domain: your.domain
Type: unauthorized
Detail: 54.xxx.xxx.xxx: Invalid response from
http://your.domain/.well-known/acme-challenge/...:
404
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A/AAAA record(s) for that domain
contain(s) the right IP address.
위의 에러는 Let's Encrypt가 http-01 챌린지를 통해 도메인의 소유권을 확인하려 했지만, 지정된 경로에 필요한 인증 파일을 찾지 못해 실패한 경우하고 한다.
그래서 해결방법에 대해 구글링을 해보니까 $sudo certbot renew
방식을 사용 할때는 apache나 nginx 등 웹서버를 멈추고 갱신해야 한다고도 하고 80포트가 열려 있어야 한다고도 한다. 나 같은 경우 전자의 방식은 웹서버를 멈추기가 불가능했고 후자의 방식은 이미 되어있었기에 다른 방식을 찾아 보았고 webroot 인증 방식을 사용해보기로 했다.
webroot 인증 방식은 웹 서버의 웹루트 디렉토리를 통해 Let's Encrypt 인증을 수행하는 방식이다. 이 방식에서는 Certbot이 임시 파일을 생성하고, Let's Encrypt 서버가 그 파일에 접근할 수 있는지 확인하여 인증을 한다고 한다.
webroot 방식을 사용할 경우에는 웹서버가 이미 실행 중이어도 인증서 갱신이 가능하다고 한다.
그래서 $sudo certbot renew -a webroot -w /var/www/html
다음 명령여를 입력해 보았고 해결할 수 있었다.
(만약 뒤에 --dry-run을 옵션으로 붙이면, 인증서 갱신을 실제로 수행하지 않고 시물레이션만 하겠다는 말이다.)
위의 명령어를 정확히 얘기하자면 다음과 같다.
$sudo certbot renew -a webroot -w [웹 서버의 DocumentRoot 디렉토리 경로]
DocumentRoot의 디렉토리 경로는 보통 /etc/apache2/sites-available/000-default.conf 이며 따로 세팅을 해둔경우 /etc/apache2/sites-available/your-site-domain.conf 일수도 있다.
만약 le-redirect-xxx.conf로 된 파일이 있다면 이 파일은 Let's Encrypt에서 HTTP 요청을 HTTPS로 리다이렉트 하는 역할만 하기 때문에, 실제로 리소스가 어디에 위치하는지는 정의되어 있지 않다. 그렇기 때문에 이 파일은 무시해도 좋다.
여튼 000-default.conf으로된 이 파일을 vi나 cat으로 까보면
<VirtualHost domain.your-site.kr:80>
ServerName domain.your-site.kr
ServerAlias domain.your-site.kr
DocumentRoot /var/www/html
</VirtualHost>
로 되어있어 확인이 가능하다.
그런데 DocumentRoot가var/www
로 되어 있어도/var/www/html
로 실행시켜야 되는 경우가 있는 것 같으니 혹시 안된다면 시도해보자.
만약 다음과 같이 log가 나왔다면 성공한 것이다. (your.domain 부분은 원래 도메인을 임의로 가려둔 것이다.)
ubuntu@ip-172-31-15-xxx:/etc/apache2/sites-available$ sudo certbot renew -a webroot -w /var/www/html --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/your.domain.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator webroot, Installer apache
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for your.domain
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/your.domain/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/your.domain/fullchain.pem (success)
이 경우 SSL 인증서가 다시 갱신된 것이다.
뭔가 SSL과 apache에 대한 개념이 부족하다 보니 pem, ppk, ssl 이나 에러에 대한 명확한 글을 쓰기가 어려웠다.
글을 쓰면서 차후 SSL 인증 방식에 대한 공부를 하고 추가적인 글을 써봐야 겠다는 생각이 들었다.
사실 pem을 추출하기 위해 Winscp를 사용해 삽질한 부분도 있는데 해당 글은 여기서 끝내는 것이 깔끔해 보인다.
또 느낀점이 있다면 분야를 가리지 말고 경험을 해보는 것이 정말 중요하다고 느낀다.
이건 개발 뿐만이 아니라 인생관이기도 하지만 항상 어떤 곳이든 사람이든 배울점은 있다.
정말 인턴을 하면서 에이전시라서 다양한 경험을 해볼 수 있는게 정말 좋은 경험인 것 같다.
'Programming' 카테고리의 다른 글
[우테코 프리코스/7기] 커밋 방식 알아보기 (4) | 2024.10.16 |
---|---|
[우테코 프리코스/7기] 본격적인 시작 전 준비 (0) | 2024.10.15 |
내가 생각하는 프로젝트 규모에 따른 프론트 기술스택 선정기준 (0) | 2024.08.24 |
[Webflow] Scroll into view 애니메이션이 한 번 밖에 실행이 안될때 (0) | 2024.07.13 |
[AWS EC2] 프론트를 배포해 둔 인스턴스의 용량이 가득 찬다면 (2) | 2024.07.12 |