HTTPS Hizmeti Oluşturma

Soru:

Workerman nasıl bir https hizmeti oluşturabilir, böylece istemci https üzerinden bağlanarak iletişim kurabilir?

Cevap:

https protokolü aslında http + SSLdir; yani http protokolüne SSL katmanı eklenmiştir. Workerman http protokolünü destekler ve aynı zamanda SSL'yi de destekler (Workerman sürümü >= 3.3.7 gereklidir), bu nedenle sadece http protokolü üzerine SSL açarak https protokolünü desteklemek yeterlidir.

Workerman'ın https desteklemesi için iki genel çözüm vardır; biri Workerman'ın doğrudan SSL açması, diğeri ise nginx'in SSL proxy olarak kullanılmasıdır. Bu iki çözümden birini seçmek yeterlidir, ikisini birden ayarlamak mümkün değildir.

Workerman'da SSL Açma

Hazırlık:

  1. Workerman sürümü >= 3.3.7

  2. PHP üzerinde openssl uzantısı yüklü

  3. /etc/nginx/conf.d/ssl altında bulunan bir sertifika (pem/crt dosyası ve anahtar dosyası) başvurusu yapılmıştır.

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

// Sertifika mümkünse alınmış sertifika olmalıdır.
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // Ayrıca crt dosyası da olabilir.
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Eğer kendinden imzalı bir sertifika ise bu seçeneği açmalısınız.
    )
);
// Burada ayarlanan http protokolüdür.
$worker = new Worker('http://0.0.0.0:443', $context);
// transport'u ssl olarak ayarlayarak http+SSL yani https haline getirin.
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Yukarıdaki Workerman kodu ile https hizmeti oluşturuldu; istemci https protokolü üzerinden workerman'a bağlanarak güvenli bir şifrelenmiş iletişim gerçekleştirebilir.

Test:

Tarayıcı adres çubuğuna https://domain:443 yazarak erişim sağlayın.

Dikkat:

  1. https portu mutlaka https protokolü ile erişim sağlanmalıdır; http protokolü ile erişilemez.

  2. Sertifika genellikle bir alan adı ile ilişkilidir, bu nedenle test sırasında lütfen alan adı kullanın, IP adresi kullanmayın.

  3. https ile erişim yapılamıyorsa sunucu güvenlik duvarını kontrol edin.

Nginx'i SSL Proxy Olarak Kullanma

Workerman'ın kendine ait SSL'inin yanı sıra, https'yi gerçekleştirmek için nginx'i SSL proxy olarak da kullanabilirsiniz.

Dikkat
nginx, SSL proxy ve Workerman'da SSL ayarı ikisinden birini seçmenize olanak tanır; ikisi birden açılamaz.

İletişim mantığı ve süreci şudur:

  1. İstemci https bağlantısını nginx'e başlatır.

  2. nginx, https protokolü verilerini http protokolüne çevirip Workerman'ın http portuna iletir.

  3. Workerman verileri aldıktan sonra iş mantığı işleyip, http protokolü verisini nginx'e geri döner.

  4. nginx daha sonra http protokolü verisini https haline çevirip, istemciye iletir.

Nginx Yapılandırma Referansı

Ön koşullar ve hazırlıklar:

  1. Workerman'ın 8181 portunu (http protokolü) dinlediğini varsayıyoruz.

  2. /etc/nginx/conf.d/ssl altında bir sertifika (pem/crt dosyası ve anahtar dosyası) başvurusu yapılmıştır.

  3. nginx'in 443 portunu dışa açarak wss proxy hizmeti sağlaması hedeflenmektedir (port ihtiyaçlara göre değiştirilebilir).

Nginx yapılandırması aşağıdaki gibi olmalıdır:


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

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