#include #include // Uwaga - kod dla uproszczenia jest pozbawiony obsługi błędów! int main(int argc, char **argv) { // przygotowuje obiekt SSL ustawia do użycia w połączeniu klienta TLS SSL_CTX *ssl_ctx = SSL_CTX_new(TLS_client_method()); SSL_CTX_set_default_verify_paths(ssl_ctx); SSL *ssl = SSL_new (ssl_ctx); SSL_set_connect_state(ssl); // tworzy obiekt 'Basic Input/Output' typu połączenie sieciowe BIO* tcp_connection = BIO_new_connect(argv[1]); // łączy się do podanego adresu (jako "host:port") BIO_do_connect(tcp_connection); // tworzy obiekt 'Basic Input/Output' typu filtr TLS na istniejącym BIO BIO *tls_connection = BIO_new(BIO_f_ssl()); // wiąże ten obiekt ze wskazanym, wcześniej skonfigurowanym obiektem SSL BIO_set_ssl (tls_connection, ssl, BIO_NOCLOSE); // podkłada pod spód tego filtra obiekt połączenia TCP BIO_push(tls_connection, tcp_connection); // wykonuje połączenie TLS BIO_do_handshake(tls_connection); // sprawdza stan certyfikatu serwera if(long err = SSL_get_verify_result(ssl)) fprintf(stderr, "[cert error: %s]\n", X509_verify_cert_error_string(err)); // wymienia dane po połączeniu TLS BIO_puts(tls_connection, "Hello World!\n"); char buf[1024]; BIO_get_line(tls_connection, buf, 1024); printf("%s", buf); // zamyka połączenie TLS BIO_ssl_shutdown(tls_connection); BIO_free(tls_connection); // połączenie TCP można tutaj dalej używać do przesyłania (nieszyfrowanych) // danych - w BIO_set_ssl podano żeby nie zamykać gniazda TCP (BIO_NOCLOSE) // zamyka połączenie TCP BIO_free(tcp_connection); return 0; }