Bezpieczeństwo Usług Sieciowych SSL API. dr inż. Tomasz Surmacz. 28 listopada 2011



Podobne dokumenty
Krótkie wprowadzenie do korzystania z OpenSSL

Wykład 4. komputerowych Protokoły SSL i TLS główne slajdy. 26 października Igor T. Podolak Instytut Informatyki Uniwersytet Jagielloński

SSL (Secure Socket Layer)

Bezpieczeństwo systemów informatycznych

ZiMSK. Konsola, TELNET, SSH 1

Systemy internetowe. Wykład 5 Architektura WWW. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Serwer SSH. Wprowadzenie do serwera SSH Instalacja i konfiguracja Zarządzanie kluczami

Podstawy Secure Sockets Layer

Praktyczne aspekty wykorzystania nowoczesnej kryptografii. Wojciech A. Koszek

Przykłady ataków. Błąd dotyczy np. forów dyskusyjnych z możliwością umieszczania plików grafcznych. Pozwala to na wykonanie dowolnego żądania HTTP.

Szyfrowanie w aplikacjach biblioteka Openssl

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

Hosting WWW Bezpieczeństwo hostingu WWW. Dr Michał Tanaś (

Wykład 4. Metody uwierzytelniania - Bezpieczeństwo (3) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła

MikroTik Serwer OpenVPN

SMB protokół udostępniania plików i drukarek

Iteracyjny serwer TCP i aplikacja UDP

Dokumentacja smsapi wersja 1.4

# katalog, w który zapisywane są certyfikaty crl_dir=$dir/crl

Zastosowania informatyki w gospodarce Wykład 8

Protokół SSL/TLS. Algorytmy wymiany klucza motywacja

Konfiguracja konta pocztowego w Thunderbird

Gatesms.eu Mobilne Rozwiązania dla biznesu

Klient-Serwer Komunikacja przy pomocy gniazd

ZADANIE.07. Procesy Bezpieczeństwa Sieciowego v.2011alfa ZADANIE.07. VPN RA Virtual Private Network Remote Access (Router) - 1 -

Protokół SSL/TLS. Patryk Czarnik. Bezpieczeństwo sieci komputerowych MSUI 2009/10. Wydział Matematyki, Informatyki i Mechaniki Uniwersytet Warszawski

OpenSSL - CA. Kamil Bartocha November 28, Tworzenie CA przy użyciu OpenSSL

Instrukcja obsługi serwera FTP v

TCP - receive buffer (queue), send buffer (queue)

Laboratorium nr 6 VPN i PKI

SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4

Dokumentacja techniczna API systemu SimPay.pl

Exchange Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange wersja 1.0

Zdalne logowanie do serwerów

SSL VPN Virtual Private Network with Secure Socket Layer. Wirtualne sieci prywatne z bezpieczną warstwą gniazd

Projekt e-deklaracje 2

Aplikacja Sieciowa wątki po stronie klienta

Instalacja i konfiguracja serwera SSH.

Spis treści INTERFEJS (WEBSERVICES) - DOKUMENTACJA TECHNICZNA 1

BEZPIECZEOSTWO SYSTEMU OPERO

SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE. Tryb konsolowy ćwiczenie b

Bezpieczeństwo systemów informatycznych

IPC: Kolejki komunikatów

Usługi sieciowe systemu Linux

UNIWERSYTET EKONOMICZNY WE WROCŁAWIU. Sprawozdanie. Analizator sieciowy WIRESHARK. Paweł Jarosz Grupa 20 IiE

Internet Information Service (IIS) 7.0

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Bezpieczeństwo Systemów Komputerowych. Wirtualne Sieci Prywatne (VPN)

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

ZADANIE.08 RADIUS (authentication-proxy, IEEE 802.1x) 2h

Aplikacje RMI

Instytut Teleinformatyki

Laboratorium nr 4 Sieci VPN

Funkcje dodatkowe. Wersja 1.2.1

Komunikator internetowy w C#

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

Konfiguracja OpenVPN w AS30GSM200P. Informator Techniczny Strona 1 z 11

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Jarosław Kuchta Administrowanie Systemami Komputerowymi. Internetowe Usługi Informacyjne

1. Model klient-serwer

VSFTPd Użycie certyfikatów niekwalifikowanych w oprogramowaniuvsftpd. wersja 1.3 UNIZETO TECHNOLOGIES SA

VPN Host-LAN IPSec X.509 z wykorzystaniem DrayTek Smart VPN Client

Architektura typu klient serwer: uproszczony klient POP3

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Problemy z bezpieczeństwem w sieci lokalnej

Exchange 2007 Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange 2007 wersja 1.1 UNIZETO TECHNOLOGIES S.A.

Laboratorium nr 5 Sieci VPN

Zadanie 2: transakcyjny protokół SKJ (2015)

Mechanizmy pracy równoległej. Jarosław Kuchta

Programowanie przy użyciu gniazdek

Podręcznik użytkownika

Exchange Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange wersja 1.0 UNIZETO TECHNOLOGIES S.A.

procertum SmartSign 3.2 kwalifikowany znacznik czasu do użycia z procertum CLIDE Client - Instrukcja obsługi wersja UNIZETO TECHNOLOGIES SA

Funkcje dodatkowe. Wersja 1.2.1

Sprawozdanie. (notatki) Sieci komputerowe i bazy danych. Laboratorium nr.3 Temat: Zastosowanie protokołów przesyłania plików

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Tworzenie aplikacji rozproszonej w Sun RPC

ZADANIE.02 Podstawy konfiguracji (interfejsy) Zarządzanie konfiguracjami 1,5h

Uwierzytelnianie użytkowników sieci bezprzewodowej z wykorzystaniem serwera Radius (Windows 2008)

Instrukcja instalacji usługi Sygnity SmsService

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Exchange Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange wersja 1.0

Zarządzanie systemami informatycznymi. Bezpieczeństwo przesyłu danych

ZABEZPIECZENIE KOMUNIKACJI Z SYSTEMEM E-PŁATNOŚCI

Analiza malware Remote Administration Tool (RAT) DarkComet

Programowanie Sieciowe 1

Zamawianie Taxi Aktywator Instrukcja użytkownika

Protokoły zdalnego logowania Telnet i SSH

Bezpieczeństwo systemów informatycznych

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Dokumentacja SMS przez FTP

Manual konfiguracji konta dla fax2mail

ZADANIE.08. RADIUS (authentication-proxy, IEEE 802.1x) 2h

Specyfikacja Płatności CashBill. Instrukcja podłączenia płatności elektronicznych do typowych zastosowań.

Protokół wymiany sentencji, wersja 1

Zadanie1: Odszukaj w serwisie internetowym Wikipedii informacje na temat protokołu http.

Konfiguracja serwera FreeRADIUS

Konfiguracja ustawień sieci w systemie Windows XP z użyciem oprogramowania Odyssey Client

Transkrypt:

Bezpieczeństwo Usług Sieciowych SSL API dr inż. Tomasz Surmacz 28 listopada 2011

SSL API Utworzenie kontekstu SSL (SSL CTX) do kontekstu można dodawać certyfikaty i klucze prywatne, a także wybierać dopuszczalne metody szyfrowania w kontekście należy zdefiniować, jaka wersja SSL/TLS będzie wykorzystywana Niezależnie należy nawiązać połączenie TCP/IP klient-serwer oraz utworzyć strukturę SSL zarządzającą sesją SSL. Istniejące połączenie i sesję SSL należy ze sobą powiązać poprzez BIO (buforowane wejście/wyjście) lub niejawnie Wymiana certyfikatów, ustalenie szyfrów, sprawdzenie kluczy, itp., następuje w momencie negocjacji połączenia SSL (funkcje SSL connect()/ssl accept()) Bezpieczna komunikacja odbywa się następnie z użyciem struktury SSL (SSL write()/ssl read()) lub BIO (np. BIO puts(), BIO write() itp.) W trakcie sesji można renegocjować parametry połączenia szyfry, klucze... Zamknięcie sesji: SSL shutdown() Wybór metody: SSL_METHOD SSLv2, SSLv3, TLSv1 Utworzenie kontekstu SSL: SSL_CTX Konfiguracja SSL_CTX certyfikaty, klucze Utworzenie SSL (przejęcie konfiguracji z SSL_CTX) Utworzenie/konfiguracja gniazdka TCP/IP Utworzenie/konfiguracja BIO Negocjacja połączenia SSL (handshake SSL) Komunikacja SSL Zamknięcie połączenia SSL Zakończenie Init renegocjacja połączenia SSL (rehandshake SSL) ponowne wykorzystanie sesji (SSL session reuse) Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 2

SSL API setup #include <openssl/ssl.h> int SSL_library_init(void); /* load encryption & hash algorithms for SSL */ #define OpenSSL_add_ssl_algorithms() #define SSLeay_add_ssl_algorithms() SSL_library_init() SSL_library_init() SSL_load_error_strings(); /* load the error strings and register the libssl error strings*/ SSL library init() rejestruje wszystkie funkcje kryptograficzne i funkcje skrótu w SSL API. Standardowo ładowane algorytmy to DES-CBC, DES-EDE3-CBC, RC2 i RC4 oraz funkcje skrótu MD2, MD5 i SHA Funkcja SSL library init() zawsze zwraca wartość 1. SSL load error strings() wczytuje i rejestruje w API komunikaty o błędach, które są używane przez funkcje należące do SSL API i Crypto API. Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 3

SSL API wybór metody Wybór wersji protokołu SSL/TLS następuje przez wybór metody w strukturze SSL METHOD Typ klient/serwer dedykowany serwer dedykowany klient protokołu SSLv2 SSLv2 method(void) SSLv2 server method(void) SSLv2 client method(void) SSLv3 SSLv3 method(void) SSLv3 server method(void) SSLv3 client method(void) TLSv1 TLSv1 method(void) TLSv1 server method(void) TLSv1 client method(void) SSLv23 SSLv23 method(void) SSLv23 server method(void) SSLv23 client method(void) UWAGA! pseudometoda SSLv23 pozwala wybrać SSLv2, SSLv3 lub TLSv1 zgodnie z oczekiwaniami drugiej strony. serwer korzystający z SSLv23 zrozumie komunikaty HELLO dowolnej wersji protokołu i nawiąże połączenie z dowolnym klientem klient korzystający z SSLv23 nie dogada się z serweremn SSLv3/TLSv1 ponieważ domyślnie wysyłany jest komunikat HELLO w wersji SSLv2. Struktura SSL METHOD jest następnie używana do utworzenia struktury SSL CTX #include <openssl/ssl.h> SSL_CTX *SSL_CTX_new(SSL_METHOD *method); Przykład kodu: method = SSLv3_method(); ctx = SSL_CTX_new(method); Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 4

SSL API wybór kluczy i certyfikatów Wybór certyfikatu (własnego) następuje poprzez wczytanie ich do struktury SSL CTX za pomocą jednej z funkcji SSL CTX use certificate file() (z pliku), SSL CTX use certificate() (ze struktury X509) lub SSL CTX use certificate ASN1() (z pamięci). Serwer wczytuje: o Swój własny certyfikat (obowiązkowo) o Certyfikat CA (opcjonalnie) Klient wczytuje: o Certyfikat CA (obowiązkowo) o Swój własny certyfikat (opcjonalnie) Wczytany certyfikat jest wysyłany do drugiej strony, która używa go do zaszyfrowania losowych danych Odszyfrowanie tych danych wymaga użycia klucza prywatnego związanego z wysłanym certyfikatem Wczytanie klucza prywatnego następuje za pomocą jednej z funkcji, odpowiedniej dla typu używanego certyfikatu SSL_CTX_use_PrivateKey() SSL_CTX_use_PrivateKey_ASN1() SSL_CTX_use_PrivateKey_file() SSL_CTX_use_RSAPrivateKey() SSL_CTX_use_RSAPrivateKey_ASN1() SSL_CTX_use_RSAPrivateKey_file() SSL_use_PrivateKey() SSL_use_PrivateKey_ASN1() SSL_use_PrivateKey_file() SSL_use_RSAPrivateKey() SSL_use_RSAPrivateKey_ASN1() SSL_use_RSAPrivateKey_file() Inne funkcje: SSL CTX check private key(), SSL CTX use certificate chain file(). Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 5

SSL API klucze i hasła Wczytane klucze mogą wymagać odblokowania hasłem W tym celu można zarejestrować funkcję callback wywoływaną w razie potrzeby void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb); void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u); int pem_passwd_cb(char *buf, int size, int rwflag, void *userdata); SSL CTX set default passwd cb userdata(ctx, userdata) ustawia wskaźnik na dane userdata, które będą przekazane w momencie wywołania funkcji pem passwd cb() Funkcja pem passwd cb() może zażądać interaktywnego podania hasła przez użytkownika albo pobrać je z pamięci (np. jeśli jest potrzebne do odblokowania kilku kluczy, warto spytać o nie tylko raz). Flaga rwflag=1 oznacza, czy coś, do czego potrzebne jest hasło, będzie szyfrowane. W takim wypadku dobrą praktyką jest spytanie o hasło dwa razy i sprawdzenie zgodności, by wyeliminować pomyłki/literówki. Przykład: funkcja zwracająca hasło dostarczane przez userdata: int pem_passwd_cb(char *buf, int size, int rwflag, void *password) { strncpy(buf, (char*)(password), size); buf[size-1] = \0 ; return(strlen(buf)); } Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 6

