Übertragungsverschlüsselung - ssl/tls
Frage:
Wie kann die Kommunikation mit Workerman sicher gestaltet werden?
Antwort:
Eine bequeme Möglichkeit besteht darin, eine zusätzliche Ebene der SSL-Verschlüsselung über das Kommunikationsprotokoll hinzuzufügen, wie beispielsweise die Protokolle wss oder https, die beide auf der SSL-Verschlüsselung basieren und sehr sicher sind. Workerman selbst unterstützt SSL (benötigt Workerman>=3.3.7), es genügt, eine Eigenschaft einzustellen, um SSL zu aktivieren.
Natürlich können Entwickler auch basierend auf bestimmten Verschlüsselungs- und Entschlüsselungsalgorithmen einen eigenen Mechanismus zur Verschlüsselung und Entschlüsselung implementieren.
So wird SSL in Workerman aktiviert:
Vorbereitungen:
-
Workerman-Version nicht kleiner als 3.3.7
-
PHP hat die openssl-Erweiterung installiert
-
Ein Zertifikat wurde beantragt (pem/crt-Dateien sowie key-Datei) und befindet sich im Verzeichnis /etc/nginx/conf.d/ssl.
Code:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// Es ist am besten, ein beantragtes Zertifikat zu verwenden
$context = array(
'ssl' => array(
'local_cert' => '/etc/nginx/conf.d/ssl/server.pem', // Kann auch eine crt-Datei sein
'local_pk' => '/etc/nginx/conf.d/ssl/server.key',
'verify_peer' => false,
'allow_self_signed' => true, // Diese Option sollte aktiviert werden, wenn es sich um ein selbstsigniertes Zertifikat handelt
)
);
// Hier wird das Websocket-Protokoll eingestellt, es kann auch das http-Protokoll oder ein anderes Protokoll sein
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Transport auf SSL aktivieren
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();
Aktivierung der Server Name Indication SNI in Workerman
Ermöglicht die Bindung mehrerer Zertifikate an die gleiche IP und den gleichen Port.
Kombinieren der Zertifikat-.pem- und .key-Dateien:
Kombinieren Sie den Inhalt jeder .pem-Datei mit der entsprechenden .key-Datei und fügen Sie den Inhalt der .key-Datei ans Ende der .pem-Datei an. (Wenn der private Schlüssel bereits in der .pem-Datei enthalten ist, kann dieser Schritt übersprungen werden.)
Bitte beachten Sie, dass es sich um ein einzelnes Zertifikat handelt, nicht darum, alle Zertifikate in eine Datei zu kopieren.
Ein Beispiel für den kombinierten Inhalt der host1.com.pem könnte folgendermaßen aussehen:
-----BEGIN CERTIFICATE-----
MIIGXTCBA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAA....
-----END RSA PRIVATE KEY-----
Code:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$context = array(
'ssl' => array(
'SNI_enabled' => true, // SNI aktivieren
'SNI_server_certs' => [ // Mehrere Zertifikate setzen
'host1.com' => '/path/host1.com.pem', // Zertifikat 1
'host2.com' => '/path/host2.com.pem', // Zertifikat 2
],
'local_cert' => '/path/default.com.pem', // Standardzertifikat
'local_pk' => '/path/default.com.key',
)
);
$worker = new Worker('websocket://0.0.0.0:443', $context);
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
$con->send('ok');
};
Worker::runAll();