Self-host สำหรับ Linux

Linux เป็นแพลตฟอร์มเดียวที่ผู้ใช้ Chrome สามารถติดตั้งส่วนขยายที่โฮสต์นอก Chrome เว็บสโตร์ บทความนี้อธิบายวิธีแพ็กเกจ โฮสต์ และอัปเดตไฟล์ crxจากเว็บเซิร์ฟเวอร์อเนกประสงค์ หากคุณเผยแพร่ส่วนขยายหรือธีมผ่าน Chrome เว็บสโตร์ เท่านั้น โปรดดูการโฮสต์และการอัปเดตในเว็บสโตร์

แพ็กเกจ

ส่วนขยายและธีมจะแสดงเป็นไฟล์ .crx เมื่ออัปโหลดผ่านหน้าแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ Chrome หน้าแดชบอร์ดจะสร้างไฟล์ crx โดยอัตโนมัติ หากเผยแพร่ในเซิร์ฟเวอร์ส่วนตัว คุณจะต้องสร้างไฟล์ crx ในเครื่องหรือดาวน์โหลดจาก Chrome เว็บสโตร์

ดาวน์โหลด .crx จาก Chrome เว็บสโตร์

หากส่วนขยายโฮสต์อยู่ใน Chrome เว็บสโตร์ คุณจะดาวน์โหลดไฟล์ .crx ได้จากแดชบอร์ดสำหรับนักพัฒนาซอฟต์แวร์ ค้นหาชิ้นงานในส่วน "ข้อมูลของคุณ" แล้วคลิก "ข้อมูลเพิ่มเติม" ในหน้าต่างป๊อปอัป ให้คลิกลิงก์ main.crx สีน้ำเงินเพื่อดาวน์โหลด

ดาวน์โหลด .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"
    • "\*/\*"

สาเหตุที่พบบ่อยที่สุดของการไม่รู้จักไฟล์ที่ติดตั้งได้คือเซิร์ฟเวอร์ส่งส่วนหัว X-Content-Type-Options: nosniff สาเหตุที่พบบ่อยอันดับ 2 คือเซิร์ฟเวอร์ส่งเนื้อหาประเภทที่ไม่รู้จัก ซึ่งไม่ได้อยู่ในรายการก่อนหน้า วิธีแก้ไขปัญหาเกี่ยวกับส่วนหัว HTTP ให้เปลี่ยนแปลงการกำหนดค่าของเซิร์ฟเวอร์หรือลองโฮสต์ไฟล์ .crx ไว้ในเซิร์ฟเวอร์อื่น

อัปเดต

ทุก 2-3 ชั่วโมง เบราว์เซอร์จะตรวจสอบส่วนขยายที่ติดตั้งเพื่อหา URL อัปเดต ระบบจะส่งคําขอไปยัง URL นั้นเพื่อค้นหาไฟล์ XML ไฟล์ Manifest ของการอัปเดตสําหรับแต่ละรายการ

  • เนื้อหาที่การตรวจสอบการอัปเดตแสดงคือเอกสาร XML ไฟล์ Manifest ของการอัปเดตซึ่งแสดงรายการส่วนขยายเวอร์ชันล่าสุด

หากไฟล์ Manifest ของการอัปเดตระบุเวอร์ชันที่ใหม่กว่าที่ติดตั้งไว้ เบราว์เซอร์จะดาวน์โหลดและติดตั้งเวอร์ชันใหม่ เช่นเดียวกับการอัปเดตด้วยตนเอง ไฟล์ .crx ใหม่ต้องลงนามด้วยคีย์ส่วนตัวเดียวกันกับเวอร์ชันที่ติดตั้งอยู่ในปัจจุบัน

หมายเหตุ: เพื่อรักษาความเป็นส่วนตัวของผู้ใช้ Google Chrome จะไม่ส่งส่วนหัวคุกกี้ใดๆ พร้อมกับคำขอไฟล์ Manifest สำหรับการอัปเดตอัตโนมัติ และจะไม่สนใจส่วนหัว Set-Cookie ใดๆ ในการตอบสนองต่อคำขอดังกล่าว

อัปเดต 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 ขึ้นไป