ดูวิธีแสดง 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
Flag-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
ในหัวของ SXGSignature
ในสภาพแวดล้อมที่ใช้งานจริง ระบบจะใช้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>
ที่เทียบเท่าซึ่งจําเป็นสําหรับการดึงข้อมูลเนื้อหานี้ในรูปแบบ SXGwebpkgserver
จะตั้งค่าคำสั่ง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 ในเครื่องมือสําหรับนักพัฒนาเว็บจะแสดงข้อผิดพลาด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
คำขอหลักๆ ที่
webpkgserver
จัดการมี 2 ประเภท ได้แก่ คำขอ 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 =