portal Michała Hanćkowiaka
Begin main content
Search · Index
No registered users in community Materiały
in last 10 minutes

SIK - Temat D - Bezpieczne gniazdka (SSL/TLS), email-e, ...

SSL = Secure Socket Layer
TLS = Transport Layer Security
OpenSSL = implementacja SSL/TLS

Strona główna OpenSSL: http://www.openssl.org/
opis polecenia openssl (NIE robić zadań, które w nim są!)
Definicja TLS i SSL: TLS (wikipedia pl), TLS (wikipedia en)
Certyfikaty SSL: http://tldp.org/HOWTO/SSL-Certificates-HOWTO/index.html
   !!! tu jest dobry opis działania ssl - patrz rozdz 1.2 !!!

Pakiet Tls języka Tcl oraz przykłady: tls1.5.zip, v1.5, dla lin i win
aby ta wersja działała poprawnie pod lin trzeba zdef zm. LD_LIBRARY_PATH (patrz czerwona uwaga w przykładzie);
w katalogu misc w tym zip-ie są skrypty do tworzenia certyfikatów SSL (CA.pl lub CA.sh);
dokumentacja pakietu tls v1.5 docs
materiały o j.Tcl z których można pobrać interpy Tcl-a...
04.04.2017, Uwaga!, przy wysyłaniu maili należy używać nowszej wersji pakietu tls dla j. Tcl: tcltls17.zip,
uwaga o LD_LIBRARY_PATH i bibl. libssl*/libcrypto* pozostaje w mocy...

04.11.2019, Uwaga!!, interp tclkit_2 posiada wbudowaną wersje pakietu "tls",
która nie ma ŻADNYCH zależności (nie wymaga bibl. libssl*/libcrypto*),
impl ta oparta jest na LibreSSL (nie na OpenSSL), sprawdź to przez tls::version
#bardzo stare linuxy: package re Ffidl; ffidl::symbol /usr/lib32/librt.so clock_gettime
ten pakiet "luzem" tls1.6.7_Libre.zip (działa na wszystkich wer. tclkit, ale trzeba ustawić auto_path)


Skrócony opis pojęć SSL/TLS:
  • klucz asymetryczny - para kluczy; jeśli jednym z nich się zaszyfruje wiadomość,
    to jedynie drugim można ją odszyfrować
    • klucz publiczny -
    • klucz prywatny - MUSI być trzymany w ukryciu!
  • klucz symetryczny - ten sam klucz do szyfrowania i odszyfrowywania (szybszy niż asymetryczne)
  • podpis elektroniczny - wiadomość zaszyfrowana kluczem prywatnym
  • certyfikat SSL - dowód, że dana osoba posiada dany klucz publiczny;
    powinien być podpisany przez CA;
    certyfikat zawiera klucz publiczny
  • CA - "autorytet" podpisujący certyfikaty SSL
Co zapewnia SSL/TLS?
  • uwierzytelnianie - sprawdzanie czy osoba jest tym za kogo się podaje
    (przykład uwierzytelniania: login+hasło)
    ssl/tls umożliwiaja uwierzytelnianie klienta i/lub serwera
  • szyfrowanie - nikt nie może zajrzeć do naszych wiadomości gdy wędrują przez sieć
  • zabezpieczenie przed złośliwymi modyfikacjami danych
Zasada działania SSL:
  • serwer wysyła do klienta swój cert+klucz pub
  • klient wymyśla klucz symetryczny X do szyfrowania danych, i szyfruje X kluczem pub serwera i wysyła do serwera
  • serwer odszyfrowuje swoim kluczem pryw X; teraz oba końce mają X służący do szyfrowania danych płynących przez połączenie
  • z tego opisu wynika, że klucz pub+pryw na serwerze jest koniecznie potrzebny!!!


Przykład użycia pakietu Tls w języku Tcl:

## uwierzytelnianie serwera --------------------------------------------
# - klient upewnia się, że serwer jest tym za kogo się podaje ...

lappend auto_path ścieżka_do_katalogu_tls
package require tls
# uwaga (dotyczy linux-a):
# aby zapewnić ładowanie się właściwych bibliotek libcrypto.so.* i libssl.so.*
# należy odpowiednio ustawić zmienną LD_LIBRARY_PATH: 
# export LD_LIBRARY_PATH=scieżka_bezwzgl_do_katalogu_tls

## serwer
tls::socket -server obsluga \
-keyfile nowy-private.pem -certfile nowy-public.pem \
-password haslo \
10000
# -keyfile: klucz pryw serwera (moze byc zawarty w cert!)
# -certfile: cert serwera (zawiera klucz pub)
proc haslo {} {return "qwerty"}; # haslo do klucza pryw serwera
proc obsluga {s args} {
_puts "server socket $s"; # zakladam ze uruchamiamy to z konsola2c.tcl
tls::handshake $s
}

gets sock???

## klient
set s [tls::socket -require 1 -cafile cacert.pem localhost 10000]
# -require 1: klient żąda sprawdzenia certyfikatu serwera
# -cafile: certyfikat CA (chodzi m.in. o klucz publiczny CA w tym pliku
# dzięki któremu klient sprawdza podpis na certyfikacie serwera)
tls::handshake $s

puts $s "A ku ku !!!"; flush $s


## uwierzytelnianie serwera ORAZ klientow ---------------------------
# - serwer sprawdza swoich klientów
# - jak widac, nic nie szkodzi ze ser i kli uzywaje tego samego cert!

lappend auto_path ścieżka_do_katalogu_tls
package require tls

## serwer
proc haslo {} {return "qwerty"}
tls::socket -server obsluga -require 1 -cafile cacert.pem \
-password haslo -keyfile nowy-private.pem -certfile nowy-public.pem \
10000
proc obsluga {s args} {
_puts "server socket $s"
tls::handshake $s
}

# wyciąganie informacji o kliencie (z jego certyfikatu)
tls::status sock???

gets sock???

## klient
proc haslo {} {return "qwerty"}
set s [tls::socket -require 1 -cafile cacert.pem \
-password haslo -keyfile nowy-private.pem -certfile nowy-public.pem \
localhost 10000
]
tls::handshake $s

puts $s "A ku ku !!!"; flush $s


Zadanie D.10 (3pkt)
Zmodyfikuj nieco powyższe przykłady, aby można było zaobserwować bezpieczną komunikację między dwoma konsolami
w następujących wariantach:
1. nikt się nie uwierzytelnia, tylko szyfrowanie,
2. szyfrowanie + serwer się uwierzytelnia,
3. szyfrowanie + klient i serwer się uwierzytelniają.
Wygeneruj nowe certyfikaty SSL, gdyż stare certyfikaty są już przeterminowane !!!
Dodatkowo zbadaj jak się dodaje obsługę SSL do pakietu http j. Tcl,
patrz komenda "http::register" w http docs i tls docs,
spróbuj odczytać jakąś stronę https (obecnie serwery wymagają wył. prot. ssl, a wł. tls!!).
Uwagi do generowania certyfikatów SSL:
używaj skryptu "CA.pl" jak opisano poniżej, pojawi sie seria pytań...
jako haslo do pliku z kluczem prywatnym (pass phrase) podaj "qwerty",
z pozostałych danych obowiązkowe jest chyba tylko "Common Name", nazwa właściciela certyfikatu;
opis PKI w wikipedii: -pl-, -en-
# poniższe czynności należy wykonać w katalogu ./misc (z rozpakowanego zip-a z pakietem tls v1.5 j. Tcl...)
# usunac katalog demoCA (jesli tego nie zrobimy bedziemy mieli przeterminowany cert CA !!
# ten cert można zobaczyć przez: openssl x509 -in cacert.pem -text)
./CA.sh -newca; # tworzy nowe środowisko do tworzenia cert SSL (katalog demoCA)
./CA.sh -newreq; # tworzymy cert (a dokladnie CSR) + klucz pryw.
./CA.sh -sign; # CA podpisuje cert
# zostną utworzone pliki:
#   demoCA/cacert.pem - cert CA
#   newcert.pem - cert który utworzyliśmy, podpisany przez CA
#   newreq.pem - zawiera klucz pryw.