SSL API wybór kluczy i certyfikatów: CA Wczytanie certyfikatu CA #include <openssl/ssl.h> int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath); Ustala plik oraz ścieżkę do plików zawierających certyfikaty CA. Wymagane certyfikaty są w pierwszym rzędzie szukane w CAfile, potem w innych plikach w katalogu CApath. Jeden z parametrów funkcji może być ustawiony na NULL Plik wskazywany przez CAfile powinien zawierać jeden lub wiele certyfikatów w postaci BASE64 (postać PEM ), tzn. między liniami postaci: -----BEGIN CERTIFICATE-----... (CA certificate in base64 encoding)... -----END CERTIFICATE----- Pliki w katalogu CApath wyszukiwanie są wg skrótu nazwy (np. 9d66eef0.0), bez względu na rozszerzenie. Pliki/linki o odpowiednich nazwach można utworzyć za pomocą programu c rehash. Serwer żądający certyfikatu klienta musi wcześniej wysłać listę CA, które są akceptowalne w celu weryfikacji certyfikatu klienta. Lista ta jest niezależna od zawartości CAfile i CApath i musi być jawnie wskazana przez wywołanie jednej z funkcji z rodziny SSL CTX set client CA list() (tzn. także SSL set client CA list(), SSL CTX add client CA() lub SSL add client CA()) Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 7

