關於OpenResty中使用lua-resty-jwt出現的一個異常symbol not found

Limpid 發表於 2021-02-26

SkyLothar /lua-resty-jwt 這個包是jwt官方給出的用於jwt校驗功能的包,可能很多人使用時在關於簽名過程中沒有用到以證照的方式簽名和校驗所以沒出現異常情況,不過我最近在用證照RS256的方法校驗出現了異常:

evp.lua:216: dlsym(RTLD_DEFAULT, EVP_MD_CTX_create): symbol not found

最初檢視是否是lua-resty-jwt的依賴出現問題,將lua-resty-hmac的包換成文件中地址提供的最新的,確認環境沒問題,又從下往上逐步找。

因為evp.lua這個檔案多處基本使用ffi方式呼叫環境中的c方法,沒辦法又用c寫了一個類似的小測試用於檢視lua使用的環境類庫是否和純c的一致。

最終查尋是否版本更新中類庫存在差異,最終在stackoverflow一個帖子到靈感,複查本機openssl大版本1.1.0,在官方文件中:EVP_MD_CTX_create() 和 EVP_MD_CTX_destroy() 重新命名為 EVP_MD_CTX_new() 和 EVP_MD_CTX_free() 在 OpenSSL 1.1.0版本
由於包檔案幾年未更新,所以只能手動修改原始碼測試成功。下面附上修改內容:
找到evp.lua這個檔案一般在resty資料夾下,修改前記得留個副本備份,進入evp.lua檔案,將EVP_MD_CTX_create()全部替換為EVP_MD_CTX_new,將EVP_MD_CTX_destroy全部替換為EVP_MD_CTX_free。
因為文件顯示只是名字變動,所以其他暫時不用修改,
最後幾點說明:

  • 如果你未使用證照做簽名校驗暫時不需要修改
  • 如果你的機子openssl版本在1.1.0以下不需要修改
  • 由於 SkyLothar /lua-resty-jwt 這個包很久更新,所以openssl的其他更
    新可能使之不相容,如果你有什麼發現它還有不相容的歡迎留言一起討論
本作品採用《CC 協議》,轉載必須註明作者和本文連結