Hello, OpenSSL!
๋ค์ด๊ฐ๋ฉฐ
ํ์ฌ์์ Kafka ํด๋ฌ์คํฐ๋ฅผ ์จํ๋ ๋ฏธ์ค๋ก ๊ตฌ์ถํ๋ฉด์ ๋ธ๋ก์ปค๊ฐ SSL๋ก ํต์ ํ๋๋ก ๊ตฌ์ถํด์ผ ํ๋ ์ํฉ์ด ์์์ต๋๋ค. ๋ง์นจ CCDAK ์ํ์ ์ค๋นํ๊ณ ์์๊ณ , ์ด๋ฒ์ openssl
๋ผ๋ ๋๊ตฌ๋ฅผ ์ ๋๋ก ์ข ์ตํ๋ณด๊ณ ์์ด์ ๊ด๋ จํด์ ํ์ํ ๋ด์ฉ์ ์ด๋ ๊ฒ ์ ๋ฆฌํด๋ด
๋๋ค ใ
ใ
SSL/TLS์ ๋ํด์ โ์ ์ก ๊ณ์ธต ๋ณด์ SSL/TLSโ ํฌ์คํธ์์ ์ ๋ฆฌํ ๊ฒ์ด ์์ต๋๋ค! ๐
๊ธฐ๋ณธ ์ฌ์ฉ ๋ฐฉ๋ฒ
openssl
์ ๊ฐ์ธํค/๊ณต๊ฐํค ์์ ๋ง๋๋ ๊ฒ์ ํฌํจํด ์ธ์ฆ์ ์๋ช
์์ฒญ(CSR), ๊ณต๊ฐ ์ธ์ฆ์(CRT) ํ์ผ์ ๋ง๋๋ ๊ฒ๊น์ง! SSL/TLS์ ๊ด๋ จ๋ ๊ฑฐ์ ๋ชจ๋ ์์
์ ์ํํ ์ ์์ต๋๋ค! ใ
ใ
๊ธฐ๋ณธ์ ์ธ ์ฌ๋ก๋ค๋ถํฐ ์์ฉ ์ฌ๋ก๋ค๊น์ง ์์๋๋ก ๋ฐ๋ผ๊ฐ๋ด ์๋ค!
๊ฐ์ธํค ์์ฑ
$ openssl genpkey -algorithm RSA -out private.key
$ cat private.key
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDCFhKZB1BgIYNe
B+hywiTR2/13lA3s3/SZo1wnScVpaOI6aJmi4l0AnLEW7BqyCNCJ63MYARWMZ8cM
...
OoLGksEA5fkakzu8IOeGpl6/
-----END PRIVATE KEY-----
openssl genrsa
๋ก๋ ๊ฐ์ธํค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
$ openssl genrsa -out private.key 2048
๊ณต๊ฐํค ์ถ์ถ
๊ทธ๋ฐ๋ฐ SSL์ ํ๋ ค๋ฉด, ๊ฐ์ธํค์ ๋์๋๋ ๊ณต๊ฐํค๊ฐ ํ์ ํ์ต๋๋ค. ์์ ๋ช
๋ น์ด๋ฅผ ์ํํ๋ฉด, ๊ฐ์ธํค์ธ private.key
๋ง ์์ฑ๋๊ณ , ๊ณต๊ฐํค๋ ์์ฑ๋์ง ์๋๋ฐ์! ์ด๋์ ์๋ ๊ฑธ๊น์?
์ ๋ต์ ๊ฐ์ธํค ์์ ๊ณต๊ฐํค์ ๋ด์ฉ์ด ๋ค์ด์์ต๋๋ค! ๐ฒ ๊ณต๊ฐํค์ ๊ฐ๋ openssl
๋ก ์ถ์ถํ ์ ์์ต๋๋ค.
$ openssl rsa -in private.key -pubout -out public.key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwhYSmQdQYCGDXgfocsIk
0dv9d5QN7N/0maNcJ0nFaWjiOmiZouJdAJyxFuwasgjQietzGAEVjGfHDCIp9Yes
GraHOHGJzoDRXKTiR7CY6l90vevyyD9pJSSCThifST23wsjAlIOnBBmdDcbrHWB0
DoU7x33sQwUMWVRWCn7cZR4vaCEn7Fr3YeKpcjXz/woPpr1r9nm2V0oX31YxEt69
TK7GeJQaMNwmfy4acJFyU+a25u0Cf5bz/U+HaWu2Qx0WKaF9CO3bvV2h105A+ARV
fReKr/uWA1jYw/bOo0BAvQzuakRIvQMVJKc1rYnS9lBN5BeT6MYpMsODLqld4sdu
iwIDAQAB
-----END PUBLIC KEY-----
์ ๊ณต๊ฐํค๋ ๊ฐ์ธํค์์ ์ถ์ถํด์ผ ํ ๊น์?
๊ทธ ์ด์ ๋ ๊ฐ์ธํค์ ๊ณต๊ฐํค๋ ์๋ก ์ํ์ ์ผ๋ก ๊ฐํ๊ฒ ์ฐ๊ฒฐ ๋์ด ์์ด์, ๊ณต๊ฐํค์ ๊ฐ์ ๊ฐ์ธํค๋ง์ผ๋ก ์ถ์ถํ ์ ์๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณต๊ฐํค์๋ ๊ฐ์ธํค๋ฅผ ์ถ์ถํ๊ธฐ ์ํ ์ ๋ณด๊ฐ ๋๋ฝ ๋์ด ์์ง๋ง, ๊ฐ์ธํค์๋ ๊ณต๊ฐํค๋ฅผ ์ถ์ถํ๊ธฐ ์ํ ์ ๋ณด๊น์ง ํจ๊ป ์์ต๋๋ค.
์ด๋ ๊ฒ ๊ฐ์ธํค๋ฅผ ํตํด ๊ณต๊ฐํค๋ฅผ ์ถ์ถํ๋๋ก ํ๋ฉด, ์๋ฒ๋ ๊ฐ์ธํค๋ง ์์ ํ๊ฒ ๋ณด๊ดํ๋ฉด ๋ฉ๋๋ค! ๊ทธ๋ฆฌ๊ณ ๊ณต๊ฐํค๋ ํ์ํ ๋ openssl
๋ก ์์ฑํด์ ์ฌ์ฉํฉ๋๋ค.
CSR ์์ฑ
์๋ฒ๊ฐ ๊ฐ์ง ๊ณต๊ฐํค์ ์ ๋ขฐํ ์ ์๋๋ก ํ๊ธฐ ์ํด์ ์ธ์ฆ์(certificate)๊ฐ ํ์ํฉ๋๋ค. ์ด ์ธ์ฆ์๋ฅผ ์ ์ํ๊ธฐ ์ํด์ ์ธ์ฆ๊ธฐ๊ด(CA)์๊ฒ ์๋ฒ ๊ณต๊ฐํค์ ์๋ฒ์ ์ ๋ณด๋ฅผ ํฌํจํ ์ธ์ฆ์ ์ธ์ฆ์ ์๋ช ์์ฒญ(Certificate Signing Request)๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
openssl req
๋ช
๋ น์ด์ -new
๋ฅผ ๋ถ์ฌ์ ์ ๊ท CSR๋ฅผ ์์ฑํ๋๋ก ํฉ์๋ค! ์ด๋ ๊ฒ ๋ง๋ค์ด์ง .csr
ํ์ผ์ ์ธ์ฆ๊ธฐ๊ด(CA)์ ๋ณด๋ด์ ์๋ช
์ ๋ฐ์ ์์ ์
๋๋ค!
$ openssl req -new -key private.key -out request.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]: .
State or Province Name (full name) [Some-State]: .
Locality Name (eg, city) []: .
Organization Name (eg, company) [Internet Widgits Pty Ltd]: .
Organizational Unit Name (eg, section) []: .
Common Name (e.g. server FQDN or YOUR name) []: localhost
Email Address []: .
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
.csr
์ ์์ฑํ๊ธฐ ์ํด ๋ช๊ฐ์ง ๋ฉํ ์ ๋ณด๋ฅผ ์ฑ์์ผ ํฉ๋๋ค. ๋ชจ๋ ํ๋๋ฅผ ๋ค ์ ์ ํ์๋ ์์ต๋๋ค! Common Name(CN)
ํญ๋ชฉ์ ๊ผญ ์ ํํ๊ฒ ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์๋ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ SSL ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํ ๋, CN
๊ฐ์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ฆํ๊ธฐ ๋๋ฌธ ์
๋๋ค!
์ ๋ CN
์ ์ ์ธํ๊ณ ๋ ์ ๋ถ .
์ ๋ฃ์ด์ ๋น๊ฐ์ผ๋ก ๋ฃ์ด์คฌ์ต๋๋ค!
CN
ํ๋๋ ๋ณดํต ์๋ฒ์์ ์ฌ์ฉํ ๋๋ฉ์ธ ์ด๋ฆ์ ์ ์ผ๋ฉด ๋ฉ๋๋ค. www.example.com
์ผ๋ก FQDN์ ์ ์ด๋ ๋๊ณ , *.example.com
์ ๊ฐ์ด RegExp๋ฅผ ํฌํจํด ์์ฑํด๋ ๋ฉ๋๋ค.
Self-signed Certificate ์์ฑ
์ด์ ์์์ ๋ง๋ .csr
ํ์ผ์ ์๋ฒ๊ฐ ์์ฒด์ ์ผ๋ก ์๋ช
ํ๋ Self-signed Certificate๋ฅผ ๋ง๋ค์ด๋ด
์๋ค!
$ openssl x509 -req -in request.csr -days 365 \
-signkey private.key \
-out certificate.crt
Certificate request self-signature ok
subject=CN=localhost
์ด๋ ๊ฒ ๋ง๋ ์์ฒด ์๋ช
์ธ์ฆ์๋ฅผ ์ด์ ํ๊ฒฝ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค! ์๋ํ๋ฉด, ๋ธ๋ผ์ฐ์ ์์ ์์ฒด ์๋ช
ํ ์ธ์ฆ์๋ ์ ๋ขฐํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋์ ์น์๋ฒ๊ฐ ์ด ์์ฒด ์๋ช
์ธ์ฆ์๋ฅผ ์ฐ๊ฒ ๋๋ฉด https://localhost:0000
์ผ๋ก ์ ๊ทผ์ ๋์ง๋ง, โ์ ๋ขฐํ ์ ์์โ ๊ฒฝ๊ณ ๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค.
๋ฌผ๋ก ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ด๋ฅผ ๋ฌด์ํ๊ณ ์งํํ๋ฉด ๋ฉ๋๋คโฆ๋ง! ์ ๋ ์ด๊ฒ ๋๋ฌด ๊ฑฐ์ฌ๋ ค์ ๋ก์ปฌ์์ ๋ฐ๊ธํ ์ธ์ฆ์๋ฅผ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ ์์ด๋ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค! ๐
โก๏ธ FastAPI with Self-signed SSL Certificate
๊ทธ๋ฆฌ๊ณ ์์ฒด ์๋ช
์ธ์ฆ์์ ๊ฒฝ์ฐ, ์ด์งํผ ์๊ธฐ ์์ ์ด ์๋ช
ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ .csr
ํ์ผ์ ๊ตณ์ด ๋ง๋ค์ง ์์๋ ๋ฉ๋๋ค ใ
ใ
๊ทธ๋์ openssl req -new
๋ก ์ธ์ฆ์ ์๋ช
์์ฒญ์ ๋ง๋ค๊ธฐ ์๊ณ openssl req -x509
๋ก ๋ฐ๋ก .crt
ํ์ผ์ ๋ง๋๋ ๊ฒ๋ ๊ฐ๋ฅ ํฉ๋๋ค.
$ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3650 -out rootCA.crt \
-subj "/C=KR/ST=Seoul/L=Seoul/O=MyOrg/OU=Dev/CN=MyLocalRootCA"
์ฌ๋ด ํ์ ์์คํ ์์ ์ฌ์ฉ
์ด ๋ถ๋ถ์ด ์ด ๊ธ์ ์ฐ๊ฒ ๋ ๊ณ๊ธฐ ์ ๋๋ค!! ใ ใ
์ธ๋ถ CA์ ์ธ์ฆ์ ๋ฐ๊ธ์ด ์ด๋ ค์ด ๋ด๋ถ์ฉ ์๋น์ค ๋๋ ํ์๋ง์์๋ SSL/TLS๋ฅผ ํตํ ์ ์ก ์ํธํ๋ ํ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ฒด ์๋ช ์ ํ ์ธ์ฆ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฃจํธ CA๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ํด๋ฌ์คํฐ๋ฅผ ์ด๋ฃจ๋ ๋ชจ๋ ์๋ฒ์ ๋ฐฐํฌํ๊ณ , ์ด๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑ ํฉ๋๋ค.
์ ๋ ํ์ฌ์์ Kafka ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ ๋, ์ด ์์ฒด ์๋ช ์ธ์ฆ์๋ฅผ ๋ฃจํธ CA๋ก ๊ตฌ์ฑํด์ ์ฌ์ฉ ํ์ต๋๋ค ใ ใ
๋น๋ฐ๋ฒํธ ์์ฑ
openssl
๋ก ํค์ ์ธ์ฆ์ ๋๊ตฌ ๋ฟ๋ง ์๋๋ผ, ์์์ ๊ฐ๋ ฅํ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค!
$ openssl rand 12 | base64
JsQa64t5++7tQ/l+
$ openssl rand -base64 12
GKgjDe3Hmiwvu+vW
์ด๋ ๊ฒ ๋ง๋ ๊ฐ๋ค์ admin ๊ณ์ ์ ๋น๋ฐ๋ฒํธ๋ ํ ํฐ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค!
OpenSSH์ ํท๊ฐ๋ฆฌ์ง ๋ง๊ธฐ!
๋์ด ์ด๋ฆ์ด ์์ฒญ ๋น์ทํฉ๋๋คโฆ ๐ ๊ทธ๋์ ์ ๋ ์ฒ์์
SSH์์๋
.pem
ํค๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๋ฐโฆ? ์ด๊ฑฐ๋ ๋ค๋ฅธ ๊ฑด๊ฐ?
๋ผ๊ณ ์๊ฐ ํ์ฃ .
์ผ๋จ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ OpenSSL์ openssl
๋ผ๋ ์ด๋ฆ ๊ทธ๋๋ก์ CLI๋ฅผ ์ฌ์ฉํ์ง๋ง, OpenSSH์์๋ ssh
๋ ssh-keygen
๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ฌด ์ฑ์๊ฐ ์๋ ์ฐจ์ด์ธ๊ฐโฆ?
์ํผ ์ ๋ฌํ๊ณ ์ถ์ ๊ฒ์ OpenSSH๋ SSH ๋ณด์ ์ ์์ ์ํ ์ ๋ฐ์ ์ธ ์์คํ
์ด๋ผ๊ณ ๋งํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์์ OpenSSL๊ณผ ๊ฒน์น๋ ๋ถ๋ถ์ด ๋ง์ต๋๋ค. ๋๋ค .pem
ํฌ๋งท์ผ๋ก ํค๋ฅผ ๊ด๋ฆฌํ๋ค๋ ์ . ๊ทธ๋ฆฌ๊ณ ์ํธํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก RSA ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ์ง๋ง, OpenSSL์ x.509
๋ผ๋ ๋์งํธ ์ธ์ฆ์๊ณผ ์ธ์ฆ์ ๊ธฐ๋ฐ ์ฒด๊ณ(PKI)์ ์ค์ํ๋ค๋ฉด, OpenSSH๋ ์๋ฒ์ ์๊ฒฉ ์ ์ํ๋ ํ๋กํ ์ฝ์ด๋ผ๋ ์ ์ด ๋ ์ค์ํฉ๋๋ค.
keytool
TODO