SSL API wybór kluczy i certyfikatów (c.d.) Wczytanie certyfikatu CA przykłady: #include <openssl/ssl.h> int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile, const char *CApath); ctx wskazuje na strukturę SSL CTX, do której zostanie wczytany certyfikat CA. Jeśli żądany certyfikat ma być określony przez plik (znajdujący się w tym samym katalogu co uruchamiana aplikacja), należy podać nazwę pliku w CAfile, a CApath ustawić na NULL. Jeśli certyfikat ma być określany przez katalog, CAfile powinno być ustawione na NULL, a katalog podany przez parametr CApath. Konieczne jest również utworzenie w podanym katalogu skrótów nazw przechowywanych tam certyfikatów ( CA hash name ) Skróty należy utworzyć programem c rehash. Wybór metody: SSL_METHOD SSLv2, SSLv3, TLSv1 Utworzenie kontekstu SSL: SSL_CTX Konfiguracja SSL_CTX certyfikaty, klucze Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 8

SSL API wybór kluczy i certyfikatów przykład Wczytanie certyfikatów i kluczy przez klienta: #define CLIENT_CERT "client.pem" #define CLIENT_KEY "client.key" #define CA_FILE "ca.pem" /*------ Wczytanie certyfikatu klienta do struktury SSL_CTX ----------*/ if(ssl_ctx_use_certificate_file(ctx, CLIENT_CERT, SSL_FILETYPE_PEM) <= 0) { sys_err("nie można wczytać certyfikatu klienta"); exit(1); } /*------ Wczytanie klucza prywatnego do struktury SSL_CTX ------------*/ if(ssl_ctx_use_privatekey_file(ctx, CLIENT_KEY, SSL_FILETYPE_PEM) <= 0) { sys_err("nie można wczytać klucza prywatnego klienta"); exit(1); } /* Wczytaj zaufane CA. */ if (!SSL_CTX_load_verify_locations(ctx, CA_CERT, NULL)) { sys_err("błąd wczytywania listy CA"); exit(1); } Wczytany certyfikat CA (lub ich lista) zostanie użyty do weryfikacji certyfikatu serwera. Wczytany certyfikat klienta zostanie przedstawiony serwerowi. Klucz zostanie użyty jedynie do uwierzytelnienia certyfikatu. Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 9

