nginx का इस्तेमाल करके, साइन किए हुए एचटीटीपी एक्सचेंज (एसएक्सजी) सेट अप करने का तरीका

एसएक्सजी एक्सटेंशन वाला TLS सर्टिफ़िकेट जनरेट करने, एसएक्सजी फ़ाइलें जनरेट करने के लिए टूल इंस्टॉल करने, और एसएक्सजी फ़ाइलें इस्तेमाल करने के लिए nginx को कॉन्फ़िगर करने का तरीका जानें.

Hiroki Kumazaki
Hiroki Kumazaki

साइन किए हुए एचटीटीपी एक्सचेंज (एसएक्सजी) एक नई वेब टेक्नोलॉजी है. इससे उपयोगकर्ता, कॉन्टेंट डिस्ट्रिब्यूटर के अलावा कॉन्टेंट क्रिएटर्स को आसानी से बता सकते हैं. इस गाइड में एसएक्सजी को सेट अप करने का तरीका बताया गया है.

क्रॉस-ब्राउज़र सहायता

Chromium पर आधारित कई ब्राउज़र एसएक्सजी के साथ काम करते हैं. इनमें Google Chrome और Samsung भी शामिल हैं और Microsoft Edge है. इसके बारे में आम सहमति और मानक तय करने वाला सेक्शन देखें ऑरिजिन-साइन किए गए एचटीटीपी एक्सचेंज ताकि आपको ज़्यादा अप-टू-डेट जानकारी मिल सके.

ज़रूरी शर्तें

अपनी वेबसाइट पर एसएक्सजी लागू करने के लिए, आपको ये काम करने होंगे:

  • अपने डोमेन का कंट्रोल रखें. इसमें डीएनएस एंट्री का कंट्रोल भी शामिल है.
  • सर्टिफ़िकेट पाएं. एसएक्सजी के लिए, खास तौर पर एक सर्टिफ़िकेट जारी करना ज़रूरी है. खास तौर पर, TLS कुंजी या सर्टिफ़िकेट का दोबारा इस्तेमाल नहीं किया जा सकता.
  • आपके पास एक ऐसा एचटीटीपी सर्वर हो जो एचटीटीपीएस पर एसएक्सजी जनरेट कर सके और उसे सेवा दे सके.

अनुमान

इस गाइड का मकसद है कि:

  • साथ ही, आपके ऐप्लिकेशन में OpenSSL 1.1.1 एनवायरमेंट मौजूद हो. यह गाइड Ubuntu 18.04 LTS के साथ amd64 ISA पर लिखी गई है.
  • एक्ज़ीक्यूटेबल इंस्टॉल करने के लिए sudo चलाने की सुविधा पाएं.
  • nginx को एचटीटीपी सर्वर के तौर पर इस्तेमाल करें.
  • SXG से जुड़े एक्सटेंशन वाले सर्टिफ़िकेट जनरेट करने के लिए, DigiCert का इस्तेमाल किया जा रहा है, क्योंकि फ़िलहाल यही कंपनी इन एक्सटेंशन के साथ काम करती है.

साथ ही, इस लेख में दिए गए उदाहरणों के निर्देशों में यह माना गया है कि आपका डोमेन website.test है. इसलिए, आपको website.test को अपने असल डोमेन से बदलना होगा.

पहला चरण: एसएक्सजी के लिए सर्टिफ़िकेट पाना

एसएक्सजी जनरेट करने के लिए, आपको CanSignHttpExchanges एक्सटेंशन वाले TLS सर्टिफ़िकेट की ज़रूरत होगी. साथ ही, एक खास तरह की कुंजी भी होनी चाहिए. DigiCert इस एक्सटेंशन के साथ सर्टिफ़िकेट उपलब्ध कराता है. सर्टिफ़िकेट जारी करने के लिए, आपको एक सीएसआर फ़ाइल की ज़रूरत होगी, इसलिए नीचे दिए गए निर्देशों की मदद से इसे जनरेट करें:

openssl ecparam -genkey -name prime256v1 -out mySxg.key
openssl req -new -key mySxg.key -nodes -out mySxg.csr -subj "/O=Test/C=US/CN=website.test"

आपको एक सीएसआर फ़ाइल मिलेगी, जो इस तरह दिखेगी:

