เก็บถาวร: ฉันโชคไม่ดีที่ไม่ได้ใช้งานโครงการนี้อีกต่อไปและยังไม่ได้รับการดูแลอย่างถูกต้องตั้งแต่ต้นปี 2565 ฉันยินดีต้อนรับทุกคนที่จะแยกและรับช่วงต่อโครงการนี้
GON เป็นเครื่องมือที่เรียบง่ายและไม่มีความถี่สำหรับการลงนามและรับรอง CLI Binaries ของคุณสำหรับ MacOS GON มีให้บริการเป็น CLI ที่สามารถเรียกใช้ด้วยตนเองหรือในท่ออัตโนมัติ นอกจากนี้ยังมีให้เป็นห้องสมุด GO สำหรับการฝังในโครงการที่เขียนใน GO กอนสามารถลงนามและรับรองไบนารีที่เขียนในภาษาใดก็ได้
เริ่มต้นด้วย MacOS Catalina (10.15) Apple ต้องการซอฟต์แวร์ทั้งหมดที่แจกจ่ายนอกร้านค้า Mac App Store เพื่อลงนามและรับรอง ซอฟต์แวร์ที่ไม่ได้ลงนามอย่างถูกต้องหรือมีการรับรองจะแสดงข้อความแสดงข้อผิดพลาดด้วยตัวเลือกที่สามารถดำเนินการได้เพียงอย่างเดียวคือ "ย้ายไปที่ Bin" ซอฟต์แวร์ไม่สามารถเรียกใช้ได้แม้จากบรรทัดคำสั่ง วิธีแก้ปัญหานั้นเจ็บปวดสำหรับผู้ใช้ GON ช่วยให้คุณดำเนินการตามกระบวนการของการรับรองโดยอัตโนมัติ
ดูแผนงานสำหรับคุณสมบัติที่เราต้องการสนับสนุน แต่ยังไม่ได้
ตัวอย่างด้านล่าง gon กับตัวเองเพื่อสร้างซิปและ DMG

