Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
|
sk2:openssl_ssl_api [2025/11/20 12:55] jkonczak [Kolejne przykładowe programy] poprawa corner case'ów przy nieblokującej obsłudze SSL_* |
sk2:openssl_ssl_api [2025/11/21 17:06] (aktualna) jkonczak [Kolejne przykładowe programy] bugfix |
||
|---|---|---|---|
| Linia 378: | Linia 378: | ||
| #include <poll.h> | #include <poll.h> | ||
| #include <string> | #include <string> | ||
| + | #include <string_view> | ||
| #include <sys/socket.h> | #include <sys/socket.h> | ||
| #include <unistd.h> | #include <unistd.h> | ||
| Linia 475: | Linia 476: | ||
| | | ||
| if (pfds[0].revents) { | if (pfds[0].revents) { | ||
| - | char buf[256]; | + | char buf[255]; |
| int c = read(0, buf, 255); | int c = read(0, buf, 255); | ||
| if (c > 0) { | if (c > 0) { | ||
| - | buf[c] = 0; | + | dataWaitingToBeWritten += std::string_view(buf, c); |
| - | dataWaitingToBeWritten += buf; | + | |
| writeNeeds |= POLLOUT; | writeNeeds |= POLLOUT; | ||
| // dane będą wysłane dopiero w następnej iteracji pętli zdarzeń (to upraszcza kod) | // dane będą wysłane dopiero w następnej iteracji pętli zdarzeń (to upraszcza kod) | ||
| Linia 754: | Linia 754: | ||
| </small> | </small> | ||
| + | ==== [ekstra] SSLKEYLOGFILE ==== | ||
| + | |||
| + | Biblioteki do szyfrowanych połączeń potrafią przekazać | ||
| + | programiście klucze użyte do szyfrowania danych w | ||
| + | [[https://tlswg.org/sslkeylogfile/draft-ietf-tls-keylogfile.html|(już de facto) standardowym formacie]]. | ||
| + | Część aplikacji/bibliotek odczytuje zmienną środowiskową ''SSLKEYLOGFILE'' | ||
| + | i tworzy plik pod wskazaną tam nazwą, do którego wpisuje klucze wszystkich | ||
| + | szyfrowanych połączeń. Pozwala to np. | ||
| + | [[https://wiki.wireshark.org/TLS#tls-decryption|odszyfrować komunikację w programie wireshark]]. | ||
| + | |||
| + | Żeby zaimplementować takie zapisywanie kluczy do pliku w OpenSSL, należy | ||
| + | zarejestrować funkcję która będzie wywoływana ilekroć OpenSSL wygenruje klucz | ||
| + | do szyfrowania, i która dostanie gotową linię do wpisania do pliku. | ||
| + | \\ | ||
| + | Przykładowy prosty kod realizujący takie zachowanie jest zaprezentowany poniżej: | ||
| + | <html><div style=margin-top:-1.4em></div></html> | ||
| + | <code cpp> | ||
| + | … | ||
| + | int keylogFd; | ||
| + | … | ||
| + | int main() { | ||
| + | … | ||
| + | SSL_CTX *ctx = …; | ||
| + | … | ||
| + | if (getenv("SSLKEYLOGFILE")) { | ||
| + | keylogFd = open(getenv("SSLKEYLOGFILE"), O_CREAT | O_WRONLY | O_APPEND, 0666); | ||
| + | if (keylogFd == -1) | ||
| + | die("SSLKEYLOGFILE file opening failed with: %s", strerror(errno)); | ||
| + | SSL_CTX_set_keylog_callback(ctx, [](const SSL *ssl, const char *line) { | ||
| + | write(keylogFd, line, strlen(line)); | ||
| + | write(keylogFd, "\n", 1); | ||
| + | }); | ||
| + | } | ||
| + | … | ||
| + | </code> | ||