SSL API weryfikacja certyfikatów Certyfikat CA wczytany do struktury SSL CTX jest używany do weryfikacji tożsamości drugiej strony. (Np. klient po połączeniu z serwerem weryfikuje certyfikat serwera czy jest podpisany przez CA) Aby weryfikacja się udała, certyfikat drugiej strony musi być podpisany przez CA bezpośrednio lub pośrednio (do weryfikacji pośredniej łańcuch pośredników musi być kompletny) Maksymalna długość łańcucha od CA do weryfikowanego certyfikatu może być określona przez pole verify depth struktury SSL CTX lub SSL. Wartość w strukturze SSL jest dziedziczona z SSL CTX podczas tworzenia struktury SSL za pomocą SSL new(). Wartość 1 oznacza, że certyfikat musi być podpisany bezpośrednio przez CA. Wartość tę można ustawić wywołaniem funkcji SSL CTX set verify depth(ctx, głębokość): #include <openssl/ssl.h> void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth); void SSL_set_verify_depth(SSL *s, int depth); Sposób dokonywania weryfikacji certyfikatu można ustawić funkcją SSL CTX set verify(): #include <openssl/ssl.h> void SSL_CTX_set_verify(SSL_CTX *ctx, int mode, int (*verify_callback)(int, X509_STORE_CTX *)); void SSL_set_verify(SSL *s, int mode, int (*verify_callback)(int, X509_STORE_CTX *)); Możliwe sposoby weryfikacji to: SSL VERIFY NONE SSL VERIFY PEER najczęściej wykorzystywany sposób SSL VERIFY FAIL IF NO PEER CERT SSL VERIFY CLIENT ONCE Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 10

