์ด ๊ธ์ ๋ด๊ฐ ECDSA ๊ธฐ๋ฐ TLS 1.2 ์ DTLS 1.2 ์คํ์ ๊ตฌํ ํ๋ฉด์ ์๊ฒ ๋ ๋ด์ฉ์ด๋ค.
๊ทธ๋ฌ๋ค ๋ณด๋ ์๊ฒ ๋ ๋ฉ๋ชจ๊ธ์ด๋ผ ์์๋ก ์
๋ฐ์ดํธ ํ ์์ ์ด๋ค.
๊ธฐ์กด์ TLS ๊ด๋ จ ์ง์์ ๋ค์ ๋งํฌ๋ฅผ ์ฐธ์กฐ ํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์๋ ๋จ์ง ๊ฐ๋ฐ ํ๋ฉด์ ํ์
๋ ๋ด์ฉ์ ๊ฐ๋จํ ๊ธฐ๋ก ํ์๋ค.
๋ง์ฝ์ TLS์ ๊ดํ ๊ธฐ๋ณธ ์ง์์ ํ์ ํ๊ณ ์ถ์ผ๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ์กฐ ํ์ธ์.
TLS ์ ๊ดํ ์ ๋ณด ๋งํฌ
https://dokydoky.tistory.com/462
https://dokydoky.tistory.com/463
https://dokydoky.tistory.com/464
DTLS ํน์ฑ
DTLS ( Datagram Transformt Layer ) ๋ UDP ํ๊ฒฝ์์ TLS ์ ์ก์ ํ๊ธฐ ์ํ ํ๋กํ ์ฝ์ด๋ค.
๊ทธ๋ฆฌ๊ณ DTLS 1.0์ TLS 1.1 ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด ์ก๊ตฌ. DTLS 1.2 ๋ TLS 1.2 ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด ์ก๋ค.
DTLS 1.2 ํ์ค ์คํ์ [RFC6347] ์ ์ฐธ์กฐ ํ๋ฉด ๋๋ค.
TLS 1.2 ํ์ค์คํ์ [RFC5246] ์ ์ฐธ์กฐ ํ๋ฉด ๋๋ค.
ECC CipherSuite [RFC4492] ํ์ค ์คํ
์ฐธ๊ณ ๋ก ๊ณต๊ฐํค ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ก DTLS ๋ฅผ ๊ตฌํํ ์คํ์์ค ์ฌ์ดํธ๋ ์๋๋ฅผ ์ฐธ์กฐ ํ๋ฉด๋๋ค.
[TinyDTLS] ์ฐธ๊ณ ๋ก ์ด ์ฌ์ดํธ๋ ๋๋ Github ์์ ํฌํฌํด์ ๊ฐ์ ธ์จ ์์ค์ด๋ค.
DTLS์์๋ HelloVerifyRequest ๋ถ๋ถ์ด ์กด์ฌ ํ๊ตฌ
TLS์์๋ ์ด ๊ณผ์ ์ ์กด์ฌ ํ์ง ์๋๋ค.
DTLS์์๋ ์ ์ก์ ๋ํ ๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์ ํจํท์ ๋ํ sequence ์ epoch ๊ฐ์ ์ฌ์ฉํ์ฌ ํด๋น ํจํท์ ์ฌ์ ์ก์ ํตํ
๊ฐ์ ํ์ธ ํ๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ค.
DTLS ํจํท ํ๋ ์์ ๋ณด๋ฉด
Type(1) | Version(2) | Epoch(2) | Sequence Number(6) | Length(3) | ...
TLS ํจํท ํ๋ ์์
Type(1) | Version(2) | Length(3) | ...
์ด๋ ๊ฒ epoch ์ sequence number ๊ฐ์ ์ ๋ฌด๊ฐ ์ฐจ์ด ๋๋ค.
epoch ๊ฐ์ DTLS์์๋ง ์ฌ์ฉํ๋ ๊ฐ์ผ๋ก Cipher ์ํ๊ฐ ๋ณํ๊ฐ ์ผ์ด ๋ ๋ ๋ง๋ค 1์ฉ ์ฆ๊ฐ ํ๋ ๊ฐ์ด๋ค.
TLS ํน์ฑ
TLS ํ๋กํ ์ฝ์ ์ํธ์ธ์ฆ ๋ฐ ๋จ๋ฐฉํฅ ์ธ์ฆ ๋๊ฐ์ง๊ฐ ์ง์ ๋๋ค.
๋จ๋ฐฉํฅ ์ธ์ฆ์ด์ผ ์ํธ ์ธ์ฆ์ด๋๋ ์๋ฒ ์ชฝ์์ ๊ฒฐ์ ํ๋ค.
๋จ๋ฐฉํฅ ์ธ์ฆ์์๋ CertificateRequest๋ Client Certificate, CertificateVerify ๊ฐ ์์
๋์นญํค ์๊ณ ๋ฆฌ์ฆ์ ํค ๊ธธ์ด๋ฅผ 256 ๋นํธ๋ฅผ ์ฌ์ฉ ํ๊ฒ ๋๋ฉด SHA-2 ์๊ณ ๋ฆฌ์ฆ ๊ฒฝ์ฐ SHA-384 ๋ง ๊ฐ๋ฅํ๋ค.
ํค ๊ธธ์ด 128 ๋นํธ์ธ ๊ฒฝ์ฐ๋ SHA-256 ๋นํธ์ ๋ฌด๊ฒฐ์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
ECDH ์ ECDHE ์ฐจ์ด์
ECDH ๋ฅผ ์ฌ์ฉ ํ ๊ฒฝ์ฐ ์๋ฒ ์ธ์ฆ์์์ KeyUsage ํ๋์ Key Agreement ๊ฐ ํ์ ํจ
ECDH ๋ฅผ ํ๊ฒ ๋๋ฉด ServerKeyExchange ๋ฉ์ธ์ง๋ ๋ณด๋ด์ง ์์ ํ์ง๋ง ClientKeyExchange ๋ ๋ณด๋
HandShake ๊ณผ์
DTLS 1.2 ์ํธ ์ธ์ฆ
TLS 1.2 ์ํธ ์ธ์ฆ
TLS 1.2 ์๋ฒ ์ธ์ฆ
์ผ๋ฐ์ ์ผ๋ก HTTPS ์ฃผ์๋ก ์ ๊ทผ์ ์๋ฒ ์ธ์ฆ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
์๋ฒ ์ธ์ฆ์ธ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ์์๋ ํน๋ณํ ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ์์ด๋ค.
ClientHello
ํด๋ผ์ด์ธํธ์์ ์ฒ์ TLS ์์์ ์๋ฆฌ๋ ๋ฉ์ ์ง ์ด๋ค.
์ฌ์ฉํ๋ ์๊ณ ๋ฆฌ์ฆ ์๋ ค์ค
struct {
uint32 gmt_unix_time;
opaque random_bytes[28];
} Random;
HelloVerifyRequest
์๋ฒ์์ ์ฟ ํค ๊ฐ์ ์๋ ค์ค DTLS๋ ์ฐ๊ฒฐ์ ๋ณด์ฅ ํ์ง ์๋ค ๋ณด๋ ์ฐ๊ฒฐ์ ๋ํ ๊ตฌ๋ณ ๊ฐ
DTLS์์๋ง ์ฌ์ฉ ํจ
struct {
ProtocolVersion server_version;
opaque cookie<0..2^8-1>;
} HelloVerifyRequest;
ServerHello
์๋ฒ์์ ํ๊ฐ ํ ์๊ณ ๋ฆฌ์ฆ ์ด๋ Random ๊ฐ ์๋ ค์ค
struct {
ProtocolVersion server_version;
Random random;
SessionID session_id;
CipherSuite cipher_suite;
CompressionMethod compression_method;
select (extensions_present) {
case false:
struct {};
case true:
Extension extensions<0..2^16-1>;
};
} ServerHello;
Certificate
์๋ฒ ๋๋ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ๋ ์ธ์ฆ์ ๊ฐ์ ๋ณด๋ด์ค
ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ๊ฐ CertificateRequest๋ฅผ ๋ณด๋ด์ผ๋ง ํด๋ผ์ด์ธํธ์์๋ ์ ์ก ํจ
์๋ฒ ๊ฒฝ์ฐ ์ธ์ฆ์ ์ฒด์ธ์ผ๋ก ์ ๋ฌ ํจ. ์ฒซ๋ฒ์งธ๊ฐ ์ค์ ์๋ช
์ฉ ์ธ์ฆ์ ์
opaque ASN.1Cert<1..2^24-1>;
struct {
ASN.1Cert certificate_list<0..2^24-1>;
} Certificate;
ServerKeyExchange
pre master secret ์์ฑ์ ์ํ ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ฅผ ๋ณด๋ด์ค
struct {
select (KeyExchangeAlgorithm) {
case dh_anon:
ServerDHParams params;
case dhe_dss:
case dhe_rsa:
ServerDHParams params;
digitally-signed struct {
opaque client_random[32];
opaque server_random[32];
ServerDHParams params;
} signed_params;
case rsa:
case dh_dss:
case dh_rsa:
struct {} ;
/* message is omitted for rsa, dh_dss, and dh_rsa */
/* may be extended, e.g., for ECDH -- see [TLSECC] */
};
} ServerKeyExchange;
CertificateRequest
ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ์์ฒญ ํ๋ ๊ฒฝ์ฐ ๋ณด๋
struct {
ClientCertificateType certificate_types<1..2^8-1>;
SignatureAndHashAlgorithm
supported_signature_algorithms<2^16-1>;
DistinguishedName certificate_authorities<0..2^16-1>;
} CertificateRequest;
ServerHelloDone
์๋ฒ์์ ๋ฉ์ธ์ง๋ฅผ ๋ค ๋ณด๋๋ค๊ตฌ ์๋ ค์ค
struct { } ServerHelloDone;
ClientKeyExchange
ํด๋ผ์ด์ธํธ ๋ณด์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ณด๋ด์ค
struct {
select (KeyExchangeAlgorithm) {
case rsa:
EncryptedPreMasterSecret;
case dhe_dss:
case dhe_rsa:
case dh_dss:
case dh_rsa:
case dh_anon:
ClientDiffieHellmanPublic;
} exchange_keys;
} ClientKeyExchange
CertificateVerify
ํ์ฌ ๊น์ง ๋ณด๋ธ ๋ฉ์ธ์ง์ ํด์ฌ๊ฐ์ ๋ํ ์ ์ ์๋ช
์ ๋ณด๋
์ง๊ธ ๊น์ง ๋ณด๋ธ Handshake์ ๋ชจ๋ ๋ฉ์ธ์ง์ ๋ํ ์๋ช
๊ฐ์ ๋ฃ์ด์ ๋ณด๋.
struct {
digitally-signed struct {
opaque handshake_messages[handshake_messages_length];
}
} CertificateVerify;
ChangeCipherSpec
์ฑ๊ณต์ ํค ๊ณต์ ํ์๊ณผ ์ดํ ๋ฉ์ธ์ง๋ ์ํธํ ์์ ์๋ฆผ
struct {
enum { change_cipher_spec(1), (255) } type;
} ChangeCipherSpec;
Finished
ํธ๋์์ดํฌ์ ์ฑ๊ณต์ ์ํธํ๋ก ์๋ฆผ
์ง๊ธ ๊น์ง ๋ชจ๋ Handshake ๋ฉ์ธ์ง์ ๋ํ Hash ๊ฐ์ ํฌํจ ํ์ฌ ์ ๋ฌ
struct {
opaque verify_data[verify_data_length];
} Finished;
์ด๋ ๊ฒ Handshake ๊ฐ ๋๋๊ณ ๋๋ฉด ApplicationData ์ ์ก์ ํตํ ๋ฐ์ดํ ์ ์ก์ด ์ด๋ฃจ์ด ์ง๋ค.
์ด๋ ApplicationData ๊ฒฝ์ฐ๋ Sequence ๋ฒํธ๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ๋ํ ๋ณด์ฅ์ด ์ด๋ฃจ์ด ์ ์ผ ํ๋ค.
'PKI > TLS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SSL ์ธ์ฆ์์ https ๋๋ฉ์ธ ์ฃผ์ ์ฐ๊ด์ฑ (0) | 2023.06.08 |
---|---|
TLS ํธ๋์์ดํฌ ๊ธฐ๋ฅ ๊ฐ๋จ ์ค๋ช (0) | 2023.06.08 |
TLS ์์ ECDH ํค ํฉ์ ๊ฒฝ์ฐ PRF (PseudoRandom Function) ๋ฐฉ์ (0) | 2023.04.14 |