Napisałem proste programy w C, które używają gniazd („klient” i „serwer”). (Użycie UNIX / Linux)
Po stronie serwera po prostu tworzy gniazdo:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
A potem wiąże go z sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
I słucha (i akceptuje i czyta):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Klient tworzy gniazdo, a następnie zapisuje w nim.
Teraz chcę przekształcić to proste połączenie w połączenie SSL w najprostszy, najbardziej idylliczny, schludny i najszybszy sposób.
Próbowałem dodać OpenSSL do mojego projektu, ale nie mogę znaleźć prostego sposobu na wdrożenie tego, co chcę.
stunnel
Thestunnel4
pakiet jest w dystrybucjach opartych na Debianie i jest łatwy w użyciu. Istnieją pewne ograniczenia w porównaniu z dodaniem odpowiedniej obsługi SSL na serwerze, ale może to być dobre rozwiązanie dla szybkiego rozwiązania. Lubię stunnel, ponieważ wydaje się pasować do podejścia narzędzi programowych UNIX.Odpowiedzi:
Korzystanie z OpenSSL obejmuje kilka kroków. Musisz mieć wykonany certyfikat SSL, który może zawierać certyfikat z kluczem prywatnym, pamiętaj o określeniu dokładnej lokalizacji certyfikatu (w tym przykładzie jest ona w katalogu głównym). Istnieje wiele dobrych tutoriali.
Niektóre z nich obejmują:
Będziesz musiał zainicjować OpenSSL:
Teraz większość funkcjonalności. Możesz chcieć dodać pętlę while na połączeniach.
Możesz wtedy czytać lub pisać za pomocą:
Update The
SSL_CTX_new
powinien być wywoływany metodą TLS, która najlepiej odpowiada Twoim potrzebom, w celu obsługi nowszych wersji zabezpieczeń zamiastSSLv23_server_method()
. Zobacz: opis OpenSSL SSL_CTX_newźródło
if
jest jednak zły. Dopieroif (ssl_err <= 0) {
wtedy jest to błąd.SSL_accept()
powraca1
po sukcesie,0
po „kontrolowanej porażce” i-1
„fatalnej porażce”. Zobacz stronę podręcznika.SSL_CTX_set_tmp_dh[_callback]()
nie zostaną wywołane. Właśnie odkrył w bolesny sposób, że szyfry aNULL nie będzie działać bez niego, tworząc szereg powiadomienie 40.SSLv23_server_method()
, że serwer obsługuje SSLv2 i v3 i jest obecnie przestarzały. Aby obsługiwać protokoły TLS 1.1 i 1.2, zamień tę metodę naTLS_server_method()
. źródłoOpenSSL jest dość trudny. Łatwo jest przypadkowo wyrzucić całe swoje bezpieczeństwo, nie wykonując negocjacji dokładnie tak, jak trzeba. (Do licha, osobiście ugryzł mnie błąd, w którym curl nie odczytywał alertów OpenSSL dokładnie i nie mógł rozmawiać z niektórymi witrynami.)
Jeśli naprawdę chcesz szybko i prosto, umieść stud przed swoim programem i zwołaj go dziennie. Posiadanie SSL w innym procesie nie spowolni: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
źródło
Dla innych takich jak ja:
Był kiedyś przykład w źródle SSL w katalogu
demos/ssl/
z przykładowym kodem w C ++. Teraz jest dostępny tylko przez historię: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslPrawdopodobnie będziesz musiał znaleźć działającą wersję, pierwotnie opublikowałem tę odpowiedź 6 listopada 2015. I musiałem edytować źródło - niewiele.
Certyfikaty: .pem in
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsźródło
Tutaj moje przykładowe wątki serwera gniazda ssl (wiele połączeń) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
źródło