ट्रांसमिशन एन्क्रिप्शन-ssl/tls

प्रश्न:

Workerman के बीच संचार को सुरक्षित कैसे बनाए रखें?

उत्तर:

एक सुविधाजनक तरीका यह है कि संचार प्रोटोकॉल के ऊपर एक SSL एन्क्रिप्शन लेयर जोड़ें, जैसे कि wss, [https](https://baike.baidu.com/item/ https) प्रोटोकॉल SSL एन्क्रिप्टेड ट्रांसमिशन पर आधारित हैं, जो बहुत सुरक्षित हैं। Workerman स्वयं SSL का समर्थन करता है (Workerman>=3.3.7 की आवश्यकता है), बस कुछ विशेषताओं को सेट करने की आवश्यकता है ताकि SSL चालू हो सके।

बेशक, डेवलपर्स कुछ एन्क्रिप्शन एल्गोरिदम के आधार पर अपनी खुद की एन्क्रिप्शन तंत्र को लागू कर सकते हैं।

Workerman में ssl को चालू करने की विधि इस प्रकार है:

तैयारी कार्य:

  1. Workerman का संस्करण 3.3.7 या उससे अधिक होना चाहिए

  2. PHP में openssl एक्सटेंशन स्थापित होना चाहिए

  3. एक सर्टिफिकेट (pem/crt फ़ाइल और key फ़ाइल) पहले ही आवेदन कर ली गई हो और उसे /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);
// transport सेटिंग ssl चालू करना
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Workerman में सर्वर नाम संकेत SNI(Server Name Indication) को चालू करना

एक ही IP, पोर्ट पर कई सर्टिफिकेट को बाइंड करने की अनुमति देता है।

सर्टिफिकेट .pem और .key फ़ाइलों को मर्ज करें:

प्रत्येक सर्टिफिकेट की .pem और उसके संबंधित .key फ़ाइल की सामग्री को मिलाएं, .key फ़ाइल की सामग्री को .pem फ़ाइल के अंत में जोड़ें। (यदि .pem फ़ाइल में पहले से ही निजी कुंजी शामिल है, तो इसे छोड़ सकते हैं।)

कृपया ध्यान रखें कि यह एकल सर्टिफिकेट है, सभी सर्टिफिकेट को एक फ़ाइल में कॉपी नहीं करना है

उदाहरण के लिए, host1.com.pem के मर्ज किए गए 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();