The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
" Протокол HTTPS."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

" Протокол HTTPS."  +/
Сообщение от oleg_3 (ok) on 23-Мрт-11, 21:35 
[СИ] Протокол HTTPS.

Язык СИ
ОС UNIX

Пытаюсь изучить HTTPS.
http://www.ietf.org/rfc/rfc2246.txt (TLS версия 1.0)
http://citforum.ru/nets/semenov/6/tls.shtml -TLS русский перевод
http://citforum.ru/nets/semenov/6/ssl_65.shtml -SSL русский

На стадии client-hello/server-hello.
Вижу их.
Начинаю понимать описанные в протоколах TLS и SSL структуры,
но путаница в голове великая.
Особенно со слоями и версиями.

Почему-то ИЕ дает client-hello соответствующий протоколу SSL.
А когда я такой же client-hello даю на серверы, то
ответ server-hello соответствует TLS.
Не понимаю как различить где TLS, а где SSL?
Ведь в TLS есть свой client-hello и с ним тоже работает.
Непонятно как сервер их различает?

Кто знает прошу ответить.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. " Протокол HTTPS."  +/
Сообщение от Slavaz (ok) on 24-Мрт-11, 02:55 
> Непонятно как сервер их различает?

TLS-сессия начинается с нешифрованной фразы STARTTLS

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. " Протокол HTTPS."  +/
Сообщение от oleg_3 (ok) on 24-Мрт-11, 08:30 
Не встретил упоминания этой фразы.

Создаю приконнекченный TCP-сокет (google.ru:443).
Посылаю туда в первом случае TLS:

---заголовок фрагмента---
"0x16"       - type - handshake - рукопожатие
"0x03, 0x00" - версия
"0x00, 0x37" - длина фрагмента
---заголовок записи (Content-Type)---
"0x01"       - client hello
и т.д.

Во втором случае SSL:

---заголовок записи (рекорда)---
"0x80"        - первые два бита специальные, остальные длина
"0x2E"        - длина
---данные---
"0x01"        - client hello
"0x03, 0x00"  - версия
и т. д.

Оба варианта работают. Ответ одинаковый TLS:

---заголовок фрагмента---
"0x16"       - type - handshake - рукопожатие
"0x03, 0x00" - версия
"0x00, 0x4A" - длина фрагмента
---заголовок записи (Content-Type)---
"0x02"       - server hello
и т.д.

Как сервер отличает эти два варианта?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. " Протокол HTTPS."  +/
Сообщение от anonymous (??) on 24-Мрт-11, 17:29 
> [СИ] Протокол HTTPS.
> Язык СИ
> ОС UNIX

а openssl вы таки пользуетесь?

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

4. " Протокол HTTPS."  +/
Сообщение от oleg_3 (ok) on 24-Мрт-11, 22:48 
> а openssl вы таки пользуетесь?

Нет.

Запросы, они короткие, написал побайтно вручную.
Там только одно случайное число, пока оно фиксировано.
Ответ вижу в файле. Иначе говоря всё, что поверх TCP.

Этот маленький тест на СИ.
Сейчас многие пишут свой HTTPS, например
http://www.inattack.ru/article/543.html
В nginx, если я правильно догадался, тоже
есть встроенный. Вот и подумал, что кто-нибудь
знает ответ.

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. " Протокол HTTPS."  +/
Сообщение от pavlinux (ok) on 24-Мрт-11, 23:04 
Гуглю забанили?

https://encrypted.google.com/search?source=ig&hl=ru&rlz=&q=w...


The main difference is that, while SSL connections
begin with security and proceed directly to secured
communications, TLS connections first begin with an insecure “hello”
to the server and only switch to secured communications after the
handshake between the client and the server is successful.
If the TLS handshake fails for any reason, the connection is never created.

Тута понятно?

