๋๋ฉ์ธ์ด ์๋ค๋ฉด ๋จผ์ ๋ฌด๋ฃ ๋๋ฉ์ธ์ ๋ฐ๊ธ๋ฐ์ต๋๋ค. ๋ฌด๋ฃ ๋๋ฉ์ธ ๋ฐ๊ธ ์ฌ์ดํธ๋ ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐ ๋ถํ๋๋ฆฝ๋๋ค.
Let's Encrypt์์ SSL ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐฉ๋ฒ์ ๋๋ค.
1. ๋ช ๋ น์ด ์ ๋ ฅ
ํฐ๋ฏธ๋์ ์ด์ด ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํฉ๋๋ค.
sudo certbot certonly --manual
2. E-mail ์ฃผ์ ๋ฐ ๋๋ฉ์ธ ์ ๋ ฅ ํ ์น ์์ค ๋ฐ์ ๋ฐ key ํ์ผ ์ ์ฅ
ํ๋ฒ ์ด๋ฉ์ผ ๋ฑ๋กํ๊ณ ๋๋ฉ์ธ ์ ๋ ฅ ํ ์ธ์ฆ ๊ณผ์ ์์ ์ค๋ฅ ๋๋ฉด ๊ทธ๋ค์ ๋ฒ ์งํ์ ๋ฐ๋ก ๋๋ฉ์ธ ์ ๋ ฅํ๋ผ๊ณ ๋น๋๋ค. ๋๋ฉ์ธ ์ ๋ ฅํ๋ฉด ํฐ๋ฏธ๋์ ์๋์ ๊ฐ์ด ๋ฉ์์ง๊ฐ ๋ฐ์ํฉ๋๋ค.
์ ๋ฉ์์ง ๋ง๋๋ก ํ์ผ ์์ ํค ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํฉ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ์ URL๋ก ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๋๋ก ์น์์ค๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
app.get('/.well-known/acme-challenge/ํ์ผ์ฃผ์๋ช
', function(req,res) {
fs.readFile(__dirname + "/.well-known/acme-challenge/ํ์ผ์ฃผ์๋ช
", 'utf8' , (err, data) => {
if (err) {
console.error(err)
return
}
res.send(data);
})
})
์์ ํ ์น์ ๋ค์ ๊ตฌ๋ํฉ๋๋ค. ์ฆ http://๋๋ฉ์ธ~~ / ํธ์ถํ๋ฉด ์ ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๋ผ ๋ค์ ํฐ๋ฏธ๋๋ก ๋์์ enter๋ฅผ ์
๋ ฅํ์ฌ ์ ์์ ์ธ ๋ฐ๊ธ์ ํ์ธํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ ๋ก ์ ๋ ์๋์ ๊ฐ์ด ์ค๋ฅ๊ฐ 2๋ฒ์ด๋ ๋ฐ์ํ์ฌ ์์ ํ ํ ์ ์ ๋ฐ๊ธํ์์ต๋๋ค.
3. ์ ์์ ์ธ. pem ์ธ์ฆ ๊ด๋ จ ํ์ผ ์์ฑ, ์ ํจ๊ธฐ๊ฐ ํ์ธ(3๊ฐ์)
๋ฐ๊ธ ์งํ์ด ์ ๋๋ฉด ์๋ ๊ฒฝ๋ก์. pem ํ์ผ์ด ์์ฑ๋ฉ๋๋ค.
fullchain.pem
privkey.pem
4. ์น ์์ค์ ๋ฐ์ ๋ฐ 443 port ์ด๊ธฐ
๋ฐ๋ก ์น์์ค์์ https ๊ด๋ จ ์์ค ์ ์ฉํฉ๋๋ค.
var ca = fs.readFileSync('/etc/letsencrypt/live/odaily.kro.kr/fullchain.pem')
var privateKey = fs.readFileSync('/etc/letsencrypt/live/odaily.kro.kr/privkey.pem')
var certificate = fs.readFileSync('/etc/letsencrypt/live/odaily.kro.kr/cert.pem')
const credentials = { key: privateKey, cert: certificate, ca: ca }
var app = express()
app.use(express.static('public'));
http.createServer(app).listen(80)
https.createServer(credentials, app).listen(443)
์น ์๋ฒ ์ฌ๊ตฌ๋์ ์ ์์ ์ผ๋ก https๊ฐ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์น ์๋ฒ๋ถํฐ ๋์ฐ๋ ๊ฑธ ์๊ณ ์ถ๋ค๋ฉด ์๋ ๋งํฌ๋ถํฐ ํ์ธํด๋ณด์ธ์
๋๊ธ