Ich habe einfache C-Programme geschrieben, die Sockets verwenden ('Client' und 'Server'). (UNIX / Linux-Verwendung)
Die Serverseite erstellt einfach einen Socket:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
Und bindet es dann an sockaddr:
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
Und hört zu (und akzeptiert und liest):
listen(sockfd,5);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
read(newsockfd,buffer,255);
Der Client erstellt den Socket und schreibt darauf.
Jetzt möchte ich diese einfache Verbindung auf einfachste, idyllischste, ordentlichste und schnellste Weise in eine SSL-Verbindung umwandeln.
Ich habe versucht, OpenSSL zu meinem Projekt hinzuzufügen , aber ich kann keinen einfachen Weg finden, um das zu implementieren, was ich will.
stunnel
dasstunnel4
Paket befindet sich in Debian-basierten Distributionen und ist einfach zu verwenden. Es gibt einige Einschränkungen im Vergleich zum Hinzufügen einer ordnungsgemäßen SSL-Unterstützung auf Ihrem Server, aber dies kann für eine schnelle Lösung hilfreich sein. Ich mag Stunnel, weil es zum Ansatz der UNIX-Softwaretools zu passen scheint.Antworten:
Bei Verwendung von OpenSSL gibt es mehrere Schritte. Sie müssen ein SSL-Zertifikat erstellen lassen, das das Zertifikat mit dem privaten Schlüssel enthalten kann. Geben Sie unbedingt den genauen Speicherort des Zertifikats an (in diesem Beispiel befindet es sich im Stammverzeichnis). Es gibt viele gute Tutorials.
Einige beinhalten:
Sie müssen OpenSSL initialisieren:
Nun zum Großteil der Funktionalität. Möglicherweise möchten Sie eine while-Schleife für Verbindungen hinzufügen.
Sie können dann lesen oder schreiben mit:
Update Das
SSL_CTX_new
sollte mit der TLS-Methode aufgerufen werden, die Ihren Anforderungen am besten entspricht, um die neueren Sicherheitsversionen zu unterstützenSSLv23_server_method()
. Siehe: OpenSSL SSL_CTX_neue Beschreibungquelle
if
ist allerdings falsch. Es sollteif (ssl_err <= 0) {
nur dann sein, dass es ein Fehler ist.SSL_accept()
kehrt1
bei Erfolg,0
bei "kontrolliertem Fehler" und-1
bei "tödlichem Fehler" zurück. Siehe Manpage.SSL_CTX_set_tmp_dh[_callback]()
nicht aufgerufen werden. Habe gerade den harten Weg entdeckt, dass aNULL-Chiffren ohne sie nicht funktionieren und die Alarmnummer 40 erzeugen.SSLv23_server_method()
, dass der Server SSLv2 und v3 versteht und jetzt veraltet ist. Um TLS 1.1 und 1.2 zu unterstützen, ersetzen Sie diese Methode durchTLS_server_method()
. QuelleOpenSSL ist ziemlich schwierig. Es ist leicht, versehentlich Ihre gesamte Sicherheit wegzuwerfen, wenn Sie nicht genau richtig verhandeln. (Heck, ich bin persönlich von einem Fehler gebissen worden, bei dem Curl die OpenSSL-Warnungen nicht genau richtig gelesen hat und mit einigen Websites nicht sprechen konnte.)
Wenn Sie wirklich schnell und einfach wollen, stellen Sie Stud auf Ihr Programm und nennen Sie es einen Tag. Wenn Sie SSL in einem anderen Prozess verwenden, werden Sie nicht langsamer: http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html
quelle
Für andere wie mich:
Es gab einmal ein Beispiel in der SSL-Quelle im Verzeichnis
demos/ssl/
mit Beispielcode in C ++. Jetzt ist es nur über die Historie verfügbar: https://github.com/openssl/openssl/tree/691064c47fd6a7d11189df00a0d1b94d8051cbe0/demos/sslSie müssen wahrscheinlich eine funktionierende Version finden, ich habe diese Antwort ursprünglich am 6. November 2015 gepostet. Und ich musste die Quelle bearbeiten - nicht viel.
Zertifikate: .pem in
demos/certs/apps/
: https://github.com/openssl/openssl/tree/master/demos/certs/appsquelle
Hier mein Beispiel ssl Socket Server Threads (Mehrfachverbindung) https://github.com/breakermind/CppLinux/blob/master/QtSslServerThreads/breakermindsslserver.cpp
quelle