-----BEGIN CERTIFICATE REQUEST-----
MIHuMIGVAgEAMDMxDTALBgNVBAoMBFRlc3QxCzAJBgNVBAYTAlVTMRUwEwYDVQQD
DAx3ZWJzaXRlLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS7IVaeMvid
S5UO7BspzSe5eqT5Qk6X6dCggUiV/vyqQaFDjA/ALyTofgXpbCaksorPaDhdA+f9
APdHWkTbbdv1oAAwCgYIKoZIzj0EAwIDSAAwRQIhAIb7n7Kcc6Y6pU3vFr8SDNkB
kEadlVKNA24SVZ/hn3fjAiAS2tWXhYdJX6xjf2+DL/smB36MKbXg7VWy0K1tWmFi
Sg==
-----END CERTIFICATE REQUEST-----

सुनिश्चित करें कि:

  • वैधता अवधि 90 दिनों से ज़्यादा नहीं होती.
  • सर्टिफ़िकेट में CanSignHttpExchanges एक्सटेंशन शामिल करें चेकबॉक्स चालू होता है, जो अतिरिक्त सर्टिफ़िकेट के विकल्प में मिलता है.
सर्टिफ़िकेट में CanSignHttpExchanges एक्सटेंशन शामिल करें चेकबॉक्स.

अगर आपका सर्टिफ़िकेट इन शर्तों से मेल नहीं खाता, तो ब्राउज़र और डिस्ट्रिब्यूटर सुरक्षा की वजहों से आपके एसएक्सजी को अस्वीकार कर देंगे. इस गाइड में यह माना गया है कि DigiCert से मिले सर्टिफ़िकेट की फ़ाइल का नाम mySxg.pem है.

दूसरा चरण: libsxg इंस्टॉल करना

एसएक्सजी फ़ॉर्मैट काफ़ी जटिल होता है. साथ ही, टूल का इस्तेमाल किए बिना इसे जनरेट करना मुश्किल होता है. एसएक्सजी जनरेट करने के लिए, इनमें से किसी एक विकल्प का इस्तेमाल किया जा सकता है:

यह गाइड libsxg का इस्तेमाल करती है.

पहला विकल्प: Debian पैकेज से libsxg इंस्टॉल करना

आप पैकेज को सामान्य Debian तरीके से इंस्टॉल कर सकते हैं, जब तक कि OpenAssistant (libssl-dev) वर्शन का मिलान हो जाए.

sudo apt install -y libssl-dev
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg0_0.2-1_amd64.deb
wget https://github.com/google/libsxg/releases/download/v0.2/libsxg-dev_0.2-1_amd64.deb
sudo dpkg -i libsxg0_0.2-1_amd64.deb
sudo dpkg -i libsxg-dev_0.2-1_amd64.deb

दूसरा विकल्प: libsxg को मैन्युअल तरीके से बनाना

अगर आपके पास, .deb फ़ाइलों के साथ काम करने वाले एनवायरमेंट का इस्तेमाल करने का विकल्प नहीं है, तो libsxg खुद बनाया जा सकता है. पहले से तय की गई शर्त के तौर पर, आपको git, cmake, openssl, और gcc को इंस्टॉल करना होगा.

git clone https://github.com/google/libsxg
mkdir libsxg/build
cd libsxg/build
cmake .. -DRUN_TEST=false -DCMAKE_BUILD_TYPE=Release
make
sudo make install

तीसरा चरण: nginx प्लगिन इंस्टॉल करें

nginx प्लगिन की मदद से, एसएक्सजी को डाइनैमिक तौर पर जनरेट किया जा सकता है, न कि विज्ञापन दिखाने से पहले, स्टैटिक तरीके से जनरेट किया जा सकता है.

विकल्प 1: Debian पैकेज से प्लगिन इंस्टॉल करें

nginx के लिए एसएक्सजी मॉड्यूल, GitHub पर उपलब्ध कराया गया है. Debian सिस्टम पर, इसे बाइनरी पैकेज के रूप में इंस्टॉल किया जा सकता है:

sudo apt install -y nginx=1.15.9-0
wget https://github.com/google/nginx-sxg-module/releases/download/v0.1/libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb
sudo dpkg -i libnginx-mod-http-sxg-filter_1.15.9-0ubuntu1.1_amd64.deb

विकल्प 2: मैन्युअल रूप से प्लग इन बनाएं

nginx मॉड्यूल बनाने के लिए, nginx सोर्स कोड की ज़रूरत होती है. आपको नीचे दिए गए निर्देशों का इस्तेमाल करके टारबॉल मिल सकती है और इसे एसएक्सजी डाइनैमिक मॉड्यूल के साथ बनाया जा सकता है:

git clone https://github.com/google/nginx-sxg-module
wget https://nginx.org/download/nginx-1.17.5.tar.gz
tar xvf nginx-1.17.5.tar.gz
cd nginx-1.17.5
./configure --prefix=/opt/nginx --add-dynamic-module=../nginx-sxg-module --without-http_rewrite_module --with-http_ssl_module
make
sudo make install

nginx कॉन्फ़िगरेशन में बहुत ज़्यादा सुविधाएं हैं. अपने सिस्टम में कहीं भी nginx इंस्टॉल करें. इसके बाद, module/config/log/pidfile का पाथ डालें. हम उम्मीद करते हैं कि आपने इसे /opt/nginx पर इंस्टॉल किया है.

चौथा चरण: nginx प्लगिन को कॉन्फ़िगर करना, ताकि वह एसएक्सजी के साथ काम कर सके

पहला विकल्प: डेबियन से इंस्टॉल किए गए nginx मॉड्यूल को कॉन्फ़िगर करना

अगर आपने पहले चरण 3, विकल्प 1 का इस्तेमाल किया था, तो इन निर्देशों का पालन करें.

एसएक्सजी कॉन्टेंट को डिलीवर करने के लिए, एचटीटीपीएस ज़रूरी है. आपको DigiCert, Let’s Encrypt, और अन्य सेवाओं से एसएसएल/टीएलएस सर्टिफ़िकेट मिल सकता है. ध्यान दें कि एसएसएल सर्टिफ़िकेट के लिए एसएक्सजी सर्टिफ़िकेट का इस्तेमाल नहीं किया जा सकता. इसी तरह, एसएसएल सर्टिफ़िकेट के लिए एसएक्सजी सर्टिफ़िकेट का इस्तेमाल नहीं किया जा सकता. इसलिए, आपको दो सर्टिफ़िकेट की ज़रूरत होगी. /etc/nginx/nginx.conf में कॉन्फ़िगरेशन फ़ाइल इनके जैसी दिखेगी, यह मानते हुए कि एसएसएल कुंजी/सर्टिफ़िकेट का पेयर /path/to/ssl/ में और एसएक्सजी कुंजी/सर्टिफ़िकेट का पेयर /path/to/sxg/ में रखा जाता है:

user www-data;
include /etc/nginx/modules-enabled/*.conf;

events {
     worker_connections 768;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    add_header  X-Content-Type-Options nosniff;

    server {
        listen 443 ssl;
        ssl_certificate     /path/to/ssl/fullchain.pem;
        ssl_certificate_key /path/to/ssl/privkey.pem;
        server_name  website.test;

        sxg on;
        sxg_certificate     /path/to/sxg/mySxg.pem;
        sxg_certificate_key /path/to/sxg/mySxg.key;
        sxg_cert_url        https://website.test/certs/cert.cbor;
        sxg_validity_url    https://website.test/validity/resource.msg;
        sxg_cert_path       /certs/cert.cbor;

        root /var/www/html;
    }
}
  • एसएक्सजी को सही तरीके से लोड करने के लिए, sxg_cert_url ज़रूरी है. ऐसा इसलिए, क्योंकि यह सर्टिफ़िकेट चेन का पता लगाता है. सर्टिफ़िकेट चेन में, सर्टिफ़िकेट और OCSP स्टेपलिंग की जानकारी cbor फ़ॉर्मैट में होती है. ध्यान दें कि आपको cert.cbor फ़ाइल को एक ही ऑरिजिन से इस्तेमाल करना ज़रूरी नहीं है. इसे किसी भी सीडीएन या दूसरी स्टैटिक फ़ाइल सेवा देने वाली सेवा के ज़रिए दिखाया जा सकता है, बशर्ते वह एचटीटीपीएस के साथ काम करता हो.
  • sxg_validitiy_url को, एसएक्सजी-सिग्नेचर-हेडर से जुड़ी जानकारी दिखाने की योजना बनाई गई है. अगर पिछले एसएक्सजी के बाद से किसी पेज में बदलाव नहीं किया गया है, तो तकनीकी तौर पर पूरी एसएक्सजी फ़ाइल डाउनलोड करने की ज़रूरत नहीं है. इसलिए, सिग्नेचर हेडर की जानकारी अपडेट करने से नेटवर्क ट्रैफ़िक कम हो सकता है. हालांकि, जानकारी अभी तक लागू नहीं की गई है.

nginx से सदस्यता लें और एसएक्सजी का इस्तेमाल करें!

sudo systemctl start nginx.service
curl -H"Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
cat index.html.sxg
sxg1-b3...https://website.test/...(omit)

दूसरा विकल्प: बिल्ट-इन सोर्स nginx मॉड्यूल को कॉन्फ़िगर करना

अगर आपने पहले चरण 3, विकल्प 2 का इस्तेमाल किया था, तो इन निर्देशों का पालन करें.

यहां दिए गए उदाहरण की तरह दिखने के लिए, /opt/nginx में इंस्टॉल किए गए अपने nginx सिस्टम को कॉन्फ़िगर करें:

load_module "/opt/nginx/modules/ngx_http_sxg_filter_module.so";

events {
    worker_connections 768;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    add_header X-Content-Type-Options nosniff;

    server {
        listen 443 ssl;
        ssl_certificate     /path/to/ssl/fullchain.pem;
        ssl_certificate_key /path/to/ssl/privkey.pem;
        server_name  example.com;

        sxg on;
        sxg_certificate     /path/to/sxg/mySxg.pem;
        sxg_certificate_key /path/to/sxg/mySxg.key;
        sxg_cert_url        https://website.test/certs/cert.cbor;
        sxg_validity_url    https://website.test/validity/resource.msg;
        sxg_cert_path       /certs/cert.cbor;

        root /opt/nginx/html;
    }
}

इसके बाद, nginx शुरू करें. अब आपको एसएक्सजी मिल सकता है!

cd /opt/nginx/sbin
sudo ./nginx
curl -H "Accept: application/signed-exchange;v=b3" https://website.test/ > index.html.sxg
less index.html.sxg
sxg1-b3...https://website.test/...(omit)

चरण 5: अपना ऐप्लिकेशन बैकएंड उपलब्ध कराएं

ऊपर दिए गए उदाहरणों में, nginx रूट डायरेक्ट्री में स्टैटिक फ़ाइलें इस्तेमाल करता है. हालांकि, जब तक आपका nginx, फ़्रंट एचटीटीपी सर्वर के तौर पर काम करता है, तब तक आर्बिट्रेरी वेब ऐप्लिकेशन बैकएंड (जैसे कि Ruby on Rails, Django या Express) के लिए एसएक्सजी बनाने के लिए, अपने ऐप्लिकेशन के लिए अपस्ट्रीम डायरेक्टिव का इस्तेमाल किया जा सकता है.

upstream app {
    server 127.0.0.1:8080;
}

server {
    location / {
        proxy_pass http://app;
    }
}

छठा चरण: जांच करना

डंप साइन्डएक्सचेंज टूल का इस्तेमाल करें यह जांच करने के लिए कि दिखाए जा रहे एसएक्सजी सही हैं या नहीं. साथ ही, यह पक्का करें कि कोई गड़बड़ी न मिले. साथ ही, पुष्टि करें कि हेडर शरीर उम्मीद के मुताबिक है.

go get -u github.com/WICG/webpackage/go/signedexchange/cmd/dump-signedexchange
export PATH=$PATH:~/go/bin
dump-signedexchange -verify -uri https://website.test/ | less

सुझाव भेजें

एसएक्सजी पर काम करने वाले Chromium के इंजीनियर, webpackage-dev@chromium.org पर आपके सुझाव, शिकायत या राय जानना चाहेंगे. आप खास जानकारी पर चर्चा में शामिल हो सकते हैं या टीम को गड़बड़ी की रिपोर्ट कर सकते हैं. आपके सुझाव, शिकायत या राय से, स्टैंडर्ड तय करने की प्रोसेस में काफ़ी मदद मिलेगी. साथ ही, इससे नीतियों को लागू करने में होने वाली समस्याओं को हल करने में भी मदद मिलेगी. धन्यवाद!