---
The differences between the two protocols are very minor and very technical,
but they are different standards. TLS uses stronger encryption algorithms
and has the ability to work on different ports. Additionally, TLS version 1.0
does not interoperate with SSL version 3.0.
---
While SSL and TLS provide similar functionality, they are not interchangeable. The TLS protocol is backwards compatible with SSL, however, which means it works with client-server connections that require SSL. Yet, SSL does not work with client-server connections that require TLS.

---

- Comparison of SSL and TLS

Stephen Thomas explains that there are seven main differences between SSL
and TLS. These differences range from protocol version numbers to the generation of
key material.

* Protocol Version in Messages
To differentiate TLS Version 1.0 and SSL Version 3.0, the protocol version
number negotiated by a client and server communicating through TLS Version 1, is
version number 3.1,

* Alert Protocol Message Types

The following message types are those that are allowed as Alert Descriptions
within the TLS protocol. Upon examination of the list, one would that
“NoCertificate” has been removed from the SSL list, since it is assumed that if no
certificate exists for the user, there is no need for a separate message.
TLS uses the assumption that the client can return an empty certificate message
if it does not have a certificate to use.

Additionally, several more descriptions have been added to bring the number of
Alert Descriptions to 23 from 12.
A list of these descriptions is below. Again, those resulting in fatal errors
are bolded.

CloseNotify
UnsupportedCertificate
DecryptError
UnexpectedMessage
CertificateRevoked
ExportRestriction
BadRecordMAC
CertificateExpired
ProtocolVersion
DecryptionFailure
CertificateUnknown
InsufficientSecurity
RecordOverflow
IllegalParameter
InternalError
DecompressionFailure
UnknownCA
UserCancelled
HandshakeFailure
AccessDenied
NoRenegotiation
BadCertificate
DecodeError


* Message Authentication
TLS implements a standardized MAC (H-MAC) that has been proven in many
other implementations. The main benefit to this change is that H-MAC operates with
any hash function, not just MD5 or SHA, as explicitly stated by the SSL protocol.

* Key Material Generation
TLS uses the HMAC standard and its pseudorandom function (PRF) output to
generate key material. Thomas explains that “each system starts with the premaster
secret; next it creates the master secret. Then it generates the required key material.”
The major difference is that SSL uses RSA, Diffie-Hellman or Fortezza/DMS
output to create key material. This output generates secret information based on the
cipherSuite and Parameters selected during session negotiations.

* CertificateVerify
In SSL, the CertificateVerify message requires a complex procedure of
messages. With TLS, however, the verified information is completely contained in the
handshake messages previously exchanged during the session.

* Finished
In TLS, the PRF output of the H-MAC algorithm is used with the master secret
and either a “client finished” or a “server finished” designation to create the Finished
message. In SSL, the finished message is created in the same ad-hoc manner that key
material is generated: using a combination of hash output, selected ciphersuite and
parameter information.

* Baseline Cipher Suites
As mentioned earlier, SSL specifically supports RSA, Diffie-Hellman and
Fortezza/DMS ciphersuites. TLS has stopped allowing Fortezza/DLS support, but
allows for ciphersuites to be added to the protocol in future revisions.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. " Протокол HTTPS."  +/
Сообщение от oleg_3 (ok) on 25-Мрт-11, 12:09 
> Гуглю забанили?
> https://encrypted.google.com/search?source=ig&hl=ru&rlz=&q=w...

Нет. Не понятно.

Протоколы чем-то отличаются, а в чем-то похожи.
Предположим, что я пишу сервер. В нем две ветви:
SSL и TLS. На вход приходит некий набор байт, как
в моем примере, эти байты нужно "распарсить".
"Парсить" нужно по разному, в зависимости от протокола.
На какую ветвь уходить?

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

