我發現了疫苗數位證明系統的 Bug

吳東曄 Wu, Dung-Ie
9 min readJan 19, 2022

--

為什麼高端疫苗的數位證明加不進手機錢包裡面?😭(1/28 後可以了!)

先說結論:

我認為台灣疾管署數位新冠病毒健康證明中的疫苗接種數位證明系統在簽發高端新冠病毒疫苗 MVC-COV1901 的接種證明 QR code 時,使用了錯誤的 payload 導致市面上許多提供使用者將數位證明加入手機錢包(Wallet)的服務無法讀取高端疫苗的證明 QR code。

後續追蹤:
2022/01/20 11:45 在 g0v.tw Slack#vaccine 頻道中 au 回應已經回報同仁
2022/01/20 11:51 同樣是 #vaccine 頻道中 ronnywang 回應已經詢問衛服部資訊處並得到未來會調整的正面回應(Slack archive)
2022/01/27 16:22 在 #vaccine 頻道中 au 回應衛福部已發布新聞稿預告 1/28 上午後可重新申請高端疫苗數位證明(Slack archive)
2022/01/27 17:16 中央社報導〈高端疫苗護照重製與國際接軌 國內使用不影響〉自由健康網報導〈歐盟接受高端疫苗申請 衛福部:已有疫苗護照者明起可重下載〉
2022/01/27 23:25 實測發現重新申請疫苗數位證明後已經可以順利使用文內所述相關網站系統

CDC 簽發的高端疫苗數位證明 QR code 在許多網站無法讀取

緣起

台灣疾管署在 2021/12/28 上午推出了「數位新冠病毒健康證明」,提供在國內施打疫苗的民眾申請符合歐盟 EU Digital COVID Certificate 規格的數位證明。歐盟地區已有許多網站提供掃描各國簽發的數位證明 QR code 將副本存入手機錢包 App 中的服務,舉例包括 https://www.getcovidpass.eu/?lang=zhhttps://covid19passbook.netlify.app/https://covidpass.marvinsextro.de/https://covidpass.eu/en 等。

然而當我想要將我施打過高端新冠病毒疫苗 MVC-COV1901 的接種證明存入手機時,使用以上這些網站幾乎都會出現如頁首圖中的錯誤,或是在疫苗廠牌的欄位只出現一個「?」,令人十分困惑。

getcovidpass 產生的證書中疫苗廠牌顯示為問號

最初的想法

最一開始拿到顯示為?的疫苗證明時,只覺得或許因為高端疫苗較新推出,因此各網站資料中可能沒有高端疫苗相關的條目,並未太過在意。直到稍早接種了第三劑疫苗,並且距離疫苗證明推出也過了數週,我再次嘗試申請疫苗證明並加入手機,仍然有一樣的問題,我便開始尋找原因。

順著資料未更新的想法,我這次先以開放原始碼的 https://covid19passbook.netlify.app/ (https://github.com/clawfire/covid19-passbook-generator/) 這個網站開始調查,發現原始碼中 src/valuesets 內有許多疫苗廠商及疫苗產品列表的檔案,深入調查後發現有另一個 repository https://github.com/ehn-dcc-development/ehn-dcc-valuesets 在遵循歐盟發布的文件更新相關檔案,因此發出了相關的 issuepull request ,期望能在更新資料之後順利讀取高端疫苗的證明。

好像沒有這麼簡單

前述的 issue 很快得到專案作者的回應,他表示專案 repository 內的資料只是作為無法取得歐盟官方最新資料時的備援,因此應該不會發生我心中原先所設想的錯誤。

取得這個新線索後,接下來的想法是:或許證書本身內容就有問題?

然而如果將疫苗證明的 QR code 使用普通的掃描器解讀,只會得出一串編碼後的文字 payload,而無法直接以肉眼讀出有意義的訊息,短時間內也還找不到這種編碼的技術規格以自行解碼,似乎沒辦法簡單取得疫苗證明內文。

好像沒有這麼難

既然沒辦法快速自己實作出 QR code payload 解碼程式,那就直接用現成的吧!還好前面有先發現到開放原始碼的 https://github.com/clawfire/covid19-passbook-generator/ 專案,直接把這個專案在我的電腦上執行起來就有一個現成的疫苗證明解碼網站了!

簡單調查之後發現解碼的程式位於 src/index.js 中的 decode() 這個 function 中,而從 583 行開始則是疫苗證明的處理流程,在這裡就可以直接簡單的取得掃描後的 QR code 解碼結果,結果中可以發現 mamp 兩個 value 分別代表疫苗的廠商名稱及產品名稱,而高端疫苗所產生的內容是:

{
"ma": "Medigen-Vaccine-Biologics-Corp",
"mp": "MVC-COVID-19-Vaccine",
...
}

此時再去 https://github.com/ehn-dcc-development/ehn-dcc-valuesets 確認所有的廠商及產品列表可以發現,在 vaccine-mah-manf.json 裡面高端公司的 key 是 ORG-100033914 而非 Medigen-Vaccine-Biologics-Corp

"ORG-100033914": {
"display": "Medigen Vaccine Biologics Corporation",
"lang": "en",
"active": true,
"system": "https://spor.ema.europa.eu/v1/organisations",
"version": ""
}

以及在 vaccine-medicinal-product.json 裡面高端疫苗的 key 是 MVC-COV1901 而非 MVC-COVID-19-Vaccine

"MVC-COV1901": {
"display": "MVC COVID-19 vaccine",
"lang": "en",
"active": true,
"system": "http://ec.europa.eu/temp/vaccineproductname",
"version": "1.6"
},

這兩個代號在歐盟的相關指引中也能看到的確是如上所述,至此我已經幾乎確認問題來自於我國疾管署所發行的疫苗證明使用了錯誤的 QR code payload。

但為了更加確定我的猜想,我向接種莫德納(Moderna)新冠疫苗的友人詢問是否可以提供他的 QR code 讓我檢查,得到的解碼後內容是:

{
"ma": "ORG-100031184",
"mp": "EU/1/20/1507",
...
}

兩者皆符合 vaccine-mah-manf.jsonvaccine-medicinal-product.json 中莫德納相關條目的代碼,有極高機率可以確定就是高端疫苗的數位證明使用了錯誤的 payload 產生 QR code 因此造成使用歐盟資料集的服務無法讀取。

再研究一點

當然也是有一種可能是我國數位新冠病毒健康證明推出時,歐盟仍未將高端相關代碼建入資料庫中,因此疾管署開發系統時無法使用最後真正的代碼開發。

但查詢高端公司和高端疫苗相關代號其實在 2021/12/02 推出的 eHN value set v1.6 版本就已經確認,距離我國正式推出的 12/28 仍有相當時間可以開發,應該有足夠充裕的時間確認後再推出。

接下來該做什麼

由於研究完畢已是深夜,未能有方法聯繫疾管署相關人員直接回報問題,因此先將研究過程及心得以此文紀錄,待隔日上班時間再尋求管道回報此問題,希望能盡快讓疾管署修復高端疫苗證明相關 QR code,讓施打高端疫苗的國人亦能方便地將數位證明儲存於手機內。

更新紀錄

2022/01/20 00:30 產生數位疫苗證明確認無法於各網站讀取
2022/01/20 02:01 此文草稿完成
2022/01/20 13:32 更新 g0v.tw Slack #vaccine 頻道中得到的回應
2022/01/27 16:27 更新衛福部發布修正新聞稿
2022/01/27 23:25 更新修正後實測結果

參考資料

  1. 撰文時可以讀取高端疫苗證明但會顯示問號的網站 https://www.getcovidpass.eu/?lang=zh
  2. 撰文時無法讀取高端疫苗證明的開源網站專案 https://github.com/clawfire/covid19-passbook-generator
  3. 歐盟數位新冠證明官方網站 https://ec.europa.eu/info/live-work-travel-eu/coronavirus-response/safe-covid-19-vaccines-europeans/eu-digital-covid-certificate_en
  4. 歐盟數位新冠證明資料集 repository https://github.com/ehn-dcc-development/ehn-dcc-valuesets
  5. 我國數位新冠病毒健康證明官方介紹網站 https://covid19.mohw.gov.tw/ch/np-5345-205.html
  6. 我國數位新冠病毒健康證明申請系統網站 https://dvc.mohw.gov.tw/
  7. 我國疾管署新聞稿 https://www.cdc.gov.tw/Bulletin/Detail/-rE5uMCRLrzdP16Sf7m5UA?typeid=9

--

--