Erstellen eines HTTPS-Dienstes

Frage:

Wie kann Workerman einen https Dienst erstellen, damit Clients über https eine Verbindung herstellen können?

Antwort:

Das https Protokoll ist tatsächlich http + SSL, was bedeutet, dass die SSL Schicht über das http Protokoll gelegt wird. Workerman unterstützt das http Protokoll und auch SSL (Benötigt Workerman Version >= 3.3.7), daher muss nur die SSL Unterstützung aktiviert werden, um das https Protokoll zu unterstützen.

Es gibt zwei allgemeine Möglichkeiten, um Workerman HTTPS zu unterstützen: Eine Möglichkeit besteht darin, dass Workerman direkt SSL aktiviert, die andere besteht darin, nginx als SSL Proxy zu verwenden. Wählen Sie eine dieser beiden Optionen; sie können nicht gleichzeitig eingestellt werden.

Workerman aktiviert SSL

Vorbereitungen:

  1. Workerman Version >= 3.3.7

  2. PHP hat die OpenSSL-Erweiterung installiert

  3. Ein Zertifikat wurde beantragt (pem/crt-Datei und key-Datei) und in /etc/nginx/conf.d/ssl abgelegt

<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

// Das Zertifikat sollte idealerweise ein beantragtes Zertifikat sein
$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 muss aktiviert werden, wenn es sich um ein selbstsigniertes Zertifikat handelt
    )
);
// Hier ist das http-Protokoll eingestellt
$worker = new Worker('http://0.0.0.0:443', $context);
// Setze den Transport auf SSL, um http+SSL d.h. https zu aktivieren
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Mit dem obigen Code von Workerman wurde ein HTTPS-Dienst erstellt, sodass Clients über das HTTPS-Protokoll eine Verbindung zu Workerman herstellen können, um sichere, verschlüsselte Kommunikation zu ermöglichen.

Test:

Geben Sie in die Adresszeile des Browsers https://域名:443 ein.

Hinweise:

  1. Der HTTPS-Port muss über das HTTPS-Protokoll aufgerufen werden, der Zugriff über das HTTP-Protokoll ist nicht möglich.

  2. Zertifikate sind in der Regel an einen Domainnamen gebunden, nutzen Sie daher zur Testung den Domainnamen und nicht die IP.

  3. Wenn der Zugriff über HTTPS nicht möglich ist, überprüfen Sie die Firewall des Servers.

Verwendung von nginx als SSL-Proxy

Neben der Verwendung der eigenen SSL-Funktionen von Workerman kann auch nginx als SSL-Proxy zur Realisierung von HTTPS verwendet werden.

Hinweis
Entweder nginx als SSL-Proxy verwenden oder SSL in Workerman aktivieren, beides kann nicht gleichzeitig aktiviert werden.

Der Kommunikationsprozess und der Ablauf sind wie folgt:

  1. Der Client initiiert eine HTTPS-Verbindung zu nginx

  2. Nginx konvertiert die HTTPS-Daten in HTTP und leitet sie an den HTTP-Port von Workerman weiter

  3. Workerman verarbeitet die Daten nach der Geschäftslogik und gibt die HTTP-Daten an nginx zurück

  4. Nginx konvertiert die HTTP-Daten wieder in HTTPS und leitet sie an den Client weiter

nginx Konfigurationsbeispiel

Vorbedingungen und Vorbereitungen:

  1. Angenommen, Workerman hört auf dem Port 8181 (HTTP-Protokoll)

  2. Ein Zertifikat wurde beantragt (pem/crt-Datei und key-Datei) und in /etc/nginx/conf.d/ssl abgelegt

  3. Es wird geplant, nginx den Port 443 für WSS-Proxy-Dienste bereitzustellen (der Port kann nach Bedarf geändert werden)

nginx-Konfiguration könnte folgendermaßen aussehen:


upstream workerman {
    server 127.0.0.1:8181;
    keepalive 10240;
}

server {
  listen 443;
  server_name 站点域名.com;
  access_log off;

  ssl on;
  ssl_certificate /etc/nginx/conf.d/ssl/server.pem;
  ssl_certificate_key /etc/nginx/conf.d/ssl/server.key;
  ssl_session_timeout 5m;
  ssl_session_cache shared:SSL:50m;
  ssl_protocols SSLv3 SSLv2 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

  location /
  {
    proxy_pass http://workerman;
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Connection "";
  }
}