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

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

Hiroki Kumazaki
Hiroki Kumazaki

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

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

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

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

अपनी वेबसाइट पर एसएक्सजी लागू करने के लिए:

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

अनुमान

इस गाइड में यह माना जाता है कि:

  • आपके पास{9/} 1.1.1 एनवायरमेंट हो. यह गाइड amd64 ISA पर Ubuntu 18.04 LTS के साथ लिखा गया है.
  • एक्ज़ीक्यूटेबल इंस्टॉल करने के लिए, sudo चलाने की सुविधा होनी चाहिए.
  • nginx को एचटीटीपी सर्वर के तौर पर इस्तेमाल करें.
  • ऐसे सर्टिफ़िकेट जनरेट करने के लिए 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 तरीके से इंस्टॉल किया जा सकता है. हालांकि, ऐसा तभी तक किया जा सकता है, जब तक कि OpenGL (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 प्लगिन की मदद से, विज्ञापन दिखाने से पहले स्टैटिक तरीके से जनरेट करने के बजाय, डाइनैमिक तौर पर एसएक्सजी जनरेट किया जा सकता है.

पहला विकल्प: 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

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

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 प्लगिन को कॉन्फ़िगर करना, ताकि वह एसएक्सजी के साथ काम कर सके

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

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

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

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 ब्राउज़र के लिए ज़रूरी है, क्योंकि यह सर्टिफ़िकेट चेन का पता लगाता है. सर्टिफ़िकेट चेन में, सर्टिफ़िकेट और ओसीएसपी स्टेपलिंग की जानकारी होती है, जिसमें सीबीआर फ़ॉर्मैट मौजूद होता है. ध्यान दें कि आपको एक ही ऑरिजिन से 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)

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

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

upstream app {
    server 127.0.0.1:8080;
}

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

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

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

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 पर आपके सुझाव, शिकायत या राय जानने में दिलचस्पी रखते हैं. खास जानकारी के बारे में बातचीत में भी शामिल हुआ जा सकता है या टीम से गड़बड़ी की शिकायत की जा सकती है. आपके सुझाव, शिकायत या राय से, स्टैंडर्ड तय करने की प्रक्रिया को पूरा करने में काफ़ी मदद मिलेगी. साथ ही, इससे लागू होने वाली समस्याओं को हल करने में भी मदद मिलेगी. धन्यवाद!