7. " Протокол HTTPS."  +/
Сообщение от pavlinux (ok) on 25-Мрт-11, 12:11 
>> Гуглю забанили?
>> https://encrypted.google.com/search?source=ig&hl=ru&rlz=&q=w...
> Нет. Не понятно.
> Протоколы чем-то отличаются, а в чем-то похожи.
> Предположим, что я пишу сервер. В нем две ветви:
> SSL и TLS. На вход приходит некий набор байт, как
> в моем примере, эти байты нужно "распарсить".
> "Парсить" нужно по разному, в зависимости от протокола.
> На какую ветвь уходить?

The main difference is that, while SSL connections
begin with security and proceed directly to secured
communications, TLS connections first begin with an insecure “hello”
to the server and only switch to secured communications after the
handshake between the client and the server is successful.
If the TLS handshake fails for any reason, the connection is never created.


SSL - сначала устанавливаешь шифрованное соединение, а затем прилетает hello
TSL - сначала hello, потом всё остальное.

Отсюда сложный вывод, если прилетело hello, то TLS, если нет, то SSL.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

8. " Протокол HTTPS."  +/
Сообщение от oleg_3 (ok) on 25-Мрт-11, 15:03 
Первый.
http://citforum.ru/nets/semenov/6/ssl_65.shtml

6.5.1. Спецификация протокола записей SSL 6.5.1.1. Формат заголовка записи SSL

(2 - 3 байта заголовка записи)
RECORLENGTH = ((byte[0] & 0x7F << 8)) | byte[1];

6.5.2.5. Протокольные сообщения клиента

CLIENT-HELLO (Фаза 1; посылается открыто)

char MSG-CLIENT-HELLO
char CLIENT-VERSION-MSB
char CLIENT-VERSION-LSB
char CIPHER-SPECS-LENGTH-MSB
char CIPHER-SPECS-LENGTH-LSB
char SESSION-ID-LENGTH-MSB
char SESSION-ID-LENGTH-LSB
char CHALLENGE-LENGTH-MSB
char CHALLENGE-LENGTH-LSB
char CIPHER-SPECS-DATA[(MSB<<8)|LSB]
char SESSION-ID-DATA[(MSB<<8)|LSB]
char CHALLENGE-DATA[(MSB<<8)|LSB]

ИЕ первый запрос дает в точности соответствующий
этому описанию SSL. Я вижу это как последовательность
0x80,0x2E,0x01,0x03,0x00,0x00,0x15,0x00, и т. д.

Второй.
http://citforum.ru/nets/semenov/6/tls.shtml
(http://rfc2.ru/2246.rfc тут то же самое, но лучше изложено)

6.2.1. Фрагментация  (запись)
struct {
ContentType type;   //   handshake(22),
ProtocolVersion version;
uint16 length;
opaque fragment[TLSPlaintext.length]; //  сюда входят две нижние структуры
} TLSPlaintext;

7.4. Handshake protocol
struct {
HandshakeType msg_type;    //  client_hello(1),
uint24 length;            
client_hello       ClientHello;
} Handshake;

7.4.1.2. Hello клиента
struct {
ProtocolVersion client_version;
Random random;
SessionID session_id;
CipherSuite cipher_suites<2..216-1>;
CompressionMethod compression_methods<1..28-1>;  
} ClientHello;

Другой запрос TLS, написаный мною. Последовательность байт
0x16, 0x03, 0x00, 0x00, 0x37,   и т. д.

Каждый из этих запросов посылаю на сервер и получаю ответ TLS,
содержащий server-hello (который я понимаю), сертификат, еще
что-то (которые я пока не понимаю) и server_hello_done.

Дальнейший обмен невозможен, т. к. я туда еще не продвинулся

В протоколе TLS есть еще пункт
E. Совместимость с SSL
который я сначала не заметил. Но все равно не понял.

На сервер приходит не hello, а какие-то байты, которые надо
как-то интерпретировать. Они разные

0x80,0x2E,0x01,0x03,0x00,0x00,0x15,0x00, и т. д.
0x16, 0x03, 0x00, 0x00, 0x37,   и т. д.

Ответ как будто одинаковый.

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру