-
Notifications
You must be signed in to change notification settings - Fork 210
/
Copy pathtls.tex
163 lines (136 loc) · 12.9 KB
/
tls.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
\section{Протокол SSL/TLS}\index{протокол!SSL/TLS}
\selectlanguage{russian}
Протокол SSL (\langen{Secure Sockets Layer}) был разработан компанией Netscape. Начиная с версии 3, протокол развивается как открытый стандарт TLS (\langen{Transport Layer Security}). Протокол SSL/TLS обеспечивает защищённое соединение по незащищённому каналу связи на прикладном уровне модели TCP/IP. Протокол встраивается между прикладным и транспортным уровнями стека протоколов TCP/IP. Для обозначения <<новых>> протоколов, полученных с помощью инкапсуляции прикладного уровня (HTTP\index{протокол!HTTP}, FTP\index{протокол!FTP}, SMTP\index{протокол!SMTP}, POP3\index{протокол!POP3}, IMAP\index{протокол!IMAP} и~т.\,д.) в SSL/TLS, к обозначению добавляют суффикс <<S>> (<<Secure>>): HTTPS\index{протокол!HTTPS}, FTPS\index{протокол!FTPS}, POP3S\index{протокол!POP3S}, IMAPS\index{протокол!IMAPS} и~т.\,д.
Протокол обеспечивает следующее:
\begin{itemize}
\item Одностороннюю или взаимную аутентификацию клиента и сервера по открытым ключам сертификата X.509. В Интернете, как правило, делается \emph{односторонняя} аутентификация веб-сервера браузеру клиента, то есть только веб-сервер предъявляет сертификат (открытый ключ и ЭП к нему от вышележащего УЦ).
\item Создание сеансовых симметричных ключей для шифрования и кода аутентификации сообщения для передачи данных в обе стороны.
\item Конфиденциальность\index{конфиденциальность} -- блочное или потоковое шифрование передаваемых данных в обе стороны.
\item Целостность\index{целостность} -- аутентификацию отправляемых сообщений в обе стороны имитовставкой\index{имитовставка} $\HMAC(K,M)$, описанной ранее.
\end{itemize}
Рассмотрим протокол TLS последней версии 1.2.
\subsection{Протокол <<рукопожатия>>}
Протокол <<рукопожатия>> (\langen{Handshake Protocol}) производит аутентификацию и создание сеансовых ключей между клиентом $C$ и сервером $S$.
\begin{enumerate}
\item $C \rightarrow S$:
\begin{enumerate}
\item ClientHello: ~ 1) URI сервера, ~ 2) одноразовая метка $N_C$\index{одноразовая метка}, ~ 3) поддерживаемые алгоритмы шифрования, кода аутентификации сообщений, хеширования, ЭП и сжатия.
\end{enumerate}
\item $C \leftarrow S$:
\begin{enumerate}
\item ServerHello: одноразовая метка $N_S$, поддерживаемые сервером алгоритмы.
После обмена набором желательных алгоритмов сервер и клиент по единому правилу выбирают общий набор алгоритмов.
\item Server Certificate: сертификат X.509v3 сервера с запрошенным URI (URI нужен в случае нескольких виртуальных веб-серверов с разными URI на одном узле c одним IP-адресом).
\item Server Key Exchange Message: информация для создания предварительного общего секрета $premaster$ длиной 48 байтов в виде: ~ 1) обмена по протоколу Диффи~---~Хеллмана\index{протокол!Диффи~---~Хеллмана} с клиентом (сервер отсылает $(g, g^a)$), ~ 2)Обмена по другому алгоритму с открытым ключом, ~ 3) разрешения клиенту выбрать ключ.
\item Электронная подпись к Server Key Exchange Message на ключе сертификата сервера для аутентификации сервера клиенту.
\item Certificate Request: опциональный запрос сервером сертификата клиента.
\item Server Hello Done: идентификатор конца транзакции.
\end{enumerate}
\item $C \rightarrow S$:
\begin{enumerate}
\item Client Certificate: сертификат X.509v3 клиента, если он был запрошен сервером.
\item Client Key Exchange Message: информация для создания предварительного общего секрета $premaster$ длиной 48 байтов в виде: ~ 1) либо обмена по протоколу Диффи~---~Хеллмана\index{протокол!Диффи~---~Хеллмана} с сервером (клиент отсылает $g^b$, в результате обе стороны вычисляют ключ $premaster = g^{ab}$), ~ 2) либо обмена по другому алгоритму, ~ 3) либо ключа, выбранного клиентом и зашифрованного на открытом ключе из сертификата сервера.
\item Электронная подпись к Client Key Exchange Message на ключе сертификата клиента для аутентификации клиента серверу (если клиент использует сертификат).
\item Certificate Verify: результат проверки сертификата сервера.
\item Change Cipher Spec: уведомление о смене сеансовых ключей.
\item Finished: идентификатор конца транзакции.
\end{enumerate}
\item $C \leftarrow S$:
\begin{enumerate}
\item Change Cipher Spec: уведомление о смене сеансовых ключей.
\item Finished: идентификатор конца транзакции.
\end{enumerate}
\end{enumerate}
% http://tools.ietf.org/html/rfc5246#page-37
% struct {
% ProtocolVersion client_version;
% Random random;
% SessionID session_id;
% CipherSuite cipher_suites<2..2^16-2>;
% CompressionMethod compression_methods<1..2^8-1>;
% select (extensions_present) {
% case false:
% struct {};
% case true:
% Extension extensions<0..2^16-1>;
% };
% } ClientHello;
% 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;
% struct {
% ASN.1Cert certificate_list<0..2^24-1>;
% } Certificate;
% 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;
% struct {
% ClientCertificateType certificate_types<1..2^8-1>;
% SignatureAndHashAlgorithm
% supported_signature_algorithms<2^16-1>;
% DistinguishedName certificate_authorities<0..2^16-1>;
% } CertificateRequest;
% 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;
% struct {
% digitally-signed struct {
% opaque handshake_messages[handshake_messages_length];
% }
% } CertificateVerify;
% struct {
% opaque verify_data[verify_data_length];
% } Finished;
Одноразовая метка $N_C$ состоит из 32 байтов. Первые 4 байта содержат текущее время (gmt\_unix\_time), оставшиеся байты -- псевдослучайную последовательность, которую формирует криптографически стойкий генератор псевдослучайных чисел.
Предварительный общий секрет $premaster$ длиной 48 байтов вместе с одноразовыми метками используется как инициализирующее значение генератора $PRF$ для получения общего секрета $master$, тоже длиной 48 байтов:
\[ master = PRF(premaster, ~\text{текст \textquotedblleft master secret\textquotedblright}, ~ N_C + N_S) .\]
И, наконец, уже из секрета $master$ таким же способом генерируется 6 окончательных сеансовых ключей, следующих друг за другом в битовой строке:
\[ \{ (K_{E,1} ~\|~ K_{E,2}) ~\|~ (K_{\MAC,1} ~\|~ K_{\MAC,2}) ~\|~ (IV_1 ~\|~ IV_2) \} = \]
\[ = PRF(master, ~\text{текст \textquotedblleft key expansion\textquotedblright}, ~ N_C + N_S), \]
где $K_{E,1}$, $K_{E,2}$ -- два ключа симметричного шифрования, $K_{\MAC,1}$, $K_{\MAC,2}$ -- два ключа имитовставки\index{имитовставка}, $IV_1$, $IV_2$ -- два инициализирующих вектора режима сцепления блоков\index{вектор инициализации}. Ключи с индексом 1 используются для коммуникации от клиента к серверу, с индексом 2 -- от сервера к клиенту.
\subsection{Протокол записи}
Протокол записи (\langen{Record Protocol}) определяет формат TLS-пакетов для вложения в TCP-пакеты.
\begin{enumerate}
\item Исходными сообщениями $M$ для шифрования являются пакеты протокола следующего уровня в модели OSI: HTTP\index{протокол!HTTP}, FTP\index{протокол!FTP}, IMAP\index{протокол!IMAP} и~т.\,д.
\item Сообщение $M$ разбивается на блоки $m_i$ размером не более 16 кибибайт.
\item Блоки $m_i$ сжимаются алгоритмом компрессии в блоки $z_i$.
\item Вычисляется имитовставка\index{имитовставка} для каждого блока $z_i$ и добавляется в конец блоков: $a_i = z_i ~\|~ \HMAC(K_{\MAC}, z_i)$.
\item Блоки $a_i$ шифруются симметричным алгоритмом с ключом $K_E$ в некотором режиме сцепления блоков с инициализирующим вектором $IV$ в полное сжатое аутентифицированное зашифрованное сообщение $C$.
\item К шифртексту $C$ добавляется заголовок протокола записи TLS, в результате чего получается TLS-пакет для вложения в TCP-пакет.
\end{enumerate}