- •Московский государственный институт электронной техники (технический университет)
- •Протокол Secure Socket Layer
- •Сертификат.
- •Содержание сертификата.
- •Цепочки сертификатов
- •Корневой центр сертификации.
- •Протокол«рукопожатия»
- •Протокол записейSsl.
- •Протокол Secure Electronic Transaction
- •Процедуры генерации, обновления и отзыва сертификатов
- •Реализация транзакций в протоколе set
- •Характеристики протокола set
- •Приложение 1. Использование пакетаOpenSsLдля генерации сертификата.
- •Список литературы
Протокол записейSsl.
Протокол записей SSLполучает данные от протоколов верхнего уровня в непустых блоках заданного размера. Он разбивает блоки информации на записи, способные передавать до 214байт информации. Границы сообщений клиента не сохраняются на уровне записей (т.е. множество сообщений с одинаковым типом содержимого могут быть объединены в одну запись или одно сообщение может быть разбито на несколько записей)
Структура записи может быть представлена следующим образом:
struct {
uint8 major, minor;
} ProtocolVersion;
enum {
change_cipher_spec(20), alert(21), handshake(22),
application_data(23), (255)
} ContentType;
struct {
ContentType type;
ProtocolVersion version;
uint16 length;
opaque fragment[TLSPlaintext.length];
} TLSPlaintext;
type
Протокол верхнего уровня, используемый для обработки содержащегося фрагмента данных.
version
Версия протокола. Для TLSver1.0 – {3,1}, дляSSLv3 – {3,0}
length
Длина в байтах следующего TLSPlaintext.fragment. Не может превышать 214.
fragment
Прикладные данные. Эти данные прозрачны и рассматриваются как независимый блок, обрабатываемый протокол верхнего протокола задаваемым полем type.
Все записи сжимаются с использованием протокола сжатия, определеямым текущим состоянием сеанса. В начальном состоянии он определяется как CompressionMethod.null. Алгоритм сжатие преобразует структуруTLSPlaintextв структуруTLSCompressed. Функции сжатия инициализируются начальным состоянием, каждый раз когда состояние соединения становится активным.
Алгоритмы сжатия должны быть без потери качества и не должны увеличивать длину содержимого более чем на 1024 байта. Если функция распаковки получает запись TLSCompressed.fragment, длина которой после распаковки превышает 214она должна сообщить о фатальной ошибке декомпрессии.
Запись TLSCompressedимеет следующую структуру:
struct {
ContentType type; /* same as TLSPlaintext.type */
ProtocolVersion version;/* same as TLSPlaintext.version */
uint16 length;
opaque fragment[TLSCompressed.length];
} TLSCompressed;
Функции шифрования и MACпреобразуют записьTLSCompressedвTLSCiphertext. Функции расшифровывания обращают процесс.MACзаписи также включает ее номер, что позволяет обнаружить потерю, получение лишних или повторение сообщений.
Структура TLSCiphertext:
struct {
ContentType type;
ProtocolVersion version;
uint16 length;
select (CipherSpec.cipher_type) {
case stream: GenericStreamCipher;
case block: GenericBlockCipher;
} fragment;
} TLSCiphertext;
Поточные шифры конвертируют TLSCompressed.fragmentиз/вTLSCiphertext.fragment.
stream-ciphered struct {
opaque content[TLSCompressed.length];
opaque MAC[CipherSpec.hash_size];
} GenericStreamCipher;
MACвычисляется следующим образом:
HMAC_hash(MAC_write_secret, seq_num + TLSCompressed.type +
TLSCompressed.version + TLSCompressed.length +
TLSCompressed.fragment));
где "+" обозначает конкатенацию строк.
При этом МАС вычисляется до шифрования. Поточный шифр шифрует весь блок включая МАС. Для поточных шифров не использующих вектор синхронизации (например, RC4), состояние шифра в конце одной записи используется для следующего пакета. ЕслиCipherSuiteравенTLS_NULL_WITH_NULL_NULL, шифрование не производится и МАС не вычисляется.
Для блочных шифров (например, RC2 илиDES), функции шифрования и МАС конвертируют структурыTLSCompressed.fragmentв/изTLSCiphertext.fragment.
block-ciphered struct {
opaque content[TLSCompressed.length];
opaque MAC[CipherSpec.hash_size];
uint8 padding[GenericBlockCipher.padding_length];
uint8 padding_length;
} GenericBlockCipher;
MACвычисляется также как и для поточных шифров.
padding
Заполнитель используется для дополнения открытого текста до размера кратного размеру входного блока шифра. Заполнитель может иметь произвольную длину до 255 байт. Заполнители с длиной большей чем необходимо могут использоваться для предотвращения атак на протокол, основанных на анализе длины сообщений. Каждый uint8-блок данных заполнителя должен быть заполнен значением длины заполнителя.
padding_length
Длина заполнителя должны быть такой, чтобы общая длина структуры GenericBlockCipherбыла кратна размеру блока шифра. Допустимы значения от 0 до 255. Эта длина включает длину всех полей заполнителя, за исключения самого поляpadding_length.
Длина зашифрованных данных (TLSCiphertext.length) на единицу больше суммыTLSCompressed.length,CipherSpec.hash_sizeиpadding_length.
Пример: Если длина блока 8 байт, длина содержимого (TLSCompressed.length) 61 байт и длинаMAC20 байт, то длина без заполнителя будет 82 байта. Таким образом, длина заполнителя по модулю 8 должна быть равна 6, чтобы получить общую длину кратную восьми. Длина заполнителя может быть 6, 14, 22 и т.д. до 254. Если выбрать минимальную длину, 6, заполнитель будет из 6 байт, каждый из которых содержит значение 6. Последние восемь байтGenericBlockCipherдо шифрования блока будутxx06 06 06 06 06 06 06, гдеexx– последний байт иммитовставки(МАС).
Замечание: для блочных шифров в режиме СВС (CipherBlockChaining) вектор инициализации (IV) для первой записи генерируется с другими ключами при установки параметров защиты. В качествеIVдля последующих записей берется последний блок зашифрованного текста из предыдущей записи.