วิธีที่ง่ายที่สุดในการติดตั้ง gon คือผ่าน Homebrew:
$ brew install mitchellh/gon/gon
นอกจากนี้คุณยังสามารถดาวน์โหลดรุ่นที่เหมาะสมสำหรับแพลตฟอร์มของคุณจากหน้ารีลีส ทั้งหมดนี้ได้รับการลงนามและรับรองว่าจะหมดกล่องบน MacOS 10.15+
นอกจากนี้คุณยังสามารถรวบรวมจากแหล่งที่มาโดยใช้ GO 1.13 หรือใหม่กว่าโดยใช้มาตรฐาน go build โปรดตรวจสอบให้แน่ใจว่าเปิดใช้งานโมดูล Go
gon ต้องการไฟล์การกำหนดค่าที่สามารถระบุได้ว่าเป็นพา ธ ไฟล์หรือส่งผ่านผ่านทาง stdin การกำหนดค่าระบุการตั้งค่าทั้งหมดที่ gon จะใช้เพื่อลงชื่อและแพ็คเกจไฟล์ของคุณ
GON จะต้องทำงานบนเครื่อง MacOS ด้วย Xcode 11.0 หรือใหม่กว่า การลงนามในรหัสการรับรองและบรรจุภัณฑ์ทั้งหมดต้องการเครื่องมือที่มีอยู่ในเครื่อง MacOS เท่านั้น
$ gon [flags] [CONFIG]
เมื่อดำเนินการ gon จะลงนามแพ็คเกจและรับรองไฟล์ที่กำหนดค่าไว้ในรูปแบบที่ร้องขอ gon จะออกจากรหัสออก 0 ในความสำเร็จและค่าอื่น ๆ เกี่ยวกับความล้มเหลว
ก่อนใช้ gon คุณต้องได้รับใบรับรอง ID นักพัฒนา ในการทำเช่นนี้คุณสามารถทำได้ผ่านทางเว็บหรือผ่าน XCode ในเครื่องบน Mac การใช้ XCode นั้นง่ายกว่าถ้าคุณติดตั้งแล้ว
ผ่านเว็บ:
ลงชื่อเข้าใช้ editial.apple.com พร้อมข้อมูลรับรอง Apple ID ที่ถูกต้อง คุณอาจต้องลงทะเบียนสำหรับบัญชีนักพัฒนา Apple
นำทางไปยังหน้าใบรับรอง
คลิกที่ไอคอน "+" เลือก "แอปพลิเคชัน ID นักพัฒนา" และทำตามขั้นตอน
หลังจากดาวน์โหลดใบรับรองดับเบิลคลิกเพื่อนำเข้าพวงกุญแจของคุณ หากคุณกำลังสร้างเครื่อง CI เครื่อง CI ทุกเครื่องจะต้องมีใบรับรองนี้ในพวงกุญแจ
ผ่าน xcode:
เปิด xcode และไปที่ xcode => predences => บัญชี
คลิกที่ "+" ที่ด้านล่างซ้ายและเพิ่ม Apple ID ของคุณหากคุณยังไม่ได้
เลือกบัญชี Apple ของคุณและคลิก "จัดการใบรับรอง" ที่มุมล่างขวา
คลิก "+" ที่มุมล่างซ้ายและคลิก "แอปพลิเคชัน ID นักพัฒนาซอฟต์แวร์"
คลิกขวาที่ใบรับรองที่สร้างขึ้นใหม่ในรายการคลิก "ส่งออก" และส่งออกไฟล์เป็นใบรับรองรูปแบบ p12 บันทึกสิ่งนี้ที่ไหนสักแห่ง คุณจะไม่สามารถดาวน์โหลดได้อีก
ในการตรวจสอบว่าคุณทำสิ่งนี้อย่างถูกต้องคุณสามารถตรวจสอบพวงกุญแจของคุณ:
$ security find-identity -v
1) 97E4A93EAA8BAC7A8FD2383BFA459D2898100E56 " Developer ID Application: Mitchell Hashimoto (GK79KXBF4F) "
1 valid identities foundคุณควรเห็นใบรับรองหนึ่งใบขึ้นไปและอย่างน้อยหนึ่งควรเป็นใบรับรองแอปพลิเคชัน ID นักพัฒนาของคุณ คำนำหน้าสตริงเลขฐานสิบหกคือค่าที่คุณสามารถใช้ในไฟล์กำหนดค่าของคุณเพื่อระบุตัวตน
ไฟล์การกำหนดค่าสามารถระบุรายการอนุญาต/ปฏิเสธใบอนุญาตสำหรับรายงานการแทนที่ใบอนุญาตสำหรับการพึ่งพาเฉพาะและอื่น ๆ รูปแบบไฟล์การกำหนดค่าคือ HCL หรือ JSON
ตัวอย่าง:
source = [ " ./terraform " ]
bundle_id = " com.mitchellh.example.terraform "
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
provider = " UL304B4VGY "
}
sign {
application_identity = " Developer ID Application: Mitchell Hashimoto "
}
dmg {
output_path = " terraform.dmg "
volume_name = " Terraform "
}
zip {
output_path = " terraform.zip "
}{
"source" : [ " ./terraform " ],
"bundle_id" : " com.mitchellh.example.terraform " ,
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD " ,
"provider" : " UL304B4VGY "
},
"sign" :{
"application_identity" : " Developer ID Application: Mitchell Hashimoto "
},
"dmg" :{
"output_path" : " terraform.dmg " ,
"volume_name" : " Terraform "
},
"zip" :{
"output_path" : " terraform.zip "
}
}การกำหนดค่าที่รองรับ:
source ( array<string> ) - รายการไฟล์ที่จะลงชื่อ, แพ็คเกจและรับรอง หากคุณต้องการเซ็นชื่อหลายไฟล์ที่มีตัวตนที่แตกต่างกันหรือลงในแพ็คเกจที่แตกต่างกันคุณควรเรียกใช้ gon ด้วยการกำหนดค่าแยกต่างหาก นี่เป็นทางเลือกหากคุณใช้โหมด Notarization Oonly พร้อมกับบล็อก notarize
bundle_id ( string ) - ID Bundle สำหรับแอปพลิเคชันของคุณ คุณควรเลือกสิ่งที่ไม่เหมือนใครสำหรับแอปพลิเคชันของคุณ คุณสามารถลงทะเบียนสิ่งเหล่านี้ด้วย Apple นี่เป็นทางเลือกหากคุณใช้โหมด Notarization Oonly พร้อมกับบล็อก notarize
apple_id - การตั้งค่าที่เกี่ยวข้องกับ Apple ID เพื่อใช้สำหรับการรับรอง
username ( string ) - ชื่อผู้ใช้ Apple ID มักจะเป็นที่อยู่อีเมล สิ่งนี้จะเริ่มต้นกับตัวแปรสภาพแวดล้อม AC_USERNAME หากไม่ได้ตั้งค่า
password ( string ) - รหัสผ่านสำหรับ Apple ID ที่เกี่ยวข้อง สามารถระบุได้โดยตรงหรือใช้ @keychain:<name> หรือ @env:<name> เพื่อหลีกเลี่ยงการใส่รหัสผ่านธรรมดาโดยตรงในไฟล์การกำหนดค่า @keychain:<name> ไวยากรณ์จะโหลดรหัสผ่านจากปุ่ม MacOS ด้วยชื่อที่กำหนด @env:<name> ไวยากรณ์จะโหลดรหัสผ่านจากตัวแปรสภาพแวดล้อมที่มีชื่อ หากไม่ได้ตั้งค่านี้เราจะพยายามใช้ตัวแปรสภาพแวดล้อม AC_PASSWORD เป็นค่าเริ่มต้น
หมายเหตุ : หากคุณเปิดใช้งาน 2FA รหัสผ่านจะต้องเป็นรหัสผ่านแอปพลิเคชันไม่ใช่รหัสผ่าน Apple ID ปกติของคุณ ดูการแก้ไขปัญหาสำหรับรายละเอียด
provider ( string ) - ผู้ให้บริการ App Store Connect เมื่อใช้หลายทีมภายใน App Store Connect หากไม่ได้ตั้งค่าไว้เราจะพยายามอ่านตัวแปรสภาพแวดล้อม AC_PROVIDER เป็นค่าเริ่มต้น
sign - การตั้งค่าที่เกี่ยวข้องกับไฟล์การลงนาม
application_identity ( string ) - ชื่อหรือ ID ของใบรับรอง "แอปพลิเคชัน ID ผู้พัฒนา" เพื่อใช้เพื่อลงนามแอปพลิเคชัน สิ่งนี้ยอมรับค่าที่ถูกต้องสำหรับการตั้งค่าสถานะ -s สำหรับรหัสไบนารี codesign บน MacOS ดู man codesign สำหรับเอกสารรายละเอียดเกี่ยวกับค่าที่ยอมรับ
entitlements_file ( string เป็นตัวเลือก --entitlements -พา ธ แบบเต็มไปยังรูปแบบ plist codesign
dmg ( ไม่บังคับ ) - การตั้งค่าที่เกี่ยวข้องกับการสร้างภาพดิสก์ (DMG) เป็นเอาต์พุต สิ่งนี้จะถูกสร้างขึ้นหากระบุไว้ DMG จะมีตั๋ว Notarization Stapled เพื่อให้สามารถตรวจสอบออฟไลน์และ ไม่ จำเป็นต้องใช้อินเทอร์เน็ต
output_path ( string ) - เส้นทางในการสร้างไฟล์เก็บถาวร zip หากเส้นทางนี้มีอยู่แล้วมันจะถูกเขียนทับ ไฟล์ทั้งหมดใน source จะถูกคัดลอกไปยังรูทของไฟล์เก็บถาวร zip
volume_name ( string ) - ชื่อของ DMG ที่ติดตั้งที่แสดงใน Finder เส้นทางไฟล์ที่ติดตั้ง ฯลฯ
zip ( ไม่บังคับ ) - การตั้งค่าที่เกี่ยวข้องกับการสร้างไฟล์เก็บถาวร zip เป็นเอาต์พุต ไฟล์เก็บถาวร zip จะถูกสร้างขึ้นหากระบุไว้เท่านั้น โปรดทราบว่าไฟล์เก็บถาวร ZIP ไม่รองรับการเย็บเล่มซึ่งหมายความว่าไฟล์ภายในไฟล์เก็บถาวร ZIP ที่ได้รับการรับรองจะต้องมีการเชื่อมต่ออินเทอร์เน็ตเพื่อตรวจสอบการใช้งานครั้งแรก
output_path ( string ) - เส้นทางในการสร้างไฟล์เก็บถาวร zip หากเส้นทางนี้มีอยู่แล้วมันจะถูกเขียนทับ ไฟล์ทั้งหมดใน source จะถูกคัดลอกไปยังรูทของไฟล์เก็บถาวร zipโหมด Notarization เท่านั้น:
notarize ( ไม่บังคับ ) - การตั้งค่าสำหรับการรับรองไฟล์ที่สร้างขึ้นแล้ว นี่เป็นทางเลือกในการใช้ตัวเลือก source ตัวเลือกนี้สามารถทำซ้ำเพื่อรับรองหลายไฟล์
path ( string ) - พา ธ ไปยังไฟล์เพื่อรับรอง นี่จะต้องเป็นหนึ่งในประเภทไฟล์ที่รองรับของ Apple สำหรับการรับรอง: DMG, PKG, App หรือ Zip
bundle_id ( string ) - Bundle ID ที่จะใช้สำหรับการรับรองนี้ สิ่งนี้ใช้แทน bundle_id ระดับบนสุด (ซึ่งควบคุมค่าสำหรับการรันที่ใช้แหล่งที่มา)
staple ( bool เป็นทางเลือก ) - ควบคุมหาก stapler staple ควรทำงานหาก Notarization สำเร็จ สิ่งนี้ควรตั้งค่าสำหรับ fileterypes ที่รองรับเท่านั้น (DMG, PKG หรือ APP)
คุณสามารถกำหนด gon เพื่อรับรองไฟล์ที่ลงนามแล้ว สิ่งนี้มีประโยชน์หากคุณกำลังรวม gon เข้ากับไปป์ไลน์บิลด์ที่มีอยู่ซึ่งอาจสนับสนุนการสร้างไฟล์ PKG แอพ ฯลฯ แล้ว
เนื่องจาก Notarization ต้องการน้ำหนักบรรทุกของแพ็คเกจที่จะลงนามด้วยโหมดนี้จะถือว่าคุณได้ออกแบบรหัสเพย์โหลดและแพ็คเกจเอง gon จะไม่ ลงนามในแพ็คเกจของคุณในบล็อก notarize โปรดอย่าสับสนกับสิ่งนี้เมื่อมีการตั้งค่า source มาและ gon เอง สร้าง แพ็คเกจของคุณซึ่งในกรณีนี้มันจะลงนามด้วย
คุณสามารถใช้สิ่งนี้นอกเหนือจากการระบุ source มาเช่นกัน ในกรณีนี้เราจะกำหนดรหัสและแพ็คเกจไฟล์ที่ระบุไว้ใน source มาแล้วรับรองผลลัพธ์เหล่านั้นรวมถึงไฟล์ใน notarize บล็อก
ตัวอย่างใน HCL และจากนั้นการกำหนดค่าที่เหมือนกันใน JSON:
notarize {
path = " /path/to/terraform.pkg "
bundle_id = " com.mitchellh.example.terraform "
staple = true
}
apple_id {
username = " [email protected] "
password = " @env:AC_PASSWORD "
}{
"notarize" : [{
"path" : " /path/to/terraform.pkg " ,
"bundle_id" : " com.mitchellh.example.terraform " ,
"staple" : true
}],
"apple_id" : {
"username" : " [email protected] " ,
"password" : " @env:AC_PASSWORD "
}
} หมายเหตุคุณอาจระบุจำนวนบล็อก notarize เพื่อรับรองไฟล์หลายไฟล์พร้อมกัน
กระบวนการ Notarization ต้องส่งแพ็คเกจของคุณไปยัง Apple และรอให้พวกเขาสแกนพวกเขา Apple ไม่มี SLA สาธารณะเท่าที่ฉันจะบอกได้
ในการพัฒนา gon และการทำงานกับกระบวนการ Notarization ฉันพบว่ากระบวนการนี้เร็วโดยเฉลี่ย (<10 นาที) แต่ในบางกรณีคำขอการรับรองการออกกฎหมายได้รับการจัดคิวเป็นเวลาหนึ่งชั่วโมงหรือมากกว่านั้น
gon จะอัปเดตสถานะเอาท์พุทตามที่มันไปและจะรออย่างไม่มีกำหนดเพื่อให้การรับรองเสร็จสมบูรณ์ หาก gon ถูกขัดจังหวะคุณสามารถตรวจสอบสถานะของคำขอด้วยตัวเองโดยใช้คำขอ UUID ที่เอาต์พุต gon หลังจากการส่ง
gon ถูกสร้างขึ้นเพื่อรองรับการทำงานภายในสภาพแวดล้อมอัตโนมัติเช่นท่อ CI ในสภาพแวดล้อมนี้คุณควรใช้ไฟล์การกำหนดค่า JSON กับ gon และ -log-json Flag เพื่อรับเอาต์พุตการบันทึกที่มีโครงสร้าง
gon เอาท์พุทเอาต์พุตที่มนุษย์อ่านได้เสมอบน stdout (รวมถึงข้อผิดพลาด) และเอาต์พุตบันทึกทั้งหมดบน stderr โดยการระบุ -log-json รายการบันทึกจะถูกจัดโครงสร้างด้วย JSON คุณสามารถประมวลผลสตรีมของ JSON โดยใช้เครื่องมือเช่น jq หรือภาษาสคริปต์ใด ๆ เพื่อแยกข้อมูลที่สำคัญเช่นคำขอ UUID สถานะและอื่น ๆ
เมื่อ gon ทำงานในสภาพแวดล้อมที่ไม่มี TTY เอาท์พุทของมนุษย์จะไม่ถูกระบายสี สิ่งนี้ทำให้เป็นมิตรกับบันทึกเอาต์พุต
ตัวอย่าง:
$ gon -log-level=info -log-json ./config.hcl
...
หมายเหตุคุณต้องระบุ ทั้ง -log-level และ -log-json -log-level Flag เปิดใช้งานการบันทึกโดยทั่วไป ระดับ info เพียงพอในสภาพแวดล้อมอัตโนมัติเพื่อรับข้อมูลทั้งหมดที่คุณต้องการ
ในการวิ่งครั้งแรกอาจได้รับการแจ้งเตือนหลายครั้งสำหรับรหัสผ่าน หากคุณคลิก "อนุญาตเสมอ" คุณจะไม่ได้รับแจ้งอีกครั้ง พรอมต์เหล่านี้มีต้นกำเนิดมาจากซอฟต์แวร์ Apple ที่ gon กำลังประมวลผล subprocessing และไม่ได้มาจาก gon เอง
ขณะนี้ฉันไม่ทราบวิธีการสคริปต์การอนุมัติดังนั้นคำแนะนำเกี่ยวกับเครื่องสร้างคือการเรียกใช้ gon ด้วยตนเองหนึ่งครั้ง หากใครพบวิธีที่จะทำให้สิ่งนี้เป็นไปโดยอัตโนมัติโปรดเปิดปัญหาโปรดแจ้งให้เราทราบและฉันจะอัปเดต readme นี้
Goreleaser เป็นเครื่องมืออัตโนมัติที่ได้รับความนิยมอย่างเต็มรูปแบบสำหรับโครงการที่ใช้ GO GON สามารถใช้กับ Goreleaser เพื่อเพิ่มขั้นตอนการลงนามเพื่อรับรองไบนารีของคุณซึ่งเป็นส่วนหนึ่งของท่อส่งก๊าซ Goreleaser
นี่คือตัวอย่างการกำหนดค่า Goreleaser เพื่อลงนามไบนารีของคุณ:
builds :
- binary : foo
id : foo
goos :
- linux
- windows
goarch :
- amd64
# notice that we need a separated build for the macos binary only:
- binary : foo
id : foo-macos
goos :
- darwin
goarch :
- amd64
signs :
- signature : " ${artifact}.dmg "
ids :
- foo-macos # here we filter the macos only build id
# you'll need to have gon on PATH
cmd : gon
# you can follow the gon docs to properly create the gon.hcl config file:
# https://github.com/mitchellh/gon
args :
- gon.hcl
artifacts : allหากต้องการเรียนรู้เพิ่มเติมดูเอกสารประกอบของ Goreleaser
นอกจากนี้เรายังเปิดเผย API ที่รองรับสำหรับการลงนามบรรจุภัณฑ์และการรับรองไฟล์โดยใช้ภาษาการเขียนโปรแกรม GO โปรดดูเอกสารที่เชื่อมโยงไปสำหรับรายละเอียดเพิ่มเติม
ไลบรารีที่เปิดเผยนั้นมีระดับต่ำกว่าและแยกออกจากป้ายแพ็คเกจการรับรองและขั้นตอนการเย็บเล่ม สิ่งนี้ช่วยให้คุณรวมฟังก์ชั่นนี้เข้ากับเครื่องมือใด ๆ ได้อย่างง่ายดายเทียบกับประสบการณ์ gon -CLI ที่มีความคิดเห็น
คุณน่าจะเปิดใช้งาน Apple 2FA คุณจะต้องสร้างรหัสผ่านแอปพลิเคชันและใช้มันแทนรหัสผ่าน Apple ID ของคุณ
นี่คือบางสิ่งที่ฉันชอบที่จะเห็น แต่ยังไม่ได้ใช้งาน