HTTPS सेवा का निर्माण

प्रश्न:

Workerman कैसे एक https सेवा का निर्माण करता है, जिससे कि क्लाइंट https के माध्यम से संचार कर सके।

उत्तर:

https प्रोटोकॉल वास्तव में http+SSL है, अर्थात् http प्रोटोकॉल पर SSL परत जोड़ी गई है। Workerman http प्रोटोकॉल का समर्थन करता है, और साथ ही SSL का भी समर्थन करता है (Workerman संस्करण>=3.3.7 आवश्यक है)।
इसलिए केवल http प्रोटोकॉल के आधार पर SSL सक्षम करके https प्रोटोकॉल का समर्थन किया जा सकता है।

Workerman को https का समर्थन करने के लिए दो सामान्य विधियाँ हैं, एक Workerman द्वारा सीधे SSL को सक्षम करना और दूसरी nginx का उपयोग करके 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, // यदि यह स्वयं-निर्मित प्रमाणपत्र है तो इस विकल्प को सक्षम करना आवश्यक है
    )
);
// यहाँ http प्रोटोकॉल सेट किया गया है
$worker = new Worker('http://0.0.0.0:443', $context);
// transport को ssl सक्षम किया गया है, जिससे http+SSL अर्थात् https हो जाता है
$worker->transport = 'ssl';
$worker->onMessage = function(TcpConnection $con, $msg) {
    $con->send('ok');
};

Worker::runAll();

Workerman द्वारा उपरोक्त कोड के माध्यम से https सेवा स्थापित की गई है, और क्लाइंट https प्रोटोकॉल के माध्यम से Workerman से सुरक्षित एन्क्रिप्टेड संचार करने के लिए कनेक्ट कर सकता है।

परीक्षण:

ब्राउज़र के अड्रेस बार में https://डोमेन:443 टाइप करें।

ध्यान दें:

  1. https पोर्ट को https प्रोटोकॉल के माध्यम से ही एक्सेस किया जाना चाहिए, http प्रोटोकॉल से एक्सेस नहीं किया जा सकता।

  2. प्रमाणपत्र सामान्यतः डोमेन के साथ बंधे होते हैं, इसलिए परीक्षण करते समय कृपया डोमेन का उपयोग करें, आईपी का उपयोग न करें।

  3. यदि https का उपयोग करने पर पहुँच नहीं हो रही है, तो सर्वर की फ़ायरवॉल की जाँच करें।

nginx को SSL प्रॉक्सी के रूप में उपयोग करना

Workerman के अपने SSL के अलावा, आप nginx को SSL प्रॉक्सी के रूप में भी उपयोग करके https को लागू कर सकते हैं।

ध्यान दें
nginx प्रॉक्सी SSL और Workerman सेटिंग SSL में से एक का चयन करें, दोनों को एक साथ सक्षम नहीं किया जा सकता।

संचार का सिद्धांत और प्रक्रिया इस प्रकार है:

  1. क्लाइंट https कनेक्शन को nginx को शुरू करता है।

  2. nginx https प्रोटोकॉल के डेटा को http प्रोटोकॉल में परिवर्तित करता है और इसे Workerman के http पोर्ट पर अग्रेषित करता है।

  3. Workerman डेटा प्राप्त करता है और व्यवसायिक लॉजिक के अनुसार प्रक्रिया करता है, http प्रोटोकॉल वाले डेटा को nginx को वापस भेजता है।

  4. nginx फिर http प्रोटोकॉल के डेटा को https में परिवर्तित करता है और इसे क्लाइंट को अग्रेषित करता है।

nginx विन्यास संदर्भ

पूर्वापेक्षाएँ और तैयारी का कार्य:

  1. मान लें कि Workerman 8181 पोर्ट (http प्रोटोकॉल) पर सुन रहा है।

  2. पहले से प्रमाणपत्र (pem/crt फ़ाइलें और key फ़ाइल) मांगी जा चुकी हैं और उन्हें /etc/nginx/conf.d/ssl में रखा गया है।

  3. nginx 443 पोर्ट को wss प्रॉक्सी सेवा प्रदान करने के लिए खोलने की योजना है (पोर्ट को आवश्यकतानुसार संशोधित किया जा सकता है)।

nginx विन्यास इस प्रकार है:


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

server {
  listen 443;
  server_name साइटडोमेन.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 "";
  }
}