오늘은 성공기 입니다! ㅎㅎ
지난 포스팅에서 다른 방법으로 ssl-key를 발급 받기로 했었죠?
마지막 남은 그 방법으로 ssl-key를 발급받고 어떻게 배포했는지까지 자세히 한번 포스팅해보도록 하겠습니다!
저희와 비슷한 환경에서 프로젝트를 진행했다면 많은 도움일 될거라 생각합니다 😁😁
1. Cerbot으로 ssl-key 발급받기: DNS TXT 방법
마지막 남은 방법은 dns txt 방법입니다...
sudocertbotcertonly --manual --preferred-challenges=dns -d [구매한도메인]
이렇게 터미널에서 입력하면!!
kimseeun@gimseeuns-MacBook-Air ~ % sudo certbot certonly--manual --preferred-challenges=dns -d [구입한 도메인]
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for [구입한 도메인]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.[구입한 도메인].
with the following value:
[cerbot에서 넣으라고 알려준 값]
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: <https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.[구입한> 도메인].
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.
이런식으로 나올텐데요..! "_acme-challenge.[구입한 도메인]."얘랑, [cerbot에서 넣으라고 알려준 값]얘를 도메인을 구입한 사이트에가서 dns txt에 넣어주면 됩니다.
저는 amazone route53에서 구매해서 바로 등록해주었습니다.
넣은 후 save버튼을 눌러주고 다시 터미널로 돌아와서 엔터를 눌러주면~~!!
kimseeun@gimseeuns-MacBook-Air ~ % sudo certbot certonly--manual --preferred-challenges=dns -d [구입한 도메인]
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for [구입한 도메인]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.[구입한도메인].
with the following value:
[cerbot에서 넣으라고 알려준 값]
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: <https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.[구입한> 도메인].
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/[구입한 도메인]/fullchain.pem
Key is saved at: /etc/letsencrypt/live/[구입한 도메인]/privkey.pem
This certificate expires on [만료되는 날짜].
These files will be updated when the certificate renews.
NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
짠! 키가 생성되었음을 확인할 수 있습니다! fullchain.pem와 privkey.pem이 생성되었음을 볼 수 있죠.
그리고 90일뒤에 만료가 됩니다. 근데 dns방식의 가장 큰 단점은... 자동으로 갱신이 되지 않는다는점...!ㅠㅠ 만료될쯤에 다시 찾아와서 갱신하는 법도 포스팅 해보겠습니다...!
저렇게 두가지 key가 생성되었는데 fullchain.pem, privkey.pem은 각각 사설 인증서에서의 cert.pem, key.pem에 대응된다고 보시면 됩니다.
근데 Keystore.p12파일이 없죠? springboot에서 Https로 작동하게 하려면 keystore.p12파일이 필요합니다.
2. keystore.p12파일 만들고 springboot앱 내에 넣기
지금부터는 발급받은 2개의 키로부터 keystore.p12를 만들어서 springboot 앱 내에 넣는 과정을 보여드리도록 하겠습니다!
처음엔 쉽게 생각하고 생성된 경로에다가 넣어줘야지 했는데 에러가 납니다,,,ㅎ
kimseeun@gimseeuns-MacBook-Air ~ % sudo cp /etc/letsencrypt/live/[도메인]/fullchain.pem [넣고싶은경로]/fullchain.pem
sudo cp /etc/letsencrypt/live/[도메인]/privkey.pem [넣고싶은경로]/privkey.pem
Password:
kimseeun@gimseeuns-MacBook-Air ~ % openssl pkcs12 -export -in [넣고싶은경로]/fullchain.pem -inkey [넣고싶은경로]/privkey.pem -out ~/Documents/ahwhew/keystore.p12 -name tomcat
Could not open file or uri for loading private key from -inkey file from [넣고싶은경로]/privkey.pem
C01E9CE301000000:error:8000000D:system library:BIO_new_file:Permission denied:crypto/bio/bss_file.c:67:calling fopen([넣고싶은경로]/privkey.pem, rb)
C01E9CE301000000:error:10080002:BIO routines:BIO_new_file:system lib:crypto/bio/bss_file.c:77:
파일을 열수가 없답니다...ㅎ
그렇다면 루트권한으로!
sudo chown kimseeun ~[넣고싶은경로]/privkey.pem
그리고 다시!
kimseeun@gimseeuns-MacBook-Air ~ % openssl pkcs12 -export -in ~[넣고싶은경로]/fullchain.pem -inkey ~[넣고싶은경로]/privkey.pem -out ~[넣고싶은경로]/keystore.p12 -name tomcat
Enter Export Password:
Verifying - Enter Export Password:
비번은 생성할때의 비번을 눌러주면 됩니다!
그러면!!! 드디어!!!
springboot앱 내에 keystore.p12파일이 들어와있는걸 확인할 수 있습니다!!
이제 keystore.p12파일을 ahwhew/src/main/resources/keystore.p12 에 위치시켜줍니다.
application.properties도 설정해주어야겠죠?
server.port=443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=[비밀번호]
포트는 일단 https기본 포트인 443으로 설정해두었습니다!
3. next.js파일 설정
백엔드에 https를 적용했으니 프론트도 https를 적용해줘야겠죠?
사설 ssl-key였던 cert.pem과 key.pem을 각각 fullchain.pem, privkey.pem으로 대체해주면 됩니다.
next.config.js
const fs = require('fs');
const path = require('path');
const nextConfig = {
server: {
https: {
key: fs.readFileSync(path.join(__dirname, 'privkey.pem')),
cert: fs.readFileSync(path.join(__dirname, 'fullchain.pem')),
},
},
reactStrictMode: false,
async rewrites() {
return [
{
source: '/naver/:path*',
destination: '<https://openapi.naver.com/:path*>',
},
];
},
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'media1.jjalkey.com',
},
{
protocol: 'https',
hostname: 'www.ahwhew.com',
},
{
protocol: 'https',
hostname: 'example-bucket-seeun.s3.ap-northeast-2.amazonaws.com',
},
],
},
output: 'standalone',
};
module.exports = nextConfig;
이렇게 설정해주면 됩니다!
이제 서버, 프론트 각각 docker build 후 hub에 push하고 vm에서 pull 받아서 Run하면 됩니다!
4. (추가) docker portmapping
저는 프로젝트에서 서버측 포트를 443말고 8443으로 설정해서 해 보았습니다! 이렇게 하려면 443으로 오는 요청을 8443으로 보내줘야하는데요! 이걸 하는게 docker portmapping이라는 겁니다!
next.js의 기본 포트는 3000번이고, 서버는 8443으로 설정을 해 주었는데요,
application.properties
server.port=8443
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=[비밀번호]
이렇게 하면 Springboot의 포트를 8443으로 설정할 수 있습니다.
그러면 80포트는 막아두었고 80포트로 오는 요청은 443으로 리다이렉트 되도록 로드밸런서로 설정해두었죠?
그럼 Nextjs의 docker portmapping은 어떻게 하면 될까요?? 3000번으로 가도록 해두어야 겠죠?
그럼 서버는요?
docker run -p 443:8443 -d [도커허브에 올린 이미지 이름]
이렇게 포트매핑을 해서 실행시키면 됩니다!
도커 포트 매핑이란 위에서 알 수 있듯이 443들어오면 8443으로 리다이렉팅 한다는 것이지 컨테이너의 포트번호 자체를 바꾼다는 것이 아닙니다. 이렇게 docker 포트매핑을 하면 Parent host에서 컨테이너에 있는 특정 포트로 접속이 가능하게 할 수 있습니다!
지난 포스팅에 이어서 이번에는 성공기를 한번 쭉 적어보았는데요... 사실 이거 글로 적으니 2편밖에 안되는 분량이지만 이거때메 일주일은 끙끙 거렸습니다,,,,ㅜ 부디 이걸 보는 여러분은 한번만에 성공하시길!
사실 저는 이번에 배포과정에서 여러가지 겪으면서 인프런에서 강의 하나를 완강했답니다ㅎㅎ 덕분에 도커도, 가상머신도 조금 더 자세하게 알게되었고, AWS에서 ECS, LIghtsail, EC2 각각 어떤 특징과 장단점이 있는지도 알게되었습니다! 쿠버네티스도 어느정도 맛보기를 해보았구용! 이것들도 한번 포스팅하도록 해보겠습니다!
AHWHEW프로젝트 HTTPS배포에 대한 트러블 슈팅 포스팅은 아마 다음에 갱신하는 과정으로 돌아오지 않을까 싶네요 ㅎㅎ
'프로젝트 > AHWHEW' 카테고리의 다른 글
[AHWHEW] Next.js+Springboot+Docker배포시 발생한 트러블 슈팅 정리-(1)사전 작업 및 프로젝트 배포환경, ssl-key 발급(실패기) (1) | 2024.01.27 |
---|