10.04.2014: problem z pakietem tls j. Tcl:
pakiet ten ma problem z odszyfrowaniem pliku z kluczem prywatnym, który przygotowano nową wersją openssl...
aby temu przeciwdziałać wystarczy odpowiednio przekodować priv_ser.pem:
openssl pkcs8 -v2 des -in newreq.pem -out newreq_des.pem

21.04.2017; nowy problem współpracy starych i nowych wersji OpenSSL;
problem dotyczy fun. skrótu "sha256"...
wersje 0.9.7, 0.9.8 nie obsługują tej fun. w certyfikatach (podpis);
aby zmusić CA.pl i openssl aby po staremu użyły "sha1" zamiast "sha256" należy:
1. w pliku CA.pl dodać -sha1 przy obsłudze opcji -newca
2. cp /etc/ssl/openssl.cnf .; # a nastepnie
linie "default_md = default" zastapic przez "default_md = sha1"
oraz dodac zm. srod. "export SSLEAY_CONFIG="-config sciezka_bezwzgl_do_naszego_openssl.cnf'"
od tej chwili skrypt CA.pl bedzie generowal cert z podpisem opartym na sha1
dotyczy to cacert.pem jak i generowanych klienckich cert...
UWAGA: oczywiście w praktyce nie należy tego robić, gdyż zmiana sha1 na sha256
nastąpiła nie bez powodu; lepiej upgradeować bibl. OpenSSL...

patrz dyskusja: -1-

11.04.2018; do eksperymentu D.10 (1) należy użyć plików .pem z tego folderu.

12.04.2018; wszystkie problemy z różnymi wersjami OpenSSL można łatwo obejść
wymuszając używanie starej wersji openssl podczas działania CA.pl...
Należy skopiować starą wersję programu openssl i openssl.cfg z powyższego folderu
oraz zmusić program openssl aby używał bibl. *so.0.9.8* z pakietu tls1.7;
szczegóły jak należy to zrobić:
1. ustawić zm. środowiska PATH i LD_LIBRARY_PATH odpowiednio (pamiętać o export !),
2. upewnić się, że polecenie "openssl version" zwraca "OpenSSL 0.9.8k 25 Mar 2009",
3. zmusić polecenie openssl aby używało naszego "openssl.cfg" (uwaga z 21.04.2017),
czyli należy wykonać coś takiego:
PATH="$(pwd)/:$PATH"; # 12.12.2018, na Morasku działa bez "/", PATH="$(pwd):$PATH"
export LD_LIBRARY_PATH="$(pwd)/tls1.7:$LD_LIBRARY_PATH"
export SSLEAY_CONFIG="-config $(pwd)/openssl.cnf"
Dopiero teraz można uruchamiać skrypt CA.pl w celu utworzenia plików .pem;
wszystko powinno działać idealnie...

Zadanie D.11a, rozwiewanie wątpliwości co do TLS/SSL
Watpliwość 0:
Zbadaj co jest przesyłane przez poł TCP (co możemy zobaczyć) w przypadku HTTP i HTTPS,
zaprojektuj odpowiedni eksperyment, który to wyjaśni
Watpliwość 1:
Zbadaj eksperymentalnie jakie kombinacje dozwolonych protokołów (SSLv.2, SSLv.3, TLSv.1)
na kliencie i serwerze działaja...
Dozwolone protokoły ustawia się opcjami -ssl2, -ssl3, -tls1 w komendzie tls::socket.
Watpliwość 2:
Zbadaj czy przy uwierzytelnianiu klienta trzeba podać jego klucz prywatny (po co?).

Zadanie D.11b, uwierzytelnianie serwera https://www.amu.edu.pl
Podłącz się do serwera https://www.amu.edu.pl przy pomocy pkg "tls" j. Tcl,
wymuszając uwierzytelnienie serwera przy pomocy "-require 1";
musisz podać w opcji "-cafile" cert CA, który podpisał(?) cert serwera,
czy uwierzytelnienie się powiodło przekonasz się po "tls::handshake $s" ...
Wskazówki: port https= 443; skąd wziąć ten cert CA ?? użyj przeglądarki;
może istnieć "łańcuch zaufania" CA, w opcji -cafile należy podać jego koniec (self-signed)

..................................................................................

Email, serwery pocztowe, POP3, IMAP, SMTP
(mocno uproszczony opis...)
Serwer pocztowy zawiera "skrzynkę pocztową" z mailami użytkownika;
zawiera też implementacje protokołów POP3 i IMAP, które służą do wyciągania maili ze skrzynki;
zawiera także impl. prot SMTP, który służy do wysyłania/ przekazywania dalej maili
(serwer pocztowy jest zarówno klientem jak i serwerem SMTP!);
https://pl.wikipedia.org/wiki/Serwer_poczty_elektronicznej
http://www.tldp.org/HOWTO/Mail-Administrator-HOWTO-3.html
Mail terminology: MTA, MUA, MSA, ...
Czym różnia sie prot POP3 i IMAP ?
POP3 - ściąga maile w całości, w surowej postaci, tylko z folderu INBOX;
IMAP - obsługuje wiele folderów, pozwala zarządzać folderami (folderami skrzynki poczt. na serwerze),
pozwala ściągać wybrane elementy maili (np. tylko nagłówki)

Budowa (wewn.) maila:
Mail to text zaczynający się od nagłówków,
np. "Date:", "From:", "To:", "Subject:", "Content-Type:", ...
pustej linii, oraz tekstu maila...
Maile "proste" i "złożone":
maile proste to te, które mają content-type=text/plain,
maile złożone mają content-type=multipart/*, gdzie *=alternative, related, ...
maile złożone są zapisane w formacie MIME,
i składają się z "części mime",
części mime tworzą drzewko,
nie-liście w tym drzewku mają typ mime (podobny do content-type) = multipart/*,
liście w drzewku maja typ mime = text/html, text/plani, image/jpeg itp

Obsługa formatu mime w j. tcl : pakiet mime
pakiet ten pozwala zarówno parsować jak i tworzyc tekst w formacie mime;
parsowanie:
set m1 [mime::initialize -string "text w form. mime"]
set m1 [mime::initialize -file "nazwa pliku w form. mime"]
tworzenie tekstu:
set m1 [mime::initialize -canonical text/plain]
(patrz przykłady w folderze i docs pakietu mime j. Tcl)

Zadanie D.12a "pop3, mime, skrzynka pocztowa"
Spróbuj odczytać maile ze swojej skrzynki pocztowej, przy pomocy j. Tcl
oraz pakietów "pop3" oraz "mime" (oba z tcllib).
Wzoruj się na przykładzie w pliku pop3_sik.tcl z tego folderu.
Konieczne jest wcześniejsze załadowanie pakietu tls oraz "dodatku" do pakietu pop3, pop3_tls.tcl
który dodaje do tego pakietu obsluge tls/ssl.
Zdanie wykonaj tak jak zadanie D.12, tj wyślij do siebie maile tak jak to opisano w D.12...
Uwaga: Pakiet pop3 zwraca maile w postaci "surowej": nagłówki, pusta linia, tekst
(być może w formacie mime, to zależy od nagłówka "content-type:")
Dokumentacja używanych tutaj pakietów tcl: mime, pop3.

Zadanie D.12 "imap4, mime, skrzynka pocztowa" (2pkt)
Spróbuj odczytać maile ze swojej skrzynki pocztowej, przy pomocy j. Tcl
oraz pakietów "imap4" oraz "mime" (tcllib).
Wzoruj się na przykładzie w pliku imap4_sik.tcl z tego folderu.
Spróbuj wysłać do siebie 3 róznego typu maile:
1. z prostym tekstem
2. z prostym tekstem i tekstem html z obrazkiem (spróbuj odczytać ten obrazek!)
3. z prostym tekstem i z załącznikiem/obrazkiem.
Zbadaj jak te elementy maila objawiają się jako "części mime" maila...
Wskazówki: musi być dostępny pakiet tls, imap4, smtp(?), mime, ...
wszystkie te pkg są wbudowane w interp vanilla, patrz materiały o j. Tcl
Dokumentacja używanych tutaj pakietów Tcl: imap4, mime.

Zadanie D.13 "smtp, mime, wysyłanie maili"
Sprobuj wysłać maila z jedną częścią mime, z prostym tekstem, przy pomocy pakietu smtp j. Tcl;
wzoruj sie przykładem smtp_sik.tcl z folderu.
Zwróć uwagę, że mail trzeba przygotować pakietem mime.
Dokumentacja pakietów j. Tcl: smtp, mime.
Prot SMTP (= Simple Mail Transfer Prot) służy do wysyłania maili; kli -> ser, ser -> ser2 itd.
4.04.2017, pakiet smtp tcl-a wymaga tls v1.7 (openssl 0.9.8);
aby mieć pojęcie co pakiet smtp robi dodaj opcje "-debug 1" do smtp::sendmessage

Zadanie D.13a "smtp, mime, złożony mail" (1.5pkt)
Spróbuj spreparować i wysłać maila z częścią tekstową (text/plain) i html (text/html).
Należy użyć "mime::initialize -canonical type/subtype -parts {token1 ... tokenN}",
a wcześniej przygotować "parts" ...

Zadanie D.13b "smtp, mime, złożony mail" (1.5pkt)
Spróbuj spreparować i wysłać maila z częścią tekstową i załącznikiem,
który to załacznik zawiera obrazek.

Zadanie D.14 "smtp/pop3/imap, mail prosty, inny j. prog." (1.5pkt)
Przygotuj eksperyment pokazujący wysyłanie i odbieranie ze skrzynki maili prostych (BEZ części mime),
w innym języku programowania niż Tcl...
Należy zademonstrować użycie protokołów smtp, pop3 oraz imap (w tym ostatnim pokazać przewagę imap nad pop3).


.......................................................

Zadanie D.15 "przekraczanie prędkości światła przez pakiet ;-);"
Zbadaj czas pingowania (szybkość pakietu ICMP) podzas pingowawania do serwera "www.asu.edu"
(jest to serwer www Uniwersytetu Stanowego Arizony).
Przypominam, że odległość Poznań-Arizona to ok. 10000km, a prędkość światła to 300000km/s.
Wyjaśnij zaobserowane zjawisko...

Zadanie D.16 "ser. www, clips, animal.clp" (3.5pkt)
Clips (folder) to system/język do tworzenia systemów eksperckich;
zawiera on przykład "animal.clp" zgadujący jakie zwierzę użytkownik ma na myśłi,
poprzez zadawanie szeregu pytan tak/nie...
Zbuduj serwer www/ stronę www pozwalające dowolnej liczbie klientów (przeglądarki www)
przeprowadzić odgadywanie zwierzęcia...
Wskazówki: Każdy klient ma być obsługiwany przez osobny proces z programem clips;
można zbudować własny, prosty serwer www lub użyć istniejący (tclhttpd + handler domeny);
clips wymaga, aby poczekać na prompt "CLIPS> " przed wysłaniem kolejnej komendy!!;
proces z clipsem powinien się prawidłowo kończyć po zakończeniu konwersacji;
uwaga na "bezstanowość" prot. http (serwer nie rozróżnia klientów!!);
w przypadku użycia tclhttpd: zobacz przykłady w tclhttpd_d16.tcl w folderze,
w sprawozdaniu przedstawić ważne części rozwiązania (kod, wydruki diagn.),
ew. podać całość, jeśli kod jest krótki;
być gotowym do zademonstrowania programu w działaniu na ćwiczeniach!!!

# ./clips624 -f2 animal.clp 
CLIPS> (reset)
CLIPS> (run)
Does your animal have a backbone? (yes no) no
Does your animal live primarily in soil? (yes no) no
Is the animals body in segments? (yes no) no
Does your animal use many cells to digest it's food instead of a stomach? (yes no) no
Is your animal made up of more than one cell? (yes no) no
I think your animal is a protozoa
CLIPS> (exit)



uwaga: portal używa ciasteczek tylko do obsługi tzw. sesji...