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

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

Hiroki Kumazaki
Hiroki Kumazaki

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

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

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

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

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

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

अनुमान

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

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

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

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

एसएक्सजी जनरेट करने के लिए, आपको 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 एक्सटेंशन शामिल करें चेकबॉक्स.

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

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

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

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

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

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

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 प्लग इन की मदद से, SXG को दिखाने से पहले स्टैटिक तौर पर जनरेट करने के बजाय, डाइनैमिक तौर पर जनरेट किया जा सकता है.

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

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

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 पर इंस्टॉल किया है.

चौथा चरण: SXG के साथ काम करने के लिए, nginx प्लग इन को कॉन्फ़िगर करना

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

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

एसएक्सजी कॉन्टेंट को डिलीवर करने के लिए, एचटीटीपीएस ज़रूरी है. DigiCert, Let's Encrypt, और अन्य सेवाओं से एसएसएल/TLS सर्टिफ़िकेट लिया जा सकता है. ध्यान दें कि एसएसएल के लिए एसएक्सजी सर्टिफ़िकेट का इस्तेमाल नहीं किया जा सकता. इसके अलावा, एसएक्सजी के लिए एसएसएल सर्टिफ़िकेट का इस्तेमाल भी नहीं किया जा सकता. इसलिए, आपको दो सर्टिफ़िकेट की ज़रूरत होगी. /etc/nginx/nginx.conf में मौजूद कॉन्फ़िगरेशन फ़ाइल, यहां दी गई फ़ाइल जैसी दिखनी चाहिए. ऐसा तब होगा, जब आपने /path/to/ssl/ में एसएसएल कुंजी/सर्टिफ़िकेट जोड़ा हो और /path/to/sxg/ में 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 में SXG-साइनचर-हेडर से जुड़ी जानकारी देने की योजना है. अगर पिछले एसएक्सजी के बाद से किसी पेज में कोई बदलाव नहीं हुआ है, तो तकनीकी तौर पर पूरी एसएक्सजी फ़ाइल डाउनलोड करने की ज़रूरत नहीं है. इसलिए, सिर्फ़ हस्ताक्षर वाले हेडर की जानकारी अपडेट करने से, नेटवर्क ट्रैफ़िक कम हो सकता है. हालांकि, ये जानकारी अभी तक लागू नहीं की गई है.

nginx शुरू करें और SXG दिखाने के लिए तैयार हो जाएं!

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 शुरू करें. अब आपके पास SXG पाने का विकल्प है!

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 रूट डायरेक्ट्री में स्टैटिक फ़ाइलें दिखाता है. हालांकि, अपने ऐप्लिकेशन के लिए अपस्ट्रीम डायरेक्टिव का इस्तेमाल करके, किसी भी वेब ऐप्लिकेशन के बैकएंड (जैसे, Ruby on Rails, Django या Express) के लिए SXG बनाया जा सकता है. ऐसा तब तक किया जा सकता है, जब तक आपका nginx फ़्रंट एचटीटीपी(एस) सर्वर के तौर पर काम करता है.

upstream app {
    server 127.0.0.1:8080;
}

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

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

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

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