SSL ์ธ์ฆ์
์๋ ํ์ธ์ Mambo ์ ๋๋ค.
์ค๋์ ์น์ฌ์ดํธ ์ ์ ์ ํ์์ ์ผ๋ก ์ฌ์ฉ๋๋ HTTPS ๊ทธ๋ฆฌ๊ณ SSL ์ธ์ฆ์์ ๋ํด ์ด์ผ๊ธฐํ๋ คํฉ๋๋ค. ํ์ฌ์์ ์ด์์ค์ธ ์น ์๋น์ค๋ฅผ HTTPS๋ก ๋ฐฐํฌ๋๊ณ ์์ผ๋ ์ ์ SSL์ ๋ํ ๋ถ๋ถ์ ๋จธ๋ฆฌ์์์ ๋ณต์กํ๊ฒ ์ฝํ ์ ๋๋ก ์ ๋ฆฌ๋์ง์์ ์ํ์ ๋๋ค. ์ด ๊ธ์ ์์ฑํ๋ฉด์ ์ฝํ์๋ ๋ถ๋ถ์ ํ๋์ฉ ํ์ด๋๊ฐ๋ฉด์ SSL์ ๋ํ ๊ฐ๋ ์ ํ๋ฆฝํด๋ณด๊ณ ์ ํฉ๋๋ค.
HTTPS
์ผ๋ฐ ์ฌ๋๋ค์ด ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด์ฉํด์ ์น ์ฌ์ดํธ์ ์ ์ํ ๋ HTTPS๊ฐ ์ ์ฉ๋์๋์ง์ ๋ํด์ ์ ๊ฒฝ์ฐ์ง ์์ต๋๋ค. ํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ฅผ ์ด์ํ๋ ์ฌ๋๋ค์๊ฒ HTTPS๋ ์ฌ์ฉ์์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ํธํํด์ ์์กฐ ๋๋ ๋ณ์กฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ ์์ฃผ ์ค์ํ ํ์ค ๋ณด์ ๊ธฐ์ ์ ๋๋ค.
ํฌ๋กฌ๊ณผ ๊ฐ์ ๋ธ๋ผ์ฐ์ ์์๋ HTTPS์ ๊ฐ์ ๋ณด์ ํ๋กํ ์ฝ์ด ์ ์ฉ๋์๋์ง๋ฅผ ํ์ธํ๊ณ ์ฌ์ฉ์๋ค์๊ฒ ์ ๋ขฐํ ์ ์๋ ์ฌ์ดํธ์ธ์ง๋ฅผ ์๋ดํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ ์์ ๋๋ํ๋ ์๋ฌผ์ ์์ด์ฝ์ ๋ณด์ ์ ์์ผ์ ๊ฐ์? ์ฌ๋ฌ๋ถ์ ์น ์ฌ์ดํธ๊ฐ ์๋ฌผ์ ์์ด์ฝ์ ๊ฐ์ง๋ค๋ฉด ๋ณด์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ ๋ขฐํ ์ ์๋ ์ฌ์ดํธ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
HTTPS๋ HTTP๋ผ๋ ์ ์ก ํ๋กํ ์ฝ๊ณผ ํจ๊ป ๋ฐ์ดํฐ๋ฅผ ์๋ณตํธํํ๊ธฐ ์ํ ๋ณด์ ํ๋กํ ์ฝ์ ๊ฐ์ด ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ์ ์ธ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์ ๋ํด์๋ ๊ฐ์ํด์ผํฉ๋๋ค. ํ์ง๋ง, ์ต๊ทผ ์ปดํจํฐ๋ค์ CPU ์ฑ๋ฅ์ด ์ข์์ง์ ๋ฐ๋ผ์ ์๋ณตํธํ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋นํ ๋ฏธ๋ฏธํ๋ฉฐ ๋คํธ์ํฌ ๊ธฐ์ ์ ๋ฐ์ ์ผ๋ก ๋ ์ดํด์๋ ์ค์ด๋ค์๊ธฐ ๋๋ฌธ์ HTTPS์ ์ฌ์ฉํ๋ค๊ณ ํด์ ์ฌ์ฉ์๊ฐ ์์ฒญํ๊ณ ์๋ตํ๊ธฐ๊น์ง์ ์๊ฐ์ด ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ด์ง๋ ์์ต๋๋ค.
TLS ํธ๋์์ดํฌ
HTTPS๊ฐ ์ ์ฉ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด์๋ ํด๋ผ์ด์ธํธ์ธ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ TLS ํธ๋์์ดํฌ ๊ณผ์ ์ ์ํํด์ผํฉ๋๋ค.
TLS ํธ๋์์ดํฌ๋ ์น ์์ฒญ์ ๋ํ ์ ๋ขฐ์ฑ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ฑฐ๋ ํต์ ๋ฐ์ดํฐ๋ฅผ ์๋ณตํธํํ๊ธฐ ์ํ ๋ฐฉ์์ ์๋ก ๊ตํํ๊ธฐ ์ํด ์ํํ๋ ๊ณผ์ ์ ๋๋ค. ์ ํด๋ผ์ฐ๋ํ๋ ์ด์์ ์ค๋ช ํ๋ TLS ํธ๋์์ดํฌ ๊ณผ์ ์ ์ดํด๋ณด๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ์(Certificate)๋ฅผ ์ ๊ณตํ๊ณ ์๋ก ์ํธํ ๋ฐฉ์(CipherSpec)์ ๊ตํํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ๋๊ตฌ ์ค ๋ณด์ ํญ์์ TLS ํธ๋์์ดํฌ ๊ณผ์ ์ ์ํด ๊ฒฐ์ ๋ ์ฌ๋ฌ๊ฐ์ง ์ฌํญ๋ค์ ํ์ธํ ์ ์์ต๋๋ค.
๋ค์ด๋ฒ ์น ์ฌ์ดํธ๋ DigiCert๋ผ๋ ์ธ์ฆ๊ธฐ๊ด์์ ๋ฐํํ SSL ์ธ์ฆ์๋ฅผ ์ ๊ณตํ์๊ณ TLS 1.3 ๋ฒ์ ๊ณผ ํจ๊ป X25519 ๋ฐฉ์์ผ๋ก ํค๋ฅผ ๊ตํํ๊ณ AES_256_GCM์ผ๋ก ์ํธํํ๋ฉฐ ํ์ฌ์์ ์ด์์ค์ธ ์น ์๋น์ค๋ ๋ค์ด๋ฒ์ ๋ค๋ฅด๊ฒ TLS 1.2, ECDHE_ECDSA, AES_128_GCM์ ์ฌ์ฉํฉ๋๋ค. ์ฌ๋ฌ๋ถ๋ค๋ HTTPS๋ฅผ ์ ์ฉํ ์น ์ฌ์ดํธ๋ฅผ ์ด์์ค์ด๊ฑฐ๋ ๊ถ๊ธํ ์ฌ์ดํธ๊ฐ ์๋ค๋ฉด ์ด๋ค ์ฌํญ์ผ๋ก ๊ฒฐ์ ๋์๋์ง ํ์ธํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค. TLS ํธ๋์์ดํฌ ๊ณผ์ ์ ์ํด ๊ฒฐ์ ๋๋ ์ฌํญ๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ์ง์ํ๋ ์ฌํญ๋ค๊ณผ ํด๋ผ์ด์ธํธ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ฌํญ๋ค์ ๋ํด์ ํ๋์ฉ ์์๋ณด๋๋ก ํ์ฃ .
TLS ๋ฒ์
TLS ๋ฒ์ ์ TLS ํธ๋์์ดํฌ ๊ณผ์ ์ ์ํํ๋ ๋ฐฉ์์ ๋งํฉ๋๋ค. ๋น์ฐ์ค๋ฝ๊ฒ๋ ๋ฒ์ ์ด ๋์ TLS 1.3์ด TLS 1.2๋ณด๋ค ํจ์จ์ ์ธ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์ง์ํ๋ TLS ๋ฒ์ ์ค ๊ฐ์ฅ ๋์ ๋ฒ์ ์ผ๋ก TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ๋ง์ฝ, ํด๋ผ์ด์ธํธ๊ฐ TLS 1.1๊น์ง๋ง ์ฌ์ฉํ ์ ์๋๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ TLS 1.2 ์ด์์ ์๊ตฌํ๋ค๋ฉด ์ผ์นํ๋ TLS ๋ฒ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ TLS 1.1์ ์ฌ์ฉํ๊ณ ์ํ๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ ๊ฑฐ๋ถํ๊ฒ ๋ฉ๋๋ค.
ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฏธ TLS 1.0๊ณผ TLS 1.1 ๋ฒ์ ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ์ต์ํ TLS 1.2 ๋ฒ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํด์ผํฉ๋๋ค.
์๋ ํ์ฌ์์ ์ด์์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณธ ๊ฒฝ์ฐ๋ก SSLv3, TLSv1.0, TLS v1.1๋ฑ์ TLS ๋ฒ์ ์ ์ฌ์ฉํ๋ ค๋ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๊ฑฐ๋ถ๋ ๊ฒ์ด ์ค๋ฅ ๋ก๊ทธ๋ก ์ถ๋ ฅ๋ ์ํฉ์ ๋ณด์ฌ์ค๋๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ AWS Beanstalk์ ํจ๊ป NLB(Network Load Balancer)๋ฅผ ์ฌ์ฉํ๋ฉฐ NLB๋ TCP ํธ๋ํฝ์ ๋ํ์ฌ ๋ถ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก ํ๋ก์๋๋๋ก ๊ตฌ์ฑํ๊ธฐ๋๋ฌธ์ L4 ๋ก๋๋ฐธ๋ฐ์์์ TLS ํธ๋์์ดํฌ๊ฐ ์ฒ๋ฆฌ๋์ง ์์์์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค.
NLB์์ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ๋๋ก ์ค์ ํ ์๋ ์์ผ๋ฉฐ IT ์ธํ๋ผ ์ TLS ํธ๋์์ดํฌ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์ํํ๋ ๊ฒ์ด ์๋ชป๋ ๊ตฌ์ฑ์ ์๋๋๋ค.
HTTP/3 ๊ทธ๋ฆฌ๊ณ QUIC
ํต์ ํ๋กํ ์ฝ์ ๋ํด์ ๊ด์ฌ์ด ์๋ ๋ถ๋ค์ QUIC ์ด๋ผ๊ณ ํ๋ ์ ์ก ํ๋กํ ์ฝ์ ๋ํด์ ๋ค์ด๋ณด์ ์ ์์ผ์ค ๊ฒ๋๋ค. TCP๊ฐ ์๋ ์ค๋ฒํค๋๊ฐ ์ ์ UDP๋ฅผ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ๋ก ๊ตฌ๊ธ ์น ์ฌ์ดํธ์ ๋ํด TLS ํธ๋์์ดํฌ ๊ณผ์ ์ ์ํด ๊ฒฐ์ ๋ ์ฌํญ์ ํ์ธํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด TLS๊ฐ ์๋ QUIC์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
QUIC์ TLS๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋๋ก ๋์ด์์ผ๋ฉฐ TLS๋ ๋ณด์ ํ๋กํ ์ฝ์ด๊ธฐ ๋๋ฌธ์ HTTP๊ฐ ์๋ ์ ์ก ํ๋กํ ์ฝ๊ณผ๋ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ ์ ๋๋ค. ๊ตฌ๊ธ ์น ์ฌ์ดํธ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ๋ถ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฑ ์ ์ ์ปจํ ์ธ ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด ์ฌ์ฉํ๋ CDN ์๋ฒ๋ฅผ ์ดํด๋ณด๋ฉด h3-29๋ผ๊ณ ํ๋ QUIC์ ํ์ค ์ด๋ฆ์ ํ์ธํ ์ ์์ต๋๋ค.
์๋ฌดํผ ๋ค์ TLS ๋ฒ์ ์ ๋ํ ์ฌํญ์ ๋ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ตญ๋ด ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ ์ค ํ๋์ธ OKKY ์ฌ์ดํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์ง์ํ๋ TLS ๋ฒ์ ์ ํ์ธํด๋ณด๊ธฐ ์ํด Check TLS Version์ ์ํํด๋ณธ ๊ฒฐ๊ณผ์ ๋๋ค.
TLS 1.3์ ์ ์ธํ ๋๋จธ์ง ๋ฒ์ ์ ์ง์ํ๋ ๊ฒ์ผ๋ก ๋ฆฌํฌํธ ๋์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๋ TLS 1.2 ์ด์์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ TLS 1.3์ ์ง์ํ์ง ์๋๋ผ๋ ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ฌ๋๋ค์ด ๋ง์ด ์ฌ์ฉํ๋ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ TLS 1.2 ์ง์ํ์ง์๋๋ก ๋ฐํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ TLS 1.3์ ์ง์ํ๋๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋ถ๊ฐํผํ ์ํฉ์ด๊ธด ํฉ๋๋ค. ๋ฌผ๋ก , ํ์ฌ์์ ์ด์์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ๋ง์ฐฌ๊ฐ์ง์ธ ์ํฉ์ ๋๋ค.
์ํธํ ์ค์ํธ
์ํธํ ์ค์ํธ(Cipher Suite)๋ ํค ๊ตํ, ์ ์ ์๋ช , ์ํธํ ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ํ ์๊ณ ๋ฆฌ์ฆ์ ์กฐํฉํ ์ํธํ ๋ฐฉ์์ ์ง์นญํฉ๋๋ค. ์์ TLS ํธ๋์์ดํฌ ๊ณผ์ ์์ ๊ฒฐ์ ๋ ์ฌํญ ์ค ECDHE_ECDSA ๊ทธ๋ฆฌ๊ณ AES_128_GCM์ด ์ํธํ ์ค์ํธ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
# [ํ๋กํ ์ฝ]_[ํค ๊ตํ ์๊ณ ๋ฆฌ์ฆ]_[์ ์ ์๋ช
์๊ณ ๋ฆฌ์ฆ]_WITH_[์ํธํ ์๊ณ ๋ฆฌ์ฆ]_[๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ]
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
์ํธํ ์ค์ํธ๋ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ก ์กฐํฉ๋ ๋ฌธ์์ด์ผ๋ก ํํํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด ๋ค์ ๋์ดํด๋ณด๊ฒ ์ต๋๋ค.
- TLS : ํ๋กํ ์ฝ
- ECDHE : ํ์ ๊ณก์ ๋ํผ ํฌ๋ง ํค ๊ตํ
- ECDSA : ํ์ ๊ณก์ ๋์งํธ ์๋ช
- AES_128_GCM : 128 ๋นํธ ๋ธ๋ก ๊ฐ๋ฃจ์/์นด์ดํธ ๋ชจ๋์ AES ์ํธํ
- SHA256 : 256๋นํธ ํด์ ์๊ณ ๋ฆฌ์ฆ
๋ณด์ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋ผ๋ฉด ECDHE-ECDSA๊ฐ ์ด๋ค ์๋ฆฌ๋ ๋์ํ๋์ง๊น์ง๋ ์ ํ์๋ ์์ผ๋ฉฐ ์ด๋ป๊ฒ ํค ๊ตํ์ ํ๊ณ ์ด๋ค ๋ฐฉ์์ผ๋ก ์๋ช ํ๋ฉฐ ์ด๋ป๊ฒ ์ํธํํ๋์ง๋ง ๊ตฌ๋ถํ ์ ์์ผ๋ฉด ๋ฉ๋๋ค. ๊ฒ์ํด๋ณด์๋๋ผ๋ ๋ณด์ ๊ธฐ์ ์ ์ดํดํ๊ธฐ๋ ์ฝ์ง ์์ผ์ค ๊ฒ๋๋ค. (์ฐ๋ฆฌ์ ์๊ฐ์ ์์คํ๋๊น์โฆ)
์ด๋ฌํ ์ํธํ ์ค์ํธ๋ AWS์ ELB(Elastic Load Balancing)์ ๋ณด์ ์ ์ฑ ์์๋ ์ ์ฑ ๋ณ ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
SSL ์ธ์ฆ์
TLS ํธ๋์์ดํฌ ๊ณผ์ ์์ ํด๋ผ์ด์ธํธ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ก๋ถํฐ ๋ฐ๋ SSL ์ธ์ฆ์๋ ๋ธ๋ผ์ฐ์ ํด๋น ์ฌ์ดํธ๋ฅผ ์ ๋ขฐํ ์ ์๋์ง๋ฅผ ํ๋จํ ์ ์๋ ์ค์ํ ์ฌํญ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์์๋ ์์ฒด์ ์ผ๋ก ์ ๋ขฐํ ์ ์๋ ์ธ์ฆ ๊ธฐ๊ด(CA) ์ ๋ํด ๊ด๋ฆฌํ๊ฑฐ๋ ์ด์์ฒด์ ์ ๋ฑ๋ก๋ ๋ฃจํธ ์ธ์ฆ ๊ธฐ๊ด์ ๋ํ ์ ๋ณด๋ฅผ ํ์ฉํด์ ์๋ฒ์์ ์ ๊ณตํ๋ SSL ์ธ์ฆ์๊ฐ ์ ๋ขฐํ ์ ์๋ ๊ธฐ๊ด์ผ๋ก๋ถํฐ ๋ฐ๊ธ๋ ๊ฒ์ธ์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์์ ์ ๊ณต๋ฐ์ SSL ์ธ์ฆ์๋ ๋ฃจํธ ์ธ์ฆ ๊ธฐ๊ด(CA)์์ ์ธ์ฆํ๋ ์ค๊ฐ ์ธ์ฆ ๊ธฐ๊ด(ICA) ์ผ๋ก๋ถํฐ ๋ฐ๊ธ๋ฐ์ ์ธ์ฆ์์ด๋ฉฐ ์ด๋ฅผ ์ฒด์ธ ์ธ์ฆ์๋ผ๊ณ ํฉ๋๋ค. Sectigo์ DigiCert ๊ทธ๋ฆฌ๊ณ GlobalSign์ ๋ง์ด ์ฌ์ฉ๋์ด์ง๋ ์ ๋ขฐํ ์ ์๋ ๋ฃจํธ ์ธ์ฆ ๊ธฐ๊ด์ ๋๋ค.
์ํธํ ์ค์ํธ ์ค ECDSA์ ๊ฐ์ ํ์ ๊ณก์ ๋์งํธ ์๋ช ์ผ๋ก ๋ฐ๊ธ๋ ์ธ์ฆ์๋ฅผ ECC ์ธ์ฆ์๋ผ๊ณ ํ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํด์๋ RSA ๊ธฐ๋ฐ์ ์ธ์ฆ์๋ณด๋ค ํธ๋ํฝ์ด ๋ง์ ์๋น์ค์์ ์๋ณตํธํ์ ๋ํ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธ์ฆ์์ ๋๋ค.
์ด ๊ธ์์๋ ํ์ ๊ณก์ ํ ์๋ช ๋ฐฉ์์ผ๋ก ๋ฐ๊ธํ๋ ECC ์ธ์ฆ์๋ฅผ ๋ง๋ค์ด๋ณผ ์์ ์ ๋๋ค.
์์ฒด ์๋ช ์ธ์ฆ์
์์ฒด ์๋ช ์ธ์ฆ์๋ ์ ๋ขฐํ ์ ์๋ ์ธ์ฆ ๊ธฐ๊ด์ผ๋ก๋ถํฐ ๋ฐ๊ธ๋ฐ์ง ์๊ณ ์ง์ ๋ง๋๋ ์ธ์ฆ์๋ฅผ ๋งํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๋จ๊ณ์์ ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ฉ์ธ์ ๊ตฌ์ ํ๊ณ ์ธ์ฆ ๊ธฐ๊ด์ผ๋ก๋ถํฐ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธฐ๊น์ง์ ๊ณผ์ ์ ๋น์ฅ ์ํํ์ง ์์๋ ๋๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ณด์ ์ค์ธ ๋๋ฉ์ธ์ด ์๋ค๋ฉด Letโs Encrypt์ ํตํด ๋ฌด๋ฃ๋ก SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธ๋ฐ์์๋ ์์ต๋๋ค. ์ ๋ ๋ณด์ ์ค์ธ ๋๋ฉ์ธ์ด ์๊ธฐ ๋๋ฌธ์ OpenSSL ๋๋ ์๋ฐ์ Keystore ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ๋ง๋ค์ด๋ณผ ์์ ์ ๋๋ค.
์ด ๊ธ์์๋ ์ธ์ฆ ๊ธฐ๊ด์์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ๋ํ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ ๋ ์๋ช ํด์ฃผ๋ ๊ฒ๊ณผ ๋์ผํ๊ฒ ์์ฒด ์๋ช CA ์ธ์ฆ์๋ฅผ ๋ง๋ค๊ณ ์ด๊ฒ์ผ๋ก ์๋ช ๋ ์๋ฒ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๋ ๊ณผ์ ์ ๋ณด์ฌ์ค๋๋ค. ์ด ๊ณผ์ ์ ํตํด ์ฌ๋ฌ๋ถ์ ๋ฐ๊ธ๋ฐ์ SSL ์๋ฒ ์ธ์ฆ์๊ฐ ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณ ๋ฐ๊ธ๋์๋์ง๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
์์ฒด ์๋ช CA ์ธ์ฆ์ ๋ฐ๊ธ
๋จผ์ , ๋ก์ปฌ ํธ์คํธ์์๋ ์ ๋ขฐํ ์ ์๋ค๊ณ ๋ณด์ฅํ๋ CA ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ์ธ์ฆ์๋ ๋ค์ํ ํ์์ผ๋ก ๋ง๋ค์ด์ง ์ ์์ผ๋ OpenSSL ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ฆ์๋ฅผ ๋ง๋ค๋ฉด PEM ํ์์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ๋ง์ฝ, ์ฌ๋ฌ๋ถ์ด ์ธ์ฆ ๊ธฐ๊ด์ผ๋ก๋ถํฐ ๋ฐ๊ธ๋ฐ๋ ์ธ์ฆ์ ํ์์ด ๋ค๋ฅด๋๋ผ๋ ๋ค๋ฅธ ํ์์ ์ธ์ฆ์๋ก ๋ณํํ ์ ์์ผ๋ ๊ฑฑ์ ํ์ง ์์ผ์ ๋ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ๊ธ๋ PEM ํ์์ ์๋ฒ ์ธ์ฆ์๋ฅผ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๊ธฐ ์ํด KeyStore ํ์์ ์ธ์ฆ์๋ก ๋ณํํด์ผํ๋ ๊ฒฝ์ฐ๋ฅผ ๋งํฉ๋๋ค.
OpenSSL์ผ๋ก ์์ฒด ์๋ช CA ์ธ์ฆ์๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ๊ฐ์ธํค์ ์ธ์ฆ์ ์๋ช ์์ฒญ(CSR)์ ๋จผ์ ์์ฑํด์ผํฉ๋๋ค. ์์ ์ธ๊ธํ๋ ๊ฒ ์ฒ๋ผ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๊ธํ๋ RSA ๊ธฐ๋ฐ์ ๊ฐ์ธํค๊ฐ ์๋ ECC ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ๊ธฐ ์ํ ECDSA ๊ธฐ๋ฐ์ ๊ฐ์ธํค๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
# ECDSA ๊ธฐ๋ฐ์ ๊ฐ์ธํค ์์ฑ
PS openssl ecparam -out ca.key -name prime256v1 -genkey
# ์ธ์ฆ์ ์๋ช
์์ฒญ(CSR) ์์ฑ
PS openssl req -new -sha256 -subj /C=KO/ST=None/L=None/O=None/CN=CA -key ca.key -out ca.csr
์ ๋ช ๋ น์ด ์์์์ ๊ฐ์ธํค๋ฅผ ๋ง๋ค๋ ์ฌ์ฉ๋ prime256v1์ ํ์ ๊ณก์ ํ ์๋ช ๋ฐฉ์์ ์ง์นญํ๋ ์ด๋ฆ์ ๋๋ค. ๋ช ๋ น์ด๋ฅผ ์ํํ๊ณ ๋์ ๊ฐ์ธํค์ ์ธ์ฆ์ ์๋ช ์์ฒญ ํ์ผ์ด ๋ง๋ค์ด์ก์ผ๋ฉด ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ํํด์ ์์ฒด ์๋ช CA ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
PS openssl x509 -req -sha256 -days 1095 -in ca.csr -signkey ca.key -out ca.crt
Signature ok
subject=C = KO, ST = None, L = None, O = None, CN = CA
Getting Private key
-days ์ต์ ์ผ๋ก ์ธํด ๋ง๋ค์ด์ง ์์ฒด ์๋ช CA ์ธ์ฆ์๋ 3๋ (1095์ผ)๊น์ง ์ ํจํ๊ฒ ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ธ์ฆ ๊ธฐ๊ด์ ์ธ์ฆ์๋ ์๋ฒ ์ธ์ฆ์๋ณด๋ค ๊ธด ๋ง๋ฃ์ผ์๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์๋ฒ ์ธ์ฆ์ ๋ฟ๋ง ์๋๋ผ ๋ฃจํธ ์ธ์ฆ ๊ธฐ๊ด์ CA ์ธ์ฆ์๊ฐ ์ธ์ ๋ง๋ฃ๋๋์ง๋ฅผ ํ์ธํ๋ ๊ฒ๋ ์ค์ํฉ๋๋ค.
์์ฒด ์๋ช ์๋ฒ ์ธ์ฆ์ ๋ฐ๊ธ
์์ฒด ์๋ช ํ CA ์ธ์ฆ์๊ฐ ์ค๋น๋์์ผ๋ CA ์ธ์ฆ์๋ก ์๋ช ํ ์๋ฒ ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํฉ๋๋ค. CA ์ธ์ฆ์๋ฅผ ๋ง๋ค๋์ ๋์ผํ๊ฒ ๊ฐ์ธํค์ ์ธ์ฆ์ ์๋ช ์์ฒญ ํ์ผ์ ์์ฑํฉ๋๋ค.
PS openssl ecparam -out server.key -name prime256v1 -genkey
PS openssl req -new -sha256 -subj /C=KO/ST=None/L=None/O=None/CN=localhost -key server.key -out server.csr
์์ฒด ์๋ช ์๋ฒ ์ธ์ฆ์๋ฅผ ๋ง๋ค๋๋ CA ์ต์ ์ ์ฌ์ฉํด์ ์๋ฒ ์ธ์ฆ์๊ฐ CA ์ธ์ฆ์์ ์ํด ์๋ช ๋๋๋ก ํด์ผํฉ๋๋ค.
์๋ฒ ์ธ์ฆ์๋ฅผ ๋ง๋ค๊ธฐ์ ์์ ์ฃผ์ฒด ์ด๋ฆ์ธ localhost ๋์ ์ ์ฌ์ฉํ ์ ์๋ ์๋ณ ์ด๋ฆ์ธ SAN(Subject Alternative Name)์ ์ ์ฉํ๊ธฐ ์ํ ํ์ผ์ ๋ง๋ญ๋๋ค. SAN์ ์ ์ฉํด๋ณด๋ ์ด์ ๋ ํ๋์ ์ธ์ฆ์๋ก ์ฌ๋ฌ ๋๋ฉ์ธ์ ์๋ณํ ์ ์์์ ํ์ธํ๊ธฐ ์ํจ์ ๋๋ค.
authorityKeyIdentifier=keyid,issuer
subjectAltName = @alt_names
[alt_names]
IP.1 = 127.0.0.1
DNS.1 = localhost
DNS.2 = mambo.kr
์ธ์ฆ ๊ธฐ๊ด์์ ๋ฐ๊ธํ๋ SSL ์ธ์ฆ์๋ ์ ํจ ๊ธฐ๊ฐ์ 1๋ ์ผ๋ก ์ค์ ํ๋ฏ๋ก 398์ผ ๋์ ์ ํจํ๋๋ก ๋ง๋ญ๋๋ค.
# ์๋ฒ ์ธ์ฆ์ ๋ฐ๊ธ
PS openssl x509 -req -sha256 -days 398 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -extfile san.ext
# ์๋ฒ ์ธ์ฆ์ ์กฐํ
PS openssl x509 -in server.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
66🆎bb:ed:19:f3:c7:37:9d:d6:5d:29:da:03:7d:b9:4f:53:7c:b7
Signature Algorithm: ecdsa-with-SHA256
Issuer: C = KO, ST = None, L = None, O = None, CN = CA
Validity
Not Before: Aug 27 11:27:54 2021 GMT
Not After : Sep 29 11:27:54 2022 GMT
Subject: C = KO, ST = None, L = None, O = None, CN = localhost
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:74:06:a3:39:91:2e:4b:cc:45:40:e8:b0:f8:a3:
96:69:91:66:ef:d3:b3:93:8d:e5:09:78:aa:a5:af:
67:9d:47:13:78:54:7e:d9:02:ba:e4:ca:aa:d4:9f:
8b:f3:be:d7:40:1e:f5:c4:8d:7a:23:5b:09:c3:57:
75:38:7e:4d:e6
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Authority Key Identifier:
DirName:/C=KO/ST=None/L=None/O=None/CN=CA
serial:5D:98:7B:BF:10:35:6B:9C:11:97:2C:AC:21:E3:28:C2:FF:AF:2D:3D
X509v3 Subject Alternative Name:
IP Address:127.0.0.1, DNS:localhost, DNS:mambo.kr
Signature Algorithm: ecdsa-with-SHA256
30:46:02:21:00:ce:5d:3a:68:e9:04:dc:a9:fd:e6:14:de:bb:
11:5c:5a:a1:bf:b4:f9:1a:61:08:cd:da:47:d1:b4:68:80:81:
d1:02:21:00:e7:a1:b4:cb:06:6d:ad:80:d3:89:09:c1:1e:ca:
6e:c7:2e:14:fd:99:d9:df:44:14:cb:47:39:df:ea:5e:e0:1e
์ธ์ฆ์ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ CA ์ธ์ฆ์๋ก ์๋ช ๋์๊ณ SAN์ด ์ค์ ๋์ด์๋ ๊ฒ์ ํ์ธํ์ผ๋ฏ๋ก ์์ฒด ์๋ช ์ธ์ฆ์ ๋ฐ๊ธ์ด ์๋ฃ๋์๋ค๊ณ ํ ์ ์์ต๋๋ค.
์๋ฒ ์ธ์ฆ์
์์, ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์ฌ์ฉํ ์์ฒด ์๋ช ๋ SSL ์ธ์ฆ์๋ฅผ ๋ฐ๊ธํ์ต๋๋ค. ์น ์๋น์ค๋ฅผ HTTPS๋ก ์ด์ํ๊ธฐ ์ํด์๋ SSL ์ธ์ฆ์๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์ ์ง์ ๋ฑ๋กํ๊ฑฐ๋ Nginx์ ๊ฐ์ L7 ๋ก๋๋ฐธ๋ฐ์์ SSL ์ธ์ฆ์๋ฅผ ๋ฑ๋กํด์ผํฉ๋๋ค. ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค์ด์ SSL ์ธ์ฆ์๋ฅผ ๋ฑ๋กํด๋ณด๊ณ Nginx ์๋ฒ๋ฅผ ์ถ๊ฐ๋ก ๊ตฌ์ฑํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ์๋ ๋ก๋๋ฐธ๋ฐ์์์ TLS ํธ๋์์ดํน์ ์ํํจ์ ๊ฒ์ฆํด๋ด ๋๋ค.
JKS ํ์์ ์ธ์ฆ์๋ก ๋ณํ
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ HTTPS๋ฅผ ํ์ฑํํ๊ธฐ ์ํด์๋ KeyStore ํ์์ SSL ์ธ์ฆ์๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ฐ๋ฆฌ๋ OpenSSL์ ์ฌ์ฉํด์ PEM ํ์์ ์ธ์ฆ์๋ฅผ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ KeyStore ํ์์ ์ธ์ฆ์๋ก ๋ณํํด์ผํฉ๋๋ค. PEM ํ์์ ์ธ์ฆ์๋ฅผ KeyStore ํ์์ผ๋ก ๋ณํํ๊ธฐ ์ํด์๋ ๋ค์์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผํฉ๋๋ค.
- PEM ์ธ์ฆ์๋ฅผ PFX ์ธ์ฆ์๋ก ๋ณํ
- PFX ์ธ์ฆ์๋ฅผ JKS ์ธ์ฆ์๋ก ๋ณํ
PEM ์ธ์ฆ์๋ฅผ PFX ์ธ์ฆ์๋ก
OpenSSL์ ์ฌ์ฉํด์ ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ํํ๋ฉด PEM ํ์์ ์ธ์ฆ์๋ฅผ PKCS12 ํ์์ ์ธ์ฆ์๋ก ๋ณํํ ์ ์์ต๋๋ค. PKCS12 ํ์์ ์ธ์ฆ์๋ก ๋ณํํ ๋ ์ ๋ ฅํ ๋น๋ฐ๋ฒํธ๋ KeyStore ํ์์ ์ธ์ฆ์๋ก ๋ณํํ ๋ ์ธ์ฆ์ฉ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
PS openssl pkcs12 -export -inkey server.key -in server.crt -out server.pfx
Enter Export Password: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
Verifying - Enter Export Password: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
PFX ์ธ์ฆ์๋ฅผ JKS ์ธ์ฆ์๋ก
์๋ฐ์ Keytool ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ PKCS12 ํ์์ ์ธ์ฆ์๋ฅผ KeyStore ํ์์ ์ธ์ฆ์๋ก ๋ณํํ ์ ์์ต๋๋ค.
PS keytool -importkeystore -srckeystore server.pfx -srcstoretype pkcs12 -destkeystore server.jks -deststoretype pkcs12
ํค ์ ์ฅ์ server.pfx์(๋ฅผ) server.jks(์ผ)๋ก ์ํฌํธํ๋ ์ค...
๋์ ํค ์ ์ฅ์ ๋น๋ฐ๋ฒํธ ์
๋ ฅ: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
์ ๋น๋ฐ๋ฒํธ ๋ค์ ์
๋ ฅ: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
์์ค ํค ์ ์ฅ์ ๋น๋ฐ๋ฒํธ ์
๋ ฅ: [PFX ๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
1 ๋ณ์นญ์ ๋ํ ํญ๋ชฉ์ด ์ฑ๊ณต์ ์ผ๋ก ์ํฌํธ๋์์ต๋๋ค.
์ํฌํธ ๋ช
๋ น ์๋ฃ: ์ฑ๊ณต์ ์ผ๋ก ์ํฌํธ๋ ํญ๋ชฉ์ 1๊ฐ, ์คํจํ๊ฑฐ๋ ์ทจ์๋ ํญ๋ชฉ์ 0๊ฐ์
๋๋ค.
์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
KeyStore ํ์์ ์๋ฒ ์ธ์ฆ์๊ฐ ์ค๋น๋์์ผ๋ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ ํ HTTPS๋ก ์คํํ๊ธฐ ์ํ ํ๋กํผํฐ๋ฅผ ์ค์ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํฉ๋๋ค.
server.port=8080
server.ssl.enabled=true
server.ssl.protocol=TLS
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
server.ssl.key-store=classpath:cert/server.jks
server.ssl.key-store-password=passwd
server.ssl.key-store-type=pkcs12
์คํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ์์ฒด ์๋ช ๋ ์๋ฒ ์ธ์ฆ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๊ธ์์ธ CA์ ๋ํ ์ ๋ณด๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ธํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๋ขฐํ ์ ์๋ ์ฌ์ดํธ๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฒ์ ๋น์ฐํ ๋ถ๋ถ์ผ๋ก ์ด ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ๊ณ ์ ๊ทผํ ์๋ ์์ง๋ง ์ฐ๋ฆฌ๋ ์์ฒด ์๋ช CA ์ธ์ฆ์๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๋ขฐํ ์ ์๋ ๊ธฐ๊ด์ผ๋ก ๋ฑ๋กํ๊ฒ ์ต๋๋ค.
์ค์ > ๊ฐ์ธ์ ๋ณด ๋ฐ ๋ณด์ > ๋ณด์ > ์ธ์ฆ์ ๊ด๋ฆฌ๋ก ๋ค์ด๊ฐ์ ์์ฒด ์๋ช ๋ CA ์ธ์ฆ์๋ฅผ ๋ฃจํธ ์ธ์ฆ ๊ธฐ๊ด์ผ๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค.
๋ฃจํธ ์ธ์ฆ ๊ธฐ๊ด ๋ชฉ๋ก์ ์์ฒด ์๋ช CA ์ธ์ฆ์๋ฅผ ์ถ๊ฐํ์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ ์ธ์ฆ์๋ฅผ ์ ๋ขฐํ ์ ์๊ฒ ๋ฉ๋๋ค.
๋ก์ปฌํธ์คํธ ๋์ ์ SAN์ผ๋ก ์ง์ ํ์๋ 127.0.0.1๊ณผ mambo.kr์ ๋ํด์๋ ์ ๋ขฐํ์์ต๋๋ค. ๋ง์ฝ, ๋ฐ๋ผํด๋ณด๊ณ ๊ณ์๋ ๋ถ๋ค ์ค์์ ์ฌ์ ํ ์ ๋ขฐํ ์ ์๋ค๊ณ ๋์ค๋ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ข ๋ฃํ๊ณ ๋ค์ ์คํํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
์ด์ Nginx์ ์ถ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊ฐ ์๋ Nginx์์ ์๋ฒ ์ธ์ฆ์๋ฅผ ๋ฑ๋กํ์ฌ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ๋ ์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. ์คํํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ ์ข ๋ฃํฉ๋๋ค.
PEM ํ์์ ์ธ์ฆ์๋ก ๋ณํ
์ธ์ฆ ๊ธฐ๊ด ๋ํ ์ ์ฒด์์ ๋ฐ๊ธํด์ค ์ธ์ฆ์๊ฐ KeyStore ํ์์ ์ธ์ฆ์๋ผ๋ฉด PEM ํ์์ ์ธ์ฆ์๋ก ๋ณํํด์ผํฉ๋๋ค. ์ด๋ฏธ ์ฐ๋ฆฌ๋ PEM ํ์์ ์๋ฒ ์ธ์ฆ์๊ฐ ์๋ ์ํ์ด์ง๋ง ์๋ ์ํ๋ผ๊ณ ๊ฐ์ ํ๊ณ KeyStore ํ์์ ์ธ์ฆ์๋ฅผ PEM ํ์์ผ๋ก ๋ณํํด๋ด ๋๋ค.
๋ณํ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด KeyStore ์ธ์ฆ์๋ก ๋ณํํ ๋์ ๋ฐ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- JKS ์ธ์ฆ์๋ฅผ PFX ์ธ์ฆ์๋ก ๋ณํ
- PFX ์ธ์ฆ์๋ฅผ PEM ์ธ์ฆ์๋ก ๋ณํ
# JKS ์ธ์ฆ์๋ฅผ PFX ์ธ์ฆ์๋ก ๋ณํ
PS keytool -importkeystore -srckeystore server.jks -destkeystore server.pfx -deststoretype pkcs12
ํค ์ ์ฅ์ server.jks์(๋ฅผ) server.pfx(์ผ)๋ก ์ํฌํธํ๋ ์ค...
๋์ ํค ์ ์ฅ์ ๋น๋ฐ๋ฒํธ ์
๋ ฅ: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
์ ๋น๋ฐ๋ฒํธ ๋ค์ ์
๋ ฅ: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
์์ค ํค ์ ์ฅ์ ๋น๋ฐ๋ฒํธ ์
๋ ฅ: [JKS ๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
1 ๋ณ์นญ์ ๋ํ ํญ๋ชฉ์ด ์ฑ๊ณต์ ์ผ๋ก ์ํฌํธ๋์์ต๋๋ค.
์ํฌํธ ๋ช
๋ น ์๋ฃ: ์ฑ๊ณต์ ์ผ๋ก ์ํฌํธ๋ ํญ๋ชฉ์ 1๊ฐ, ์คํจํ๊ฑฐ๋ ์ทจ์๋ ํญ๋ชฉ์ 0๊ฐ์
๋๋ค.
# PFX ์ธ์ฆ์์์ PEM ํ์์ ์ธ์ฆ์๋ก ๋ณํ
PS openssl pkcs12 -in server.pfx -out server.crt -clcerts -nokeys
Enter Import Password: [PFX ๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
# PFX ์ธ์ฆ์์์ ๊ฐ์ธํค ์ถ์ถ
PS openssl pkcs12 -in server.pfx -out server.key -nocerts
Enter Import Password: [PFX ๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
Enter PEM pass phrase: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
Verifying - Enter PEM pass phrase: [๋น๋ฐ๋ฒํธ ์
๋ ฅ:passwd]
PFX ์ธ์ฆ์๋ฅผ PEM ํ์์ผ๋ก ๋ณํํ๊ณ ๋์๋ ๋ถ๊ฐ์ ์ธ ํค๋๊ฐ ๋ค์ด๊ฐ์์ผ๋ฏ๋ก PEM ํ์์ ๊ด๋ จ๋ ๋ถ๋ถ๋ง ๋ณ๋๋ก ๋ค์ ์ ์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ์ธํค์ ๊ฒฝ์ฐ -----BEGIN PRIVATE KEY-----์ผ๋ก ์์ํด์ -----END PRIVATE KEY-----์ผ๋ก ๋๋๋ ๋ถ๋ถ์ ๋งํฉ๋๋ค.
Nginx
Nginx์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๋ฅผ ์คํํ๋ ํ๊ฒฝ์ ๋์ปค ์ปดํฌ์ฆ๋ก ์คํํ๊ฒ ์ต๋๋ค. ๋จผ์ , ์์ ์คํ๋ง ๋ถํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ๊ฐ๋ฅํ JAR ํ์ผ๋ก ํจํค์งํ์ฌ ์ค๋นํฉ๋๋ค.
gradle bootJar
> Task :compileJava UP-TO-DATE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :bootJarMainClassName
> Task :bootJar
# build/libs/demo-0.0.1-SNAPSHOT.jar
๊ทธ๋ฆฌ๊ณ ๋ค์์ ๋์ปค ์ปดํฌ์ฆ ๋ฌธ์๋ฅผ ์์ฑํ๊ณ ํจํค์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์๋ฒ ์ธ์ฆ์ ๊ทธ๋ฆฌ๊ณ ๊ฐ์ธํค ํ์ผ์ ๋ณต์ฌํฉ๋๋ค.
version: '3.8'
services:
nginx:
image: nginx
ports:
- 80:80
- 443:443
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./server.crt:/etc/nginx/server.crt
- ./server.key:/etc/nginx/server.key
app:
image: adoptopenjdk/openjdk11
command: 'java -jar /etc/app.jar'
volumes:
- ./demo-0.0.1-SNAPSHOT.jar:/etc/app.jar
๋์ปค ์ปดํฌ์ฆ๊ฐ ์ฐธ์กฐํ๋ Nginx ์ค์ ํ์ผ์ 443 ํฌํธ์ SSL์ ํ์ฑํํ๊ณ SSL ์ธ์ฆ์๋ฅผ ์ง์ ํ๋๋ก ์์ฑํฉ๋๋ค.
worker_processes auto;
events {
worker_connections 1024;
}
http {
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/mime.types;
server {
listen 443 ssl;
server_name localhost 127.0.0.1 mambo.kr;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://app:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
keepalive_timeout 60;
include /etc/nginx/conf.d/*.conf;
}
๋์ปค ์ปดํฌ์ฆ ๋ช ๋ น์ด๋ก Nginx์ ํจ๊ป ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํฉ๋๋ค.
docker-compose up -d
์ ์์ ์ผ๋ก ์คํ๋์๋ค๋ฉด Nginx์ 443 ํฌํธ๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ํต์ ์ ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ฒ๋ผ TLS ํธ๋์์ดํฌ ๊ณผ์ ์ด Nginx์ ์ํด ์ ๋๋ก ์ํ๋์์์ ํ์ธํ ์ ์์ต๋๋ค.
์ด์์ผ๋ก SSL ์ธ์ฆ์์ ๋ํ ์ ๋ฆฌ๋ฅผ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
์ธํ๋ผ ๊ตฌ์กฐ์ SSL ์ธ์ฆ์๋ฅผ ์ด๋์ ๋ฑ๋กํ๊ณ TLS ํธ๋์์ดํน ๊ณผ์ ์ ์ํํ๋์ง๋ ์ค์ํ ๋ถ๋ถ์ผ ์ ์์ต๋๋ค. ์ด์์ค์ธ ์น ์๋น์ค๋ฅผ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํํ๊ณ ์๋ค๋ฉด ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํํ๋ Nginx ๋๋ NLB์์ TLS ํธ๋์์ดํน์ ์ํํ ์ ์๋๋ก SSL ์ธ์ฆ์๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ด ์ข์ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๊ตฌ์ฑํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ์ง์ํ์ง ์๋ ์์ฒญ์ ๋ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ๊น์ง ๋๋ฌํ์ง ์๋๋ก ํ์ฌ ์๋ฒ ๋ถํ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฌผ๋ก , ๋ก๋๋ฐธ๋ฐ์์์ TLS ํธ๋์์ดํฌ๋ฅผ ์ํํ๋ฏ๋ก ์๋์ ์ผ๋ก ๋ก๋๋ฐธ๋ฐ์ ์๋ฒ์ ๋ถํ๊ฐ ์ปค์ง๋ ๊ฒ์ ๊ฐ์ํด์ผํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.