Crear un servicio https

Pregunta:

¿Cómo puede Workerman crear un servicio https para que los clientes puedan conectarse y comunicarse a través de https?

Respuesta:

El protocolo https es en realidad http+SSL, que consiste en añadir una capa de SSL sobre el protocolo http. Workerman soporta el protocolo http y también soporta SSL (se requiere Workerman versión >=3.3.7),
por lo que solo es necesario habilitar SSL sobre la base del protocolo http para admitir el protocolo https.

Hay dos soluciones generales para permitir que Workerman soporte https: una es habilitar directamente SSL en Workerman, y la otra es utilizar nginx como un proxy SSL. Se puede elegir una de las dos soluciones, no se pueden establecer simultáneamente.

Habilitar SSL en Workerman

Preparativos:

  1. Workerman versión >=3.3.7

  2. PHP tiene instalada la extensión openssl

  3. Se ha solicitado un certificado (archivos pem/crt y archivos key) que se encuentra en /etc/nginx/conf.d/ssl

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

// El certificado es mejor si es un certificado solicitado
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // También puede ser un archivo crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Esta opción debe habilitarse si se trata de un certificado autofirmado
    )
);
// Aquí se establece el protocolo http
$worker = new Worker('http://0.0.0.0:443', $context);
// Configura el transporte para habilitar ssl, convirtiéndose en http+SSL, es decir, https
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Con el código anterior de Workerman se crea un servicio https, y el cliente puede conectarse a Workerman a través del protocolo https para lograr comunicaciones seguras y cifradas.

Prueba:

Escriba en la barra de direcciones del navegador https://nombre_de_dominio:443 para acceder.

Nota:

  1. El puerto https debe ser accedido utilizando el protocolo https, no se puede acceder con el protocolo http.

  2. Los certificados normalmente están vinculados a un nombre de dominio, por lo que al probar, use un nombre de dominio, no use una dirección IP.

  3. Si no se puede acceder utilizando https, verifique el firewall del servidor.

Usar nginx como proxy SSL

Además de utilizar el SSL propio de Workerman, también se puede usar nginx como un proxy SSL para implementar https.

Nota
Se debe elegir entre el proxy SSL de nginx y la configuración SSL de Workerman, no se pueden habilitar simultáneamente.

El principio y el proceso de comunicación son:

  1. El cliente inicia una conexión https hacia nginx.

  2. Nginx convierte los datos del protocolo https en datos del protocolo http y los reenvía al puerto http de Workerman.

  3. Workerman recibe los datos, realiza el procesamiento lógico del negocio y devuelve los datos del protocolo http a nginx.

  4. Nginx convierte los datos del protocolo http nuevamente en https y los reenvía al cliente.

Ejemplo de configuración de nginx

Condiciones previas y preparativos:

  1. Supongamos que Workerman escucha en el puerto 8181 (protocolo http)

  2. Se ha solicitado un certificado (archivos pem/crt y archivos key) que se encuentra en /etc/nginx/conf.d/ssl.

  3. Se planea usar nginx para habilitar el puerto 443 y proporcionar servicios de proxy wss (puerto puede modificarse según sea necesario).

La configuración de nginx es similar a la siguiente:


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

server {
  listen 443;
  server_name nombre_del_dominio.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 "";
  }
}