Linux เป็นแพลตฟอร์มเดียวที่ผู้ใช้ Chrome สามารถติดตั้งส่วนขยายที่โฮสต์นอก Chrome เว็บสโตร์ บทความนี้อธิบายวิธีแพ็กเกจ โฮสต์ และอัปเดตไฟล์ crx
จากเว็บเซิร์ฟเวอร์อเนกประสงค์ หากคุณเผยแพร่ส่วนขยายหรือธีมผ่าน Chrome เว็บสโตร์ เท่านั้น โปรดดูการโฮสต์และการอัปเดตในเว็บสโตร์
แพ็กเกจ
ส่วนขยายและธีมจะแสดงเป็นไฟล์ .crx
เมื่ออัปโหลดผ่านหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ Chrome หน้าแดชบอร์ดจะสร้างไฟล์ crx
โดยอัตโนมัติ หากเผยแพร่ในเซิร์ฟเวอร์ส่วนตัว คุณจะต้องสร้างไฟล์ crx
ในเครื่องหรือดาวน์โหลดจาก Chrome เว็บสโตร์
ดาวน์โหลด .crx จาก Chrome เว็บสโตร์
หากส่วนขยายโฮสต์อยู่ใน Chrome เว็บสโตร์ คุณจะดาวน์โหลดไฟล์ .crx
ได้จากแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ ค้นหาชิ้นงานในส่วน "ข้อมูลของคุณ" แล้วคลิก "ข้อมูลเพิ่มเติม" ในหน้าต่างป๊อปอัป ให้คลิกลิงก์ main.crx
สีน้ำเงินเพื่อดาวน์โหลด
คุณจะโฮสต์ไฟล์ที่ดาวน์โหลดได้บนเซิร์ฟเวอร์ส่วนตัว วิธีนี้เป็นวิธีที่ปลอดภัยที่สุดในการโฮสต์ส่วนขยายในเครื่อง เนื่องจาก Chrome เว็บสโตร์จะเป็นผู้ลงนามเนื้อหาของส่วนขยาย ซึ่งจะช่วยตรวจจับการโจมตีที่อาจเกิดขึ้นและการงัดแงะ
สร้าง .crx ในเครื่อง
ระบบจะแปลงไดเรกทอรีส่วนขยายเป็นไฟล์ .crx
ในหน้าการจัดการส่วนขยาย ไปที่ chrome://extensions/
ในแถบที่อยู่ หรือคลิกเมนู Chrome วางเคอร์เซอร์เหนือ "เครื่องมือเพิ่มเติม" แล้วเลือก "ส่วนขยาย"
ในหน้าการจัดการส่วนขยาย ให้เปิดใช้โหมดนักพัฒนาซอฟต์แวร์โดยคลิกสวิตช์เปิด/ปิดข้างโหมดนักพัฒนาซอฟต์แวร์ จากนั้นเลือกปุ่มขยายแพ็กเกจ
ระบุเส้นทางไปยังโฟลเดอร์ของส่วนขยายในช่องไดเรกทอรีรากของส่วนขยาย จากนั้นคลิกปุ่มแพ็กส่วนขยาย ละเว้นช่องคีย์ส่วนตัวสำหรับแพ็กเกจที่ใช้เป็นครั้งแรก
Chrome จะสร้างไฟล์ 2 ไฟล์ ได้แก่ ไฟล์ .crx
และไฟล์ .pem
ซึ่งมีคีย์ส่วนตัวของส่วนขยาย
อย่าทำคีย์ส่วนตัวหาย! เก็บไฟล์ .pem
ไว้ในที่ที่ปลอดภัยและเป็นความลับ คุณต้องใช้ไฟล์นี้เพื่ออัปเดตส่วนขยาย
อัปเดตแพ็กเกจ .crx
อัปเดตไฟล์ .crx
ของส่วนขยายโดยเพิ่มหมายเลขเวอร์ชันใน manifest.json
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
กลับไปที่หน้าการจัดการส่วนขยาย แล้วคลิกปุ่มแพ็กส่วนขยาย ระบุเส้นทางไปยังไดเรกทอรีส่วนขยายและตำแหน่งของคีย์ส่วนตัว
หน้านี้จะแสดงเส้นทางสําหรับชิ้นงานที่แพ็กเกจซึ่งอัปเดตแล้ว
แพ็กเกจผ่านบรรทัดคำสั่ง
แพ็กเกจส่วนขยายในบรรทัดคำสั่งโดยเรียกใช้ chrome.exe
ใช้แฟล็ก --pack-extension
เพื่อระบุตำแหน่งของโฟลเดอร์ส่วนขยาย และใช้แฟล็ก --pack-extension-key
เพื่อระบุตำแหน่งของไฟล์คีย์ส่วนตัวของส่วนขยาย
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
โฮสต์
เซิร์ฟเวอร์ที่โฮสต์ไฟล์ .crx
ต้องใช้ส่วนหัว HTTP ที่เหมาะสมเพื่อให้ผู้ใช้ติดตั้งส่วนขยายได้โดยคลิกลิงก์
Google Chrome จะถือว่าไฟล์ติดตั้งได้หากเป็นไปตามเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้
- ไฟล์มีประเภทเนื้อหา
application/x-chrome-extension
- ส่วนต่อท้ายไฟล์คือ
.crx
และทั้ง 2 ข้อต่อไปนี้เป็นจริง- ไฟล์ไม่ได้แสดงพร้อมกับส่วนหัว HTTP
X-Content-Type-Options: nosniff
- ไฟล์แสดงพร้อมกับเนื้อหาประเภทใดประเภทหนึ่งต่อไปนี้
- สตริงว่าง
"text/plain"
"application/octet-stream"
"unknown/unknown"
"application/unknown"
"\*/\*"
- ไฟล์ไม่ได้แสดงพร้อมกับส่วนหัว HTTP
สาเหตุที่พบบ่อยที่สุดของการไม่รู้จักไฟล์ที่ติดตั้งได้คือเซิร์ฟเวอร์ส่งส่วนหัว X-Content-Type-Options: nosniff
สาเหตุที่พบบ่อยอันดับ 2 คือเซิร์ฟเวอร์ส่งเนื้อหาประเภทที่ไม่รู้จัก ซึ่งไม่ได้อยู่ในรายการก่อนหน้า วิธีแก้ไขปัญหาเกี่ยวกับส่วนหัว HTTP ให้เปลี่ยนแปลงการกำหนดค่าของเซิร์ฟเวอร์หรือลองโฮสต์ไฟล์ .crx
ไว้ในเซิร์ฟเวอร์อื่น
อัปเดต
ทุก 2-3 ชั่วโมง เบราว์เซอร์จะตรวจสอบส่วนขยายที่ติดตั้งเพื่อหา URL อัปเดต ระบบจะส่งคําขอไปยัง URL นั้นเพื่อค้นหาไฟล์ XML ไฟล์ Manifest ของการอัปเดตสําหรับแต่ละรายการ
- เนื้อหาที่การตรวจสอบการอัปเดตแสดงคือเอกสาร XML ไฟล์ Manifest ของการอัปเดตซึ่งแสดงรายการส่วนขยายเวอร์ชันล่าสุด
หากไฟล์ Manifest ของการอัปเดตระบุเวอร์ชันที่ใหม่กว่าที่ติดตั้งไว้ เบราว์เซอร์จะดาวน์โหลดและติดตั้งเวอร์ชันใหม่ เช่นเดียวกับการอัปเดตด้วยตนเอง ไฟล์ .crx
ใหม่ต้องลงนามด้วยคีย์ส่วนตัวเดียวกันกับเวอร์ชันที่ติดตั้งอยู่ในปัจจุบัน
อัปเดต URL
ส่วนขยายที่โฮสต์บนเซิร์ฟเวอร์ภายนอก Chrome เว็บสโตร์ต้องมีช่อง update_url
ในไฟล์ manifest.json
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
อัปเดตไฟล์ Manifest
ไฟล์ Manifest ของการอัปเดตที่เซิร์ฟเวอร์ส่งคืนควรเป็นเอกสาร XML
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
</app>
</gupdate>
รูปแบบ XML นี้ยืมมาจากรูปแบบที่ใช้โดย Omaha ซึ่งเป็นโครงสร้างพื้นฐานการอัปเดตของ Google ระบบส่วนขยายใช้แอตทริบิวต์ต่อไปนี้สำหรับองค์ประกอบ <app>
และ <updatecheck>
ของไฟล์ Manifest การอัปเดต
- appid
- ระบบจะสร้างรหัสส่วนขยายตามแฮชของคีย์สาธารณะ ตามที่อธิบายไว้ในการบรรจุ รหัสของส่วนขยายจะแสดงในหน้าการจัดการส่วนขยาย
- ฐานของโค้ด
- HTTPS URL ไปยังไฟล์
.crx
- เวอร์ชัน
- ไคลเอ็นต์ใช้พิจารณาว่าควรดาวน์โหลดไฟล์
.crx
ที่ระบุโดยcodebase
หรือไม่ ซึ่งควรตรงกับค่าของ "version" ในไฟล์manifest.json
ของไฟล์.crx
ไฟล์ XML ของไฟล์อัปเดตอาจมีข้อมูลเกี่ยวกับส่วนขยายหลายรายการโดยรวมองค์ประกอบ <app>
หลายรายการ
การทดสอบ
ความถี่ในการตรวจสอบการอัปเดตเริ่มต้นคือ 2-3 ชั่วโมง แต่คุณบังคับให้อัปเดตได้โดยใช้ปุ่มอัปเดตชิ้นงานเลยในหน้าการจัดการชิ้นงาน
การดำเนินการนี้จะเริ่มต้นการตรวจสอบส่วนขยายทั้งหมดที่ติดตั้ง
การใช้งานขั้นสูง: พารามิเตอร์คําขอ
กลไกการอัปเดตอัตโนมัติขั้นพื้นฐานออกแบบมาเพื่อให้ทำงานกับฝั่งเซิร์ฟเวอร์ได้ง่ายเพียงแค่วางไฟล์ XML แบบคงที่บนเว็บเซิร์ฟเวอร์ทั่วไป เช่น Apache และอัปเดตไฟล์ XML ดังกล่าวเมื่อมีการเผยแพร่ส่วนขยายเวอร์ชันใหม่
นักพัฒนาซอฟต์แวร์ที่โฮสต์ส่วนขยายหลายรายการอาจตรวจสอบพารามิเตอร์คำขอ ซึ่งระบุรหัสและเวอร์ชันส่วนขยายในคำขออัปเดต การใส่พารามิเตอร์เหล่านี้จะช่วยให้ชิ้นงานอัปเดตจาก URL เดียวกันที่ใช้โค้ดฝั่งเซิร์ฟเวอร์แบบไดนามิกแทนไฟล์ XML แบบคงที่
รูปแบบของพารามิเตอร์คําขอมีดังนี้
?x=EXTENSION_DATA
โดยที่ EXTENSION_DATA
คือสตริงที่เข้ารหัส URL ของรูปแบบ
id=EXTENSION_ID&v=EXTENSION_VERSION
ตัวอย่างเช่น ชิ้นงาน 2 รายการชี้ไปยัง URL การอัปเดตเดียวกัน (https://test.com/extension_updates.php
)
- ส่วนขยาย 1
- รหัส: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- เวอร์ชัน: "1.1"
- ส่วนขยาย 2
- รหัส: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- เวอร์ชัน: "0.4"
คำขออัปเดตส่วนขยายแต่ละรายการจะเป็นดังนี้
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
และ
https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
คุณสามารถระบุส่วนขยายหลายรายการในคําขอเดียวสําหรับ URL การอัปเดตที่ไม่ซ้ำกันแต่ละรายการ จากตัวอย่างก่อนหน้านี้ หากผู้ใช้ติดตั้งส่วนขยายทั้ง 2 รายการ ระบบจะผสานคําขอทั้ง 2 รายการเข้าเป็นคําขอเดียว
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
หากจำนวนส่วนขยายที่ติดตั้งโดยใช้ URL การอัปเดตเดียวกันมีมากพอที่จะทำให้ URL คำขอ GET ยาวเกินไป (มากกว่า 2,000 อักขระ) การตรวจสอบการอัปเดตจะส่งคำขอ GET เพิ่มเติมตามที่จำเป็น
การใช้งานขั้นสูง: เวอร์ชันเบราว์เซอร์ขั้นต่ำ
เมื่อมีการเพิ่ม API ลงในระบบส่วนขยายมากขึ้น เราอาจเปิดตัวส่วนขยายเวอร์ชันอัปเดตที่จะใช้ได้กับเบราว์เซอร์เวอร์ชันใหม่เท่านั้น แม้ว่า Google Chrome จะอัปเดตโดยอัตโนมัติ แต่อาจใช้เวลา 2-3 วันก่อนที่ผู้ใช้ส่วนใหญ่จะอัปเดตเป็นเวอร์ชันใหม่ หากต้องการให้การอัปเดตหนึ่งๆ มีผลกับ Google Chrome เวอร์ชันที่เท่ากับหรือสูงกว่าเวอร์ชันที่ระบุเท่านั้น ให้เพิ่มแอตทริบิวต์ "prodversionmin" ลงในองค์ประกอบ <app>
ในการตอบกลับการอัปเดต
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
<app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
<updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
</app>
</gupdate>
วิธีนี้จะช่วยให้มั่นใจได้ว่าผู้ใช้จะอัปเดตเป็นเวอร์ชัน 2 โดยอัตโนมัติก็ต่อเมื่อใช้ Google Chrome 3.0.193.0 ขึ้นไป