نقل التشفير - ssl/tls

سؤال:

كيف يمكن ضمان أمان الاتصال بين Workerman؟

جواب:

من الطرق المريحة إضافة طبقة SSL فوق بروتوكول الاتصال، مثل بروتوكول wss، وhttps التي تعتمد على SSL في النقل المشفر، وهي طريقة آمنة للغاية. يدعم Workerman SSL (تتطلب Workerman>=3.3.7)، كل ما عليك فعله هو إعداد بعض الخصائص لتفعيل SSL.

بالطبع، يمكن للمطورين أيضًا إنشاء آلية تشفير وفك تشفير خاصة بهم استنادًا إلى بعض خوارزميات التشفير.

طرق تفعيل ssl على Workerman كالتالي:

التحضيرات:

  1. يجب أن تكون نسخة Workerman 3.3.7 أو أحدث

  2. يجب أن يكون PHP مثبتًا مع امتداد openssl

  3. يجب الحصول على الشهادة (ملفات pem/crt وملف المفتاح) وتخزينها في المسار /etc/nginx/conf.d/ssl

الكود:

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

// الشهادة من الأفضل أن تكون شهادة تم الحصول عليها
$context = array(
    'ssl' => array(
        'local_cert'        => '/etc/nginx/conf.d/ssl/server.pem', // يمكن أن تكون أيضًا ملف crt
        'local_pk'          => '/etc/nginx/conf.d/ssl/server.key',
        'verify_peer'       => false,
        'allow_self_signed' => true, // إذا كانت الشهادة ذاتية التوقيع تحتاج إلى تفعيل هذا الخيار
    )
);
// هنا تم تعيين بروتوكول websocket، يمكن أيضًا أن يكون بروتوكول http أو بروتوكولات أخرى
$worker = new Worker('websocket://0.0.0.0:443', $context);
// تعيين النقل لفتح ssl
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

تفعيل إشارة اسم الخادم SNI (Server Name Indication)

يمكن تنفيذه لربط شهادات متعددة على نفس IP ونفس المنفذ.

دمج الشهادات .pem و .key:

قم بدمج محتويات كل شهادة .pem مع ملف .key المقابل لها، وأضف محتويات ملف .key إلى نهاية ملف .pem. (إذا كان ملف .pem يحتوي على مفتاح خاص بالفعل، يمكنك تجاهله.)

يرجى ملاحظة أنه شهادة واحدة وليس نسخ جميع الشهادات إلى ملف واحد

على سبيل المثال، محتويات ملف pem بعد الدمج لشهادة host1.com.pem ستكون كما يلي تقريبًا:

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

الكود:

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

$context = array(
    'ssl' => array(
        'SNI_enabled' => true, // تفعيل SNI
        'SNI_server_certs' => [ // تعيين شهادات متعددة
            'host1.com' => '/path/host1.com.pem', // الشهادة 1
            'host2.com' => '/path/host2.com.pem', // الشهادة 2
        ],
        'local_cert' => '/path/default.com.pem', // الشهادة الافتراضية
        '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();