Ich würde folgende Grundsatzregeln formulieren: "Wenn Du persistente Daten verschlüsseln musst, nimm GPG. Wenn Du hingegen eine Transportverschlüsselung realisieren musst, nimm SSL." (so oder zumindest sinngemäß hat sich auch
Colin Percival auf der
2010er BSDCan geäußerst).
Zugegeben, SSL ist komplex. Egal welche Implementierung (OpenSSL oder GnuTLS); die Einbindung von SSL in eigener Programme bedarf umfangreicher Handbuch-Lektüre und etwas Erfahrung. Ich habe selbst mehrere Programme (sowohl Clients als auch Server) auf OpenSSL-Basis in C verzapft - es gibt da einige Fallstricke, und die Interfaces gerade von OpenSSL sind nicht ganz ohne. Dazu kommt noch, dass SSL schon konzeptionell an einigen Stellen "um die Ecke denkt" und auch einige Design-Schwächen aufweist. Trotzdem ist es momentan das beste (und besterprobte), was es an Protokoll und Implementierung gibt.
Wer selbst Hand anlegen und eigene Programme in C schreiben möchte, dem würde ich zu OpenSSL raten. Die Doku ist zwar gewöhnungsbedürftig, aber einigermaßen vollständig. Außerdem ist OpenSSL sauberer implementiert als GnuTLS und besser portabel.
Bei Perl bin ich nicht mehr so ganz auf dem laufenden, aber je nach Anwendung würde ich wahrscheinlich
Socket::Class::SSL oder
POE::Filter::SSL verwenden. Nach PHP fragt bitte jemand anderes - das Zeugs habe ich seit Jahren nicht mehr angefasst, mit Sockets o. ä. habe ich da noch nie rumgespielt (es sollte aber entsprechende Extensions geben).
Python bringt mit
ssl einen Wrapper für "normale" Sockets mit (im Hintergrund basiert das Modul auf einer Extension, die wiederum OpenSSL einbindet und nutzt). Die Doku zeigt eigentlich schon, wie man das Modul zur Erstellung eigener SSL-Clients und -Server benutzt.
Kritisch ist bei allen Implementierungen die Validierung der angebotenen Zertifikate (sowohl Client- als auch Serverseite). Diese muss nämlich durch eigenen Code erfolgen - OpenSSL bietet zwar eine Schnittstelle an, die mit einer Callback-Funktion gefüttert werden kann, selbige muss man aber selbst implementieren. Hier liegt in meinen Augen das größte Fehlerpotenzial, denn ein Irrtum kann Verbindungen mit gefälschten oder ungültigen Zertifikaten Tür und Tor öffnen. Gerade eine zertifikatbasierte Authentifizierung bedarf hier größter Sorgfalt, sonst kann man sich den Aufwand mit der Transportverschlüsselung auch gleich schenken.
Wer also darüber nachdenkt, selbst eine transportverschlüsselnde Software zu schreiben, sollte sich vorher gut in die Materie einarbeiten und sich ggf. einschlägige Literatur beschaffen, um sich nicht die Finger an den "Randthemen" (wie Authentifizierung, Zertifikatvalidierung etc.) zu verbrennen.