ดูวิธีแสดง Signed Exchange (SXG) โดยใช้ Web Packager
Signed Exchange (SXG) คือกลไกการนำส่งที่ช่วยให้ตรวจสอบสิทธิ์แหล่งที่มาของทรัพยากรได้โดยไม่ขึ้นอยู่กับวิธีการนำส่ง
วิธีการต่อไปนี้อธิบายวิธีตั้งค่า Signed Exchange โดยใช้ Web Packager วิธีการมีให้สำหรับทั้งใบรับรองแบบ Self-signed และCanSignHttpExchanges
แสดง SXG โดยใช้ใบรับรองที่ลงนามด้วยตนเอง
การใช้ใบรับรองที่ลงนามด้วยตนเองเพื่อแสดง SXG นั้นใช้เพื่อสาธิตและทดสอบเป็นหลัก SXG ที่ลงนามด้วยใบรับรองที่ลงนามด้วยตนเองจะสร้างข้อความแสดงข้อผิดพลาดในเบราว์เซอร์เมื่อใช้นอกสภาพแวดล้อมการทดสอบ และไม่ควรแสดงต่อ Crawler
ข้อกำหนดเบื้องต้น
หากต้องการทําตามวิธีการเหล่านี้ คุณจะต้องติดตั้ง openssl และ Go ในสภาพแวดล้อมการพัฒนาซอฟต์แวร์
สร้างใบรับรองที่ลงนามด้วยตนเอง
ส่วนนี้จะอธิบายวิธีสร้างใบรับรองที่ลงนามด้วยตนเองซึ่งสามารถใช้กับการรับส่งข้อมูลที่ลงนามได้
วิธีการ
สร้างคีย์ส่วนตัว
openssl ecparam -out priv.key -name prime256v1 -genkey
ระบบจะบันทึกคีย์ส่วนตัวเป็นไฟล์ชื่อ
priv.key
สร้างคำขอลงชื่อใบรับรอง (CSR)
openssl req -new -sha256 -key priv.key -out cert.csr -subj '/O=Web Packager Demo/CN=example.com'
คำขอลงนามใบรับรองคือบล็อกข้อความที่เข้ารหัสซึ่งสื่อถึงข้อมูลที่จำเป็นในการขอใบรับรองจากผู้ออกใบรับรอง (CA) แม้ว่าคุณจะไม่ได้ขอใบรับรองจาก CA แต่ก็ยังจำเป็นต้องสร้างคำขอลงนามใบรับรอง
คำสั่งด้านบนจะสร้างคำขอเซ็นชื่อใบรับรองสำหรับองค์กรชื่อ
Web Packager Demo
ที่มีชื่อทั่วไปexample.com
ชื่อทั่วไปควรเป็นชื่อโดเมนแบบเต็มของเว็บไซต์ซึ่งมีเนื้อหาที่คุณต้องการแพ็กเกจเป็น SXGโดยเป็นเว็บไซต์ที่คุณเป็นเจ้าของในการตั้งค่า SXG เวอร์ชันที่ใช้งานจริง อย่างไรก็ตาม ในสภาพแวดล้อมการทดสอบอย่างเช่นที่อธิบายไว้ในวิธีการเหล่านี้ อาจเป็นเว็บไซต์ใดก็ได้
สร้างใบรับรองที่มีนามสกุล
CanSignHttpExchanges
openssl x509 -req -days 90 -in cert.csr -signkey priv.key -out cert.pem -extfile <(echo -e "1.3.6.1.4.1.11129.2.1.22 = ASN1:NULL\nsubjectAltName=DNS:example.com")
คำสั่งนี้ใช้คีย์ส่วนตัวและ CSR ที่สร้างขึ้นในระยะที่ 1 และ 2 เพื่อสร้างไฟล์ใบรับรอง
cert.pem
แฟล็ก-extfile
จะเชื่อมโยงใบรับรองกับส่วนขยายใบรับรองCanSignHttpExchanges
(1.3.6.1.4.1.11129.2.1.22
คือตัวระบุออบเจ็กต์ของส่วนขยายCanSignHttpExchanges
) นอกจากนี้ Flag-extfile
ยังกำหนดexample.com
เป็น Subject Alternative Name ด้วยหากสงสัยเกี่ยวกับเนื้อหาของ
cert.pem
คุณสามารถดูเนื้อหาดังกล่าวได้โดยใช้คำสั่งต่อไปนี้openssl x509 -in cert.pem -noout -text
การสร้างคีย์ส่วนตัวและใบรับรองเสร็จแล้ว คุณต้องใช้ไฟล์
priv.key
และcert.pem
ในส่วนถัดไป
ตั้งค่าเซิร์ฟเวอร์ Web Packager สำหรับการทดสอบ
ข้อกำหนดเบื้องต้น
ติดตั้ง Web Packager
git clone https://github.com/google/webpackager.git
สร้าง
webpkgserver
cd webpackager/cmd/webpkgserver go build .
webpkgserver
คือไบนารีที่เฉพาะเจาะจงภายในโปรเจ็กต์ Web Packagerยืนยันว่าได้ติดตั้ง
webpkgserver
อย่างถูกต้อง./webpkgserver --help
คำสั่งนี้ควรแสดงข้อมูลเกี่ยวกับการใช้งาน
webpkgserver
หากวิธีนี้ไม่ได้ผล ขั้นตอนแรกในการแก้ปัญหาที่ดีคือตรวจสอบว่าได้กําหนดค่า GOPATH อย่างถูกต้องแล้ว
วิธีการ
ไปที่ไดเรกทอรี
webpkgserver
(คุณอาจอยู่ในไดเรกทอรีนี้อยู่แล้ว)cd /path/to/cmd/webpkgserver
สร้างไฟล์
webpkgsever.toml
โดยคัดลอกตัวอย่างcp ./webpkgserver.example.toml ./webpkgserver.toml
ไฟล์นี้มีตัวเลือกการกำหนดค่าสำหรับ
webpkgserver
เปิด
webpkgserver.toml
ด้วยเครื่องมือแก้ไขที่ต้องการ แล้วทําการเปลี่ยนแปลงต่อไปนี้- เปลี่ยนบรรทัด
#AllowTestCert = false
เป็นAllowTestCert = true
- เปลี่ยนบรรทัด
PEMFile = 'path/to/your.pem'
เพื่อแสดงเส้นทางไปยังใบรับรอง PEMcert.pem
ที่คุณสร้างขึ้น อย่าเปลี่ยนบรรทัดที่พูดถึงTLS.PEMFile
เนื่องจากเป็นตัวเลือกการกําหนดค่าอื่น - เปลี่ยนบรรทัด
KeyFile = 'priv.key'
ให้แสดงเส้นทางของคีย์ส่วนตัวpriv.key
ที่คุณสร้างขึ้น อย่าเปลี่ยนบรรทัดที่กล่าวถึงTLS.KeyFile
เนื่องจากนี่เป็นตัวเลือกการกำหนดค่าที่แตกต่างกัน - เปลี่ยนบรรทัด
#CertURLBase = '/webpkg/cert'
เป็นCertURLBase = 'data:'
CertURLBase
ระบุตำแหน่งที่แสดงใบรับรอง SXG ข้อมูลนี้ใช้เพื่อตั้งค่าพารามิเตอร์cert-url
ในส่วนหัวของSignature
ของ SXG ในสภาพแวดล้อมที่ใช้งานจริง ระบบจะใช้CertURLBase
ดังนี้CertURLBase = 'https://mysite.com/'
อย่างไรก็ตาม สําหรับการทดสอบในเครื่อง คุณสามารถใช้CertURLBase = 'data:'
เพื่อสั่งให้webpkgserver
ใช้ data URL เพื่อแทรกใบรับรองในช่องcert-url
สําหรับการทดสอบในเครื่อง วิธีนี้เป็นวิธีที่สะดวกที่สุดในการแสดงใบรับรอง SXG - เปลี่ยนบรรทัด
Domain = 'example.org'
ให้ตรงกับโดเมนที่คุณสร้างใบรับรอง หากคุณทําตามวิธีการในบทความนี้อย่างตรงไปตรงมา ค่านี้ควรเปลี่ยนเป็นexample.com
webpkgserver
จะดึงข้อมูลเนื้อหาจากโดเมนที่ระบุโดยwebpkgserver.toml
เท่านั้น หากคุณพยายามดึงข้อมูลหน้าเว็บจากโดเมนอื่นโดยไม่อัปเดตwebpkgserver.toml
บันทึกwebpkgserver
จะแสดงข้อความแสดงข้อผิดพลาดURL doesn't match the fetch targets
ไม่บังคับ
หากต้องการเปิดหรือปิดใช้การโหลด
webpkgserver.toml
ทรัพยากรย่อยล่วงหน้า ตัวเลือกการกําหนดค่าต่อไปนี้จะเกี่ยวข้องหากต้องการให้
webpkgserver
แทรกคำสั่งสำหรับโหลดสไตล์ชีตและทรัพยากรย่อยของสคริปต์ล่วงหน้าเป็น SXG ให้เปลี่ยนบรรทัด#PreloadCSS = false
เป็นPreloadCSS = true
นอกจากนี้ ให้เปลี่ยนบรรทัด#PreloadJS = false
เป็นPreloadJS = true
นอกเหนือจากการใช้ตัวเลือกการกําหนดค่านี้ คุณสามารถเพิ่มส่วนหัว
Link: rel="preload"
และแท็ก<link rel="preload">
ลงใน HTML ของหน้าเว็บด้วยตนเองโดยค่าเริ่มต้น
webpkgserver
จะแทนที่แท็ก<link rel="preload">
ที่มีอยู่ด้วยแท็ก<link>
ที่เทียบเท่าซึ่งจําเป็นสําหรับการดึงข้อมูลเนื้อหานี้ในรูปแบบ SXG เมื่อดำเนินการดังกล่าวwebpkgserver
จะตั้งค่าคำสั่งallowed-alt-sxg
และheader-integrity
ตามที่จำเป็น ผู้เขียน HTML จึงไม่ต้องเพิ่มคำสั่งเหล่านี้ด้วยตนเอง หากต้องการลบล้างลักษณะการทำงานนี้และเก็บการโหลดล่วงหน้าที่ไม่ใช่ SXG ที่มีอยู่ ให้เปลี่ยน#KeepNonSXGPreloads (default = false)
เป็นKeepNonSXGPreloads = true
โปรดทราบว่าการเปิดใช้ตัวเลือกนี้อาจทำให้ SXG ไม่มีสิทธิ์สำหรับแคช Google SXG ตามข้อกำหนดเหล่านี้
- เปลี่ยนบรรทัด
เริ่ม
webpkgserver
./webpkgserver
หากเซิร์ฟเวอร์เริ่มต้นสําเร็จ คุณควรเห็นข้อความบันทึกต่อไปนี้
shell Listening at 127.0.0.1:8080 Successfully retrieved valid OCSP. Writing to cache in /private/tmp/webpkg
ข้อความในบันทึกอาจดูแตกต่างออกไปเล็กน้อย โดยเฉพาะอย่างยิ่งไดเรกทอรีที่
webpkgserver
ใช้เพื่อแคชใบรับรองจะแตกต่างกันไปตามระบบปฏิบัติการหากไม่เห็นข้อความเหล่านี้ ขั้นตอนแรกที่ดีในการแก้ปัญหาคือการตรวจสอบ
webpkgserver.toml
อีกครั้งหากคุณอัปเดต
webpkgserver.toml
คุณควรรีสตาร์ทwebpkgserver
เปิด Chrome โดยใช้คำสั่งต่อไปนี้
shell /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \ --user-data-dir=/tmp/udd \ --ignore-certificate-errors-spki-list=`openssl x509 -noout -pubkey -in cert.pem | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | base64`
คำสั่งนี้จะสั่งให้ Chrome ละเว้นข้อผิดพลาดเกี่ยวกับใบรับรองที่เชื่อมโยงกับ
cert.pem
ซึ่งช่วยให้ทดสอบ SXG ได้โดยใช้ใบรับรองทดสอบ หาก Chrome เปิดขึ้นโดยไม่มีคำสั่งนี้ การตรวจสอบ SXG ใน DevTools จะแสดงข้อผิดพลาดCertificate verification error: ERR_CERT_INVALID
หมายเหตุ
คุณอาจต้องปรับคำสั่งนี้ให้สอดคล้องกับตำแหน่งของ Chrome ในเครื่อง รวมถึงตำแหน่งของ
cert.pem
หากคุณดำเนินการถูกต้องแล้ว คุณควรเห็นคำเตือนปรากฏใต้แถบที่อยู่ คำเตือนควรมีลักษณะคล้ายกับYou are using an unsupported command-line flag: --ignore-certificate-errors-spki-list=9uxADcgc6/ho0mJLRMBcOjfBaN21k0sOInoMchr9CMY=.
หากคำเตือนไม่มีสตริงแฮช แสดงว่าคุณไม่ได้ระบุตำแหน่งของใบรับรอง SXG อย่างถูกต้อง
เปิดแท็บเครือข่ายของเครื่องมือสําหรับนักพัฒนาเว็บ จากนั้นไปที่ URL ต่อไปนี้
http://localhost:8080/priv/doc/https://example.com
ซึ่งจะส่งคําขอไปยังอินสแตนซ์
webpackager
ที่ทํางานอยู่ที่http://localhost:8080
สําหรับ SXG ที่มีเนื้อหาของhttps://example.com
/priv/doc/
เป็นปลายทาง API เริ่มต้นที่webpackager
ใช้ทรัพยากรต่อไปนี้จะแสดงอยู่ในแท็บเครือข่าย
- ทรัพยากรประเภท
signed-exchange
นี่คือ SXG - ทรัพยากรประเภท
cert-chain+cbor
นี่คือใบรับรอง SXG ใบรับรอง SXG ต้องใช้รูปแบบapplication/cert-chain+cbor
- ทรัพยากรประเภท
document
นี่คือเนื้อหาที่ส่งผ่าน SXG
หากไม่เห็นทรัพยากรเหล่านี้ ให้ลองล้างแคชของเบราว์เซอร์ แล้วโหลด
http://localhost:8080/priv/doc/https://example.com
อีกครั้งคลิกแท็บแสดงตัวอย่างเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับ Signed Exchange และลายเซ็น
- ทรัพยากรประเภท
แสดง Signed Exchange โดยใช้ใบรับรอง CanSignHttpExchanges
วิธีการในส่วนนี้จะอธิบายวิธีแสดง SXG โดยใช้ใบรับรอง CanSignHttpExchanges
การใช้งาน SXG ในเวอร์ชันที่ใช้งานจริงต้องมีใบรับรอง CanSignHttpExchanges
วิธีการเหล่านี้เขียนขึ้นโดยสมมติว่าคุณเข้าใจแนวคิดที่กล่าวถึงในส่วนตั้งค่า Signed Exchange โดยใช้ใบรับรองที่ลงนามด้วยตนเองเพื่อให้สั้นกระชับ
ข้อกำหนดเบื้องต้น
คุณมีใบรับรอง
CanSignHttpExchanges
หน้านี้แสดงรายชื่อ CA ที่เสนอใบรับรองประเภทนี้หากไม่มีใบรับรอง คุณกำหนดค่า Webpkgserver ให้ดึงข้อมูลใบรับรองจาก CA ได้โดยอัตโนมัติ คุณสามารถทำตามวิธีการสำหรับสิ่งที่ควรใส่ใน
webpkgserver.toml
ในหน้านี้แม้ว่าจะไม่บังคับ แต่เราขอแนะนําอย่างยิ่งให้คุณเรียกใช้
webpkgserver
หลังเซิร์ฟเวอร์ Edge หากไม่ได้ใช้เซิร์ฟเวอร์ Edge คุณจะต้องกำหนดค่าตัวเลือกTLS.PEMFile
และTLS.KeyFile
ในwebpkgserver.toml
โดยค่าเริ่มต้นwebpkgserver
จะทํางานผ่าน HTTP อย่างไรก็ตาม เบราว์เซอร์จะถือว่าใบรับรอง SXG ถูกต้องก็ต่อเมื่อแสดงผ่าน HTTPS การกำหนดค่าTLS.PEMFile
และTLS.KeyFile
จะช่วยให้webpkgserver
ใช้ HTTPS ได้ จึงแสดงใบรับรอง SXG ไปยังเบราว์เซอร์โดยตรง
วิธีการ
สร้างไฟล์ PEM โดยการต่อท้ายใบรับรอง SXG ของเว็บไซต์ตามด้วยใบรับรอง CA ของเว็บไซต์ ดูวิธีการเพิ่มเติมได้ที่นี่
PEM คือรูปแบบไฟล์ที่มักใช้เป็น "คอนเทนเนอร์" สำหรับจัดเก็บใบรับรองหลายรายการ
สร้างไฟล์
webpkgsever.toml
ใหม่โดยการคัดลอกตัวอย่างcp ./webpkgserver.example.toml ./webpkgserver.toml
เปิด
webpkgserver.toml
ด้วยเครื่องมือแก้ไขที่คุณต้องการ แล้วทำการเปลี่ยนแปลงต่อไปนี้- เปลี่ยนบรรทัด
PEMFile = cert.pem
ให้ตรงกับตำแหน่งของไฟล์ PEM ที่มีเชนใบรับรองแบบเต็ม - เปลี่ยนบรรทัด
KeyFile = 'priv.key'
เพื่อแสดงตำแหน่งของคีย์ส่วนตัวที่ตรงกับไฟล์ PEM - เปลี่ยนบรรทัด
Domain = 'example.org'
ให้แสดงถึงเว็บไซต์ของคุณ - (ไม่บังคับ) หากต้องการให้
webpkgserver
ต่ออายุใบรับรอง SXG โดยอัตโนมัติทุก 90 วัน (45 วันสำหรับ Google) ให้กำหนดค่าตัวเลือกในส่วน[SXG.ACME]
ของwebpkgserver.toml
ตัวเลือกนี้ใช้ได้กับเว็บไซต์ที่มีการตั้งค่าบัญชี DigiCert หรือ Google ACME เท่านั้น
- เปลี่ยนบรรทัด
กำหนดค่าเซิร์ฟเวอร์ Edge ให้ส่งต่อการรับส่งข้อมูลไปยังอินสแตนซ์
webpkgserver
มีคำขอ 2 ประเภทหลักที่
webpkgserver
จัดการ ได้แก่ คำขอสำหรับ SXG (ซึ่งให้บริการโดยปลายทาง/priv/doc/
) และคำขอสำหรับใบรับรอง SXG (ซึ่งให้บริการโดยปลายทาง/webpkg/cert/
) กฎการเขียน URL ใหม่สำหรับคำขอแต่ละประเภทจะแตกต่างกันเล็กน้อย โปรดดูข้อมูลเพิ่มเติมที่การทำงานหลังเซิร์ฟเวอร์ Edge ฟรอนท์เอนด์หมายเหตุ
โดยค่าเริ่มต้น
webpkgserver
จะแสดงใบรับรอง SXG ใน/webpkg/cert/$CERT_HASH
ตัวอย่างเช่น/webpkg/cert/-0QmE0gvoedn92gtwI3s7On9zPevJGm5pn2RYhpZxgY
หากต้องการสร้าง$CERT_HASH
ให้เรียกใช้คำสั่งต่อไปนี้shell openssl base64 -in cert.pem -d | openssl dgst -sha256 -binary | base64 | tr /+ _- | tr -d =