GNUTLS - przyk

Potrzebujesz pomocy z C, C++, perl, python, itp.
rafal44
Posty: 4
Rejestracja: 12 marca 2011, 20:08

GNUTLS - przykład z dokumentacji nie działa

Post autor: rafal44 »

Potrzebuję utworzenia szyfrowanego połączenia TCP.
Sięgnąłem więc po oprogramowanie GNUTLS. Znalazłem dwa przykłady, serwer i klient, nie wymagające uwierzytelnienia:

Kod: Zaznacz cały

Simple client example with anonymous authentication 
Echo Server with anonymous authentication
Więc, przepisuję kod zachowując treść (forma była zmieniona), kompiluję, uruchamiam. Nie działa.
Programy zatrzymywały komunikację na:

Kod: Zaznacz cały

gnutls_handshake()
Skompilowałem więc kod z przykładów (z nadzieją, że to ja coś popsułem), ale to nie pomogło, błąd występuje dalej. Dodałem funkcje do logowania, aby zobaczyć co dzieje się wewnątrz GNUTLS.

Serwer:

Kod: Zaznacz cały

WARNING: gnome-keyring:: couldn't connect to: /tmp/keyring-MWg96J/pkcs11: No such file or directory
Server ready.
LOG* 4 * REC[0x8e35410]: Allocating epoch #0
LOG* 2 * ASSERT: gnutls_priority.c:832
Connection from: 127.0.0.1
4 : TEST
LOG* 2 * ASSERT: gnutls_constate.c:695
LOG* 4 * REC[0x8e35410]: Allocating epoch #1
LOG* 7 * READ: Got 0 bytes from 0x5
LOG* 7 * READ: read 0 bytes from 0x5
LOG* 2 * ASSERT: gnutls_buffers.c:640
LOG* 2 * ASSERT: gnutls_record.c:969
LOG* 2 * ASSERT: gnutls_handshake.c:2991
LOG* 6 * BUF[HSK]: Cleared Data from buffer
LOG* 6 * BUF[HSK]: Cleared Data from buffer
LOG* 4 * REC[0x8e35410]: Epoch #0 freed
LOG* 4 * REC[0x8e35410]: Epoch #1 freed
Handshake failed A TLS packet with unexpected length was received.
LOG* 4 * REC[0x8e35410]: Allocating epoch #0
LOG* 2 * ASSERT: gnutls_priority.c:832
Klient:

Kod: Zaznacz cały

WARNING: gnome-keyring:: couldn't connect to: /tmp/keyring-MWg96J/pkcs11: No such file or directory
LOG* 4 * REC[0x94bb4f8]: Allocating epoch #0
LOG* 2 * ASSERT: gnutls_priority.c:832
connecting...
LOG* 2 * ASSERT: gnutls_constate.c:695
LOG* 4 * REC[0x94bb4f8]: Allocating epoch #1
LOG* 2 * ASSERT: gnutls_handshake.c:2067
LOG* 2 * ASSERT: gnutls_handshake.c:2753
LOG* 6 * BUF[HSK]: Cleared Data from buffer
Handshake failed
GnuTLS error: GnuTLS internal error.
LOG* 6 * BUF[HSK]: Cleared Data from buffer
LOG* 4 * REC[0x94bb4f8]: Epoch #0 freed
LOG* 4 * REC[0x94bb4f8]: Epoch #1 freed
Gdzie jest błąd?
Kogo mam zapytać? Twórcy GNUTLS, opiekuna pakietu?
Jeżeli GNUTLS nie działa to może spróbować czegoś innego. Proszę o przykład.
Mój system: Debian testowy i686
fnmirk
Senior Member
Posty: 8321
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

Dlaczego kompilujesz skoro oprogramowanie dostępne jest w repozytorium.
http://packages.debian.org/search?keywo ... lla-search
rafal44
Posty: 4
Rejestracja: 12 marca 2011, 20:08

Post autor: rafal44 »

Przepraszam, na chwilę obecną internet mam z telefonu komórkowego, i nie mogłem odpisać, ale teraz mogę.
Nie wiem czy się wyraziłem jasno. Używam GNUTLS z repozytorium, paczka gnutls-doc też. W tej paczce są źródła przykładów, które skompilowałem, aby nie pomylić się przy przepisywaniu lub kopiowaniu. Te same przykłady są zawarte w plikach pdf lub html dokumentacji.

Mam do dyspozycji jeden komputer, więc nie mogę sprawdzić jakie dane są wymieniane między klientem a serwerem korzystając z jakiegoś sniffera.
Ale wykorzystałem program strace
W uproszczeniu:


Klient:

Kod: Zaznacz cały

connect(4, {sa_family=AF_INET, sin_port=htons(4500), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
brk(0x903f000)                          = 0x903f000
brk(0x902f000)                          = 0x902f000
write(2, "Handshake failed\n", 17Handshake failed
)      = 17
write(2, "GnuTLS error: GnuTLS internal er"..., 37GnuTLS error: GnuTLS internal error.
) = 37

Serwer:

Kod: Zaznacz cały

accept(4, {sa_family=AF_INET, sin_port=htons(42955), sin_addr=inet_addr("127.0.0.1")}, [16]) = 5
write(1, "Connection from: 127.0.0.1\n", 27Connection from: 127.0.0.1
) = 27
recv(5, "", 5, 0)                       = 0
close(5)                                = 0
write(2, "Handshake failed A TLS packet wi"..., 67Handshake failed A TLS packet with unexpected length was received.
) = 67

Jak widać klient nie wysyła nic do serwera. Serwer wywołując recv() dostaje w wyniku 0 (zakończenie połączenia) (gdy gnutls_handshake() zwróci błąd to wywoływane jest close() po stronie klienta).
Zatem błąd jest w kodzie źródłowym klienta, w kodzie z dokumentacji.

Co więcej ostrzeżenie:

Kod: Zaznacz cały

WARNING: gnome-keyring:: couldn't connect to: /tmp/keyring-MWg96J/pkcs11: No such file or directory
Pojawia się w innych programach, np. git.
Nie mam w pełni zaktualizowanego systemu (nie z takim internetem), ale po wykonaniu aktualizacji nie zauważyłem aby pojawił się pakiet związany z gnutls. Chociaż, gdy kończę sesję (wylogowywanie) to wyskakuje mi okienko, że nie można zakończyć procesu gnome-keyring.
ODPOWIEDZ