İletim Şifreleme - ssl/tls

Soru:

Workerman ile iletişimin güvenliğini nasıl sağlayabilirim?

Cevap:

İletişim protokolü üzerine SSL şifreleme katmanı eklemek oldukça kolay bir yöntemdir. Örneğin, wss ve https protokolleri SSL şifrelemesi ile güvenli bir şekilde iletilir. Workerman, SSL desteğini sağlamaktadır (Workerman>=3.3.7 gerekmektedir), yalnızca özellikleri ayarlayarak SSL'yi etkinleştirebilirsiniz.

Elbette geliştiriciler, belirli şifreleme algoritmalarına dayalı kendi şifreleme mekanizmalarını da oluşturabilirler.

Workerman ile ssl'yi etkinleştirme yöntemi aşağıdaki gibidir:

Hazırlık Çalışmaları:

  1. Workerman sürümü 3.3.7 veya daha üstü olmalıdır.

  2. PHP'de openssl uzantısı yüklü olmalıdır.

  3. Sertifikayı (pem/crt dosyası ve anahtar dosyası) başvurmuş ve /etc/nginx/conf.d/ssl altında bulundurmalısınız.

Kod:

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

// Sertifika mümkünse talep edilen sertifika olmalıdır
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // crt dosyası da olabilir
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // Eğer kendi imzaladığınız bir sertifika ise bu seçeneği açmanız gerekir
    )
);
// Burada ayarlanan protokol websocket, http protokolü veya diğer protokoller de olabilir
$worker = new Worker('websocket://0.0.0.0:443', $context);
// Transport'u ssl olarak ayarlama
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Workerman ile Sunucu Adı Gösterimi SNI (Server Name Indication) etkinleştirilmesi

Aynı IP ve port altında birden fazla sertifika bağlamanızı sağlar.

Sertifika .pem ve .key dosyalarını birleştirme:

Her sertifikanın .pem ve karşılık gelen .key dosyalarının içeriklerini birleştirerek .key dosyasının içeriğini .pem dosyasının sonuna ekleyin. (.pem dosyasında özel anahtar varsa, bunu göz ardı edebilirsiniz.)

Lütfen yalnızca tek bir sertifikayı birleştirdiğinizden emin olun; tüm sertifikaları tek bir dosyaya kopyalamayın.

Örneğin host1.com.pem birleştirildikten sonra .pem dosyası içeriği aşağıdaki gibi görünmelidir:

-----BEGIN CERTIFICATE-----
MIIGXTCBA...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFBzCCA...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAA....
-----END RSA PRIVATE KEY-----

Kod:

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

$context = array(
    'ssl' => array(
        'SNI_enabled' => true, // SNI'yi etkinleştir
        'SNI_server_certs' => [ // Birden fazla sertifika ayarlayın
            'host1.com' => '/path/host1.com.pem', // Sertifika 1
            'host2.com' => '/path/host2.com.pem', // Sertifika 2
        ],
        'local_cert' => '/path/default.com.pem', // Varsayılan sertifika
        '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();