ghdwlsgur / mutual-tls-in-go

๐Ÿ’ป ์ฝ”๋“œ๋กœ ํ™•์ธํ•˜๋Š” mTLS

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

1. mTLS (Mutual Transport Layer Security)๋ž€ ?


์ƒํ˜ธ TLS ๋˜๋Š” mTLS๋Š” ์ƒํ˜ธ ์ธ์ฆ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. TLS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” mTLS๋Š” ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๋ชจ๋‘ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. mTLS๋Š” ํŠธ๋ž˜ํ”ฝ์ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ์–‘๋ฐฉํ–ฅ์—์„œ ์•ˆ์ „ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ TLS๋Š” ์„œ๋ฒ„ ์ธ์ฆ๊ณผ ํ†ต์‹  ์•”ํ˜ธํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ธ์ฆ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ์‹ ์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ , ํ†ต์‹  ์•”ํ˜ธํ™”๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ค‘๊ฐ„์ž ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ TLS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์„ ๋ณดํ˜ธํ•˜์ง€๋งŒ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ •๋ง๋กœ ํ•ด๋‹น ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•œ ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mTLS๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘์— ๋Œ€ํ•œ ์ธ์ฆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์˜ ์ธ์ฆ์„œ๋ฅผ ์„œ๋ฒ„์— ์ œ๊ณตํ•˜๊ณ  ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์ œ๋กœ ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ์‹ ์›์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋” ๋†’์€ ๋ณด์•ˆ ์ˆ˜์ค€์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mTLS๋Š” ์ฃผ๋กœ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ , API ํ˜ธ์ถœ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ๋“ฑ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌํ˜„ ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹œ์Šคํ…œ์˜ ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

2. TLS ์ž‘๋™์›๋ฆฌ


์ผ๋ฐ˜์ ์œผ๋กœ TLS์—์„œ ์„œ๋ฒ„์—๋Š” TLS ์ธ์ฆ์„œ์™€ ๊ณต๊ฐœ/๊ฐœ์ธ ํ‚ค ์Œ์ด ์žˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ TLS ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
  2. ์„œ๋ฒ„๊ฐ€ TLS ์ธ์ฆ์„œ๋ฅผ ์ œ์‹œ
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธ
  4. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์•”ํ˜ธํ™”๋œ TLS ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ •๋ณด ๊ตํ™˜

๊ทธ๋Ÿฌ๋‚˜ mTLS์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘ ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์–‘์ชฝ ๋ชจ๋‘ ๊ณต๊ฐœ/๊ฐœ์ธ ํ‚ค ์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜ TLS์™€ ๋น„๊ตํ•  ๋•Œ mTLS๋Š” ์–‘ ๋‹น์‚ฌ์ž๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ
  2. ์„œ๋ฒ„๊ฐ€ TLS ์ธ์ฆ์„œ๋ฅผ ์ œ์‹œ
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธ
  4. ํด๋ผ์ด์–ธํŠธ๊ฐ€ TLS ์ธ์ฆ์„œ๋ฅผ ์ œ์‹œ
  5. ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธ
  6. ์„œ๋ฒ„์—์„œ ์•ก์„ธ์Šค ๊ถŒํ•œ ๋ถ€์—ฌ
  7. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์•”ํ˜ธํ™”๋œ TLS ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๊ตํ™˜

3. ์ธ์ฆ์„œ ํ†บ์•„๋ณด๊ธฐ


  • ์—ฌ๊ธฐ์„œ ์‚ดํŽด๋ณด์•„์•ผ ํ•  ๊ฒƒ์€ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ LEAF CERTIFICATE์™€ ํ”„๋ผ์ด๋น— ํ‚ค์˜ ํ•ด์‹œ๊ฐ’์ด ๋™์ผํ•œ์ง€ ํ™•์ธํ•˜๊ณ  LEAF CERTIFICATE์˜ ISSUER๊ฐ€ ca.crt์˜ Subject์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ca.crt๋Š” ROOT CERTIFICATE์ด๋ฏ€๋กœ Subject์™€ Issuer์ด ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

4. ์‹คํ–‰ ๋ฐฉ๋ฒ•


4.1 ์ธ์ฆ์„œ ์ƒ์„ฑ

cd certificate && go run main.go

4.2 ์„œ๋ฒ„ ์‹คํ–‰

cd server && go run main.go

4.3 ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ

cd client
go run main.go -c=a
go run main.go -c=b

5. ์‹œ๋‚˜๋ฆฌ์˜ค


  • ํด๋ผ์ด์–ธํŠธ A ์š”์ฒญ
go run main.go -c=a
  • ์„œ๋ฒ„ ์ปค๋งจ๋“œ
2023/05/05 22:45:08 =============== Header ===============
2023/05/05 22:45:08 User-Agent:Go-http-client/1.1
2023/05/05 22:45:08 Accept-Encoding:gzip
2023/05/05 22:45:08 =============== State ===============
2023/05/05 22:45:08 Version: 304
2023/05/05 22:45:08 HandshakeComplete: true
2023/05/05 22:45:08 DidResume: false
2023/05/05 22:45:08 NegotiatedProtocol:
2023/05/05 22:45:08 NegotiatedProtocolIsMutual: true
2023/05/05 22:45:08 Certificate chain:
2023/05/05 22:45:08  0 subject:/C=[Earth]/ST=[Asia]/L=[Mountain]/O=[Client A Company]/OU=[Engineering]/CN=Client A
2023/05/05 22:45:08  issuer:/C=[Earth]/ST=[Asia]/L=[Mountain]/O=[CA Company]/OU=[Engineering]/CN=CA
2023/05/05 22:45:08 =============== End ===============
  • ํด๋ผ์ด์–ธํŠธ B ์š”์ฒญ
go run main.go -c=b
  • ์„œ๋ฒ„ ์ปค๋งจ๋“œ
2023/05/05 22:45:10 =============== Header ===============
2023/05/05 22:45:10 User-Agent:Go-http-client/1.1
2023/05/05 22:45:10 Accept-Encoding:gzip
2023/05/05 22:45:10 =============== State ===============
2023/05/05 22:45:10 Version: 304
2023/05/05 22:45:10 HandshakeComplete: true
2023/05/05 22:45:10 DidResume: false
2023/05/05 22:45:10 NegotiatedProtocol:
2023/05/05 22:45:10 NegotiatedProtocolIsMutual: true
2023/05/05 22:45:10 Certificate chain:
2023/05/05 22:45:10  0 subject:/C=[Earth]/ST=[Asia]/L=[Mountain]/O=[Client B Company]/OU=[Engineering]/CN=Client B
2023/05/05 22:45:10  issuer:/C=[Earth]/ST=[Asia]/L=[Mountain]/O=[CA Company]/OU=[Engineering]/CN=CA
2023/05/05 22:45:10 =============== End ===============

About

๐Ÿ’ป ์ฝ”๋“œ๋กœ ํ™•์ธํ•˜๋Š” mTLS


Languages

Language:Go 100.0%