SSL API weryfikacja certyfikatów (c.d.) parametr tryb serwera tryb klienta serwer nie wysyła żądania podania certyfikatu do jeśli nie jest używane szyfrowanie SSL VERIFY NONE klienta, więc klient nie wyśle swojego certyfikatu anonimowe (bez uwierzytelniania domyślnie zabronione), serwer wyśle certyfikat, który zostanie sprawdzony. Rezultat sprawdzenia można sprawdzić po wymianie (handshake) wołając SSL get verify result(). Wymiana jest SSL VERIFY PEER SSL VERIFY FAIL- IF NO PEER CERT SSL VERIFY CLI- ENT ONCE Serwer wysyła żądanie certyfikatu do klienta. Jeśli zostanie zwrócony, jest weryfikowany. Niepowodzenie weryfikacji przerywa handshake TLS/SSL i wysyła alert zawierający przyczynę niepowodzenia. Można to zmienić modyfikując znaczniki SSL VERIFY FAIL IF NO PEER CERT i SSL VERIFY CLIENT ONCE. Brak certyfikatu od klienta przerywa handshake TLS/SSL i generuje alert handshake failure. Parametr musi być używany wraz z SSL VERIFY PEER. Żądaj certyfikatu klienta tylko przy pierwszej negocjacji (przy renegocjacjach już nie). Parametr musi być używany wraz z SSL VERIFY PEER. kontynuowana bez względu na wynik. Certyfikat serwera jest weryfikowany. Niepowodzenie weryfikacji przerywa handshake TLS/SSL generując alert. Jeśli nie otrzymano certyfikatu serwera, bo wykorzystywane jest szyfrowanie anonimowe, parametr SSL VERIFY PEER jest ignorowany. ignorowany ignorowany Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 11

SSL API weryfikacja certyfikatów (c.d.) Alternatywna metoda SSL get verify result() # include <openssl/ssl.h> long SSL_get_verify_result(const SSL *ssl); Funkcja zwraca wynik weryfikacji certyfikatu X509 drugiej strony, jeśli został przedstawiony. Jeśli wystąpi kilka błędów weryfikacji, raportowany jest tylko ostatni. Jeśli druga strona nie przedstawiła żadnego certyfikatu, to zwracany jest kod X509 V OK, ponieważ nie nastąpiła żadna weryfikacja, nie było więc żadnego błędu. Ze względu na ostatni punkt funkcja jest użyteczna tylko wraz z SSL get peer certificate() Sposób wykorzystania SSL get verify result(): ➊ Wywołanie SSL connect() (klient) lub SSL accept() (serwer), aby nawiązać połączenie SSL (SSL handshake) i dokonać weryfikacji certyfikatów. ➋ Wywołanie SSL get peer certificate(), aby w sposób jawny uzyskać certyfikat drugiej strony Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 12

SSL API SSL get verify result() przykład wykorzystania #include <openssl/ssl.h> SSL_CTX_set_verify_depth(ctx, 1); err = SSL_connect(ssl); if (SSL_get_peer_certificate(ssl)!= NULL) { if (SSL_get_verify_result(ssl) == X509_V_OK) BIO_printf(bio_c_out, "Weryfikacja klienta za pomocą SSL_get_verify_result() udana.\n"); else { BIO_printf(bio_err, "Weryfikacja klienta za pomocą SSL_get_verify_result() NIE POWIODŁA SIĘ.\n"); exit(1); } } else BIO_printf(bio_c_out, "druga strona nie przedstawiła certyfikatu!\n"); Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 13

SSL API wybór szyfrów (opcjonalny) Wybór szyfrów nie jest konieczny wystarcza wybór metody (wersji SSL/TLS) int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str); int SSL_set_cipher_list(SSL *ssl, const char *str); STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *ssl); const char *SSL_get_cipher_list(const SSL *ssl, int priority); const char *SSL_CIPHER_get_name(const SSL_CIPHER *cipher); Lista szyfrów w łańcuchu tekstowym w formacie zwracanym przez komendę openssl ciphers % openssl ciphers DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA: DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5: EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA: EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5 Niektóre z szyfrów mogą wymagać ustawienia odpowiedniej funkcji callbackowej do ustawienia tymczasowego klucza sesji, np. SSL CTX set tmp rsa callback() lub SSL CTX set tmp dh callback() Wybór konkretnego szyfru następuje w chwili negocjacji połączenia SSL (SSL handshake). Wybrany szyfr musi być dostępny po obu stronach połączenia Zbytnie ograniczanie listy szyfrów może skutkować niemożnością połączenia (brak wspólnych elementów na listach) Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 14

SSL API utworzenie SSL z kontekstu SSL CTX #include <openssl/ssl.h> SSL* SSL_new(SSL_CTX *ctx); Nowo utworzona struktura SSL dziedziczy wszystkie ustawienia ze struktury SSL CTX metody łączenia, ustawienia weryfikacji, certyfikaty, timeouty, itp. Jeśli wymagane ustawienia zostały dokonane w strukturze SSL CTX, to w SSL nie trzeba już robić niczego więcej Można jednak zmieniać odziedziczone ustawienia za pomocą odpowiednich funkcji API. Przykład: Funkcja SSL CTX use certificate() wczytuje certyfikat do struktury SSL CTX analogicznie: SSL use certificate() wczytuje go do struktury SSL. Utworzenie SSL (przejęcie konuracjicji z SSL_CTX) Utworzenie/konfiguracja gniazdka TCP/IP Utworzenie/konfiguracja BIO Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 15

Nawiązanie połączenia TCP Nawiązanie połączenia TCP odbywa się standardowymi metodami Serwer nawiązuje połączenie funkcją accept(): memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(port); if (bind(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) perror("serwer: nie można nadać gniazdku adresu"); listen(sock, 5); clen = sizeof(cl_addr); newsock = accept(sock, (struct sockaddr*) &cl_addr, &clen); if (newsock < 0) perror("serwer: błąd w funkcji accept()"); klient wywołuje connect(): if ((sock=socket(af_inet, SOCK_STREAM, 0)) < 0) perror("klient: nie można utworzyć gniazdka"); if (connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) perror("klient: nie można połączyć się z serwerem); Utworzenie SSL (przejęcie konuracjicji z SSL_CTX) Utworzenie/konfiguracja gniazdka TCP/IP Utworzenie/konfiguracja BIO Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 16

Powiązanie gniazdka TCP z SSL Połączone gniazdko powinno zostać przekazane do struktury SSL lub BIO Najprościej wiążąc gniazdko ze strukturą SSL: SSL_set_fd(ssl, socket); // socket -- połączone gniazdko TCP (connect/accept) Polecany sposób: przez strukturę BIO (buffered i/o): sbio=bio_new(bio_s_socket()); BIO_set_fd(sbio, socket, BIO_NOCLOSE); // socket -- połączone gniazdko TCP SSL_set_bio(ssl, sbio, sbio); alternatywna, równoważna metoda: sbio = BIO_new_socket(socket, BIO_NOCLOSE); SSL_set_bio(ssl, sbio, sbio); Utworzenie SSL (przejęcie konuracjicji z SSL_CTX) Utworzenie/konfiguracja gniazdka TCP/IP Utworzenie/konfiguracja BIO Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 17

SSL API SSL handshake SSL handshake to negocjacja parametrów połączenia pomiędzy klientem a serwerem SSL połączona z wymianą kluczy. Po stronie serwera: error = SSL_accept(ssl); Po stronie klienta: error = SSL_connect(ssl); Alternatywnie: za pomocą SSL read() i SSL write(): Po stronie serwera: error = SSL_accept_state(ssl); SSL_read(ssl, buf, size); Po stronie klienta: error = SSL_set_connect_state(ssl); SSL_write(ssl, buf, size); Opcjonalnie: wywołanie SSL get peer certificate(ssl) w celu uzyskania certyfikatu drugiej strony (np. aby sprawdzić datę ważności, nazwę, itp.) Negocjacja połączenia SSL (handshake SSL) Komunikacja SSL Zamknięcie połączenia SSL Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 18

SSL API SSL komunikacja Po dokonaniu negocjacji (handshake) można korzystać z bezpiecznego połączenia. SSL read() służy do odczytu danych, SSL write() do zapisu w analogiczny sposób jak byłyby wykorzystane zwykłe funkcje read() i write() Można także używać BIO puts() i BIO gets() oraz BIO write() i BIO read(), jeśli wcześniej zostanie utworzony bufor BIO: BIO *buf_io, *ssl_bio; char rbuf[r_size]; char wbuf[w_size]; buf_io=bio_new(bio_f_buffer()); ssl_bio=bio_new(bio_f_ssl()); // utwórz bufor BIO // utwórz ssl BIO BIO_set_ssl(ssl_bio, ssl, BIO_CLOSE); // przypisz ssl BIO do SSL BIO_push(buf_io, ssl_bio); // dodaj ssl_bio do buf_io ret=bio_puts(buf_io, wbuf); ret=bio_gets(buf_io, rbuf, R_SIZE); ret=bio_write(buf_io, wbuf, n); ret=bio_read(buf_io, rbuf, rlen); BIO_free(buf_io); // zapisz zawartość wbuf do buf_io // przeczytaj dane z buf_io do rbuf // zapisz n bajtów z wbuf do buf_io // przeczytaj rlen danych z buf_io do rbuf Negocjacja połączenia SSL (handshake SSL) Komunikacja SSL W dowolnym momencie jedna ze stron może zażądać renegocjacji połączenia lub jego zamknięcia Zamknięcie połączenia SSL Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 19

SSL API zamykanie połączenia SSL Zamknięcie następuje z dowolnej strony (klienta lub serwera) przez wywołanie SSL shutdown() Pierwsze wywołanie funkcji wysyła alert close notify i ustawia flagę SSL SENT SHUTDOWN, funkcja zwraca wartość 0, a połączenie zostaje jednokierunkowo zamknięte. Drugie wywołanie SSL shutdown(ssl) (opcjonalne) czeka na odebranie close notify od drugiej strony, po czym zwraca wartość 1. Jeśli druga strona już wcześniej zamknęła połączenie (co zostało obsłużone przy okazji SSL read()), ustawiona jest flaga SSL RECEIVED SHUTDOWN, a SSL shutdown() od razu zwraca 1. Stan tej flagi można sprawdzić wołając SSL get shutdown(). dwustronnie zamknięte połączenie może być ponownie wykorzystane do nowej komunikacji SSL jednostronne zamknięcia połączenia SSL wystarcza, jeśli gniazdko TCP służące do kumunikacji i tak ma być zaraz zamknięte. Jeśli planowane jest ponowne wykorzystanie SSL konieczne jest zamknięcie dwustronne. Negocjacja połączenia SSL (handshake SSL) Komunikacja SSL Zamknięcie połączenia SSL Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 20

SSL API renegocjacja połączenia SSLv3 Renegocjację połączenia w SSLv3/TLSv3 może rozpocząć zarówno klient jak i serwer. SSLv2 nie dopuszcza renegocjacji. Serwer woła SSL renegotiate() a następnie dwukrotnie SSL do handshake(). SSL renegotiate() jedynie ustawia odpowiednie znaczniki w połączeniu. Pierwsze wywołanie SSL do handshake() wysyła Server hello do klienta jeśli zakończy się sukcesem, oznacza to, że klient zgodził się na renegocjację serwer ustawia wówczas w strukturze SSL stan SSL ST ACCEPT i ponownie woła SSL do handshake(), aby dokończyć renegocjację. Klient woła SSL renegotiate() a następnie SSL do handshake() (tylko raz) SSL renegotiate() ustawia odpowiednie znaczniki SSL do handshake() przeprowadza cały proces renegocjacji. Przykład kodu serwera: if(ssl_renegotiate(ssl) <= 0) { printf("ssl_renegotiate() failed\n"); } if(ssl_do_handshake(ssl) <= 0) { printf("ssl_do_handshake() failed\n"); } ssl->state = SSL_ST_ACCEPT; if(ssl_do_handshake(ssl) <= 0) { printf("ssl_do_handshake() failed\n"); } exit(1); exit(1); exit(1); Negocjacja połączenia SSL (handshake SSL) Komunikacja SSL Zamknięcie połączenia SSL rehandshake Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 21

SSL API kończenie wykorzystywania SSL Po zamknięciu połączenia przez SSL shutdown() pozostaje posprzątać Sprzątanie polega na zwolnieniu pamięci używanej przez różnego rodzaju struktury danych w porocesie łączenia/negocjacji itd. Jeśli była wołana jakaś funkcja typu xxx new() (np. SSL new(), BIO new(), itp.), powinna zostać wywołana odpowiednia funkcja xxx free(). Struktury tworzone niejawnie są automatycznie usuwane, gdy obiekt z nimi przestaje istnieć. Np. struktury BIO utworzone podczas wywołania SSL new() zostaną automatycznie usunięte przy wywołaniu SSL free() nie trzeba ich zwalniać za pomocą BIO free(). UWAGA! SSL free() może zostać wywołane dopiero po wcześniejszym wywołaniu SSL shutdown() Gniazdka TCP połączone wcześniej za pomocą connect()/accept() wykorzystywane do komunikacji SSL należy rozłączyć w standardowy sposób (shutdown(). Zamknięcie połączenia SSL Zakończenie ponowne wykorzystanie sesji (SSL session reuse) Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 22

Program tlswrap Aplikacja pozwalająca wykorzystać dowolnego klienta FTP do łączenia z serwerem FTP obsługującym SSL. Standardowo nasłuchuje lokalnie na porcie 7000 i działa jak proxy FTP Klient FTP po połączeniu się z proxy podaje nazwę użytkownika w postaci username@hostname:port, a następnie hasło. tlswrap jako proxy nawiąże bezpiecznie połączenie z użyciem SSL do swerwera hostname na port port, próbując tam autoryzować użytkownika username. Przy okazji dobre źródło przykładów programowania SSL/TLS Łącznie ok. 3200 linii kodu, ale to: 500 linii kodu SSL/TLS 400 linii komunikacji sieciowej na poziomie warstwy TCP/IP 1500 linii obsługi parametrów linii komend, konfiguracji, samego serwera proxy 700 linii różnych funkcji pomocniczych Bezpieczeństwo Usług Sieciowych 2011/2012 SSL API, Tomasz Surmacz 23