gnurl (libgnurl)

motivation rename using gotchas source downloads building reporting maintainer

libgnurl 是 libcurl 的微分支。libgnurl 的目標是通過單個加密後端 (GnuTLS) 以唯一支持 HTTP 和 HTTPS(並且僅支持 HTTP 1.x),用以確保無論 libcurl 是如何被編譯的,開發人員都有相同的體驗與低耗能。

我們的程式碼主要用於 GNUnet 和 Taler,但考慮到對其他人可能也有幫助,我們決定將程式碼公之於眾。

libgnurl 與 libcurl 由相同的許可證所發行。由於您必須提供正確的選項來進行配置以獲取正確的 libgnurl 建構,請閱讀 README 以了解更多的相關指令。

關於 gnurl

以下六個段落的大部分內容陳舊,需重新撰寫。

動機

cURL 支持許多加密後端。GNUnet 需要使用 GnuTLS,但某些發行版本使用其他變形。支持其他加密後端將再次使我們面臨更廣泛的安全問題,這可能會產生許可問題,最嚴重的是,已知某些加密後端會引入不易察覺的執行時期問題 (runtime issues) 而帶來新的錯誤。雖然可以在同一個系統上安裝兩個版本的 libcurl,但這很容易出錯,尤其是當我們鏈接到錯誤的版本時,出現的錯誤可能十分不易察覺。

對於 GNUnet,我們還需要一個特定現代版本的 GnuTLS 。因此,無論如何都需要為 GNUnet 再次編譯 cURL。但是,如果將 cURL 鏈接到此版本的 GnuTLS 會發生什麼事?首先,GnuTLS 需要被手動安裝在系統中。接著,我們需要構建 cURL。cURL 會順利地構建,但鏈接器最終會"抱怨"。鏈接器會"抱怨"是因為 cURL 還鏈接了許多其他系統庫 (gssapi, ldap, ssh2, rtmp, krb5, sasl2, 請參閱上方關於 obscure protocols 的討論)。由於這些系統庫是分發的一部分,他們與舊版的GnuTLS 有鏈接。因此,同一個二進製文件將鏈接到兩個不同版本的 GnuTLS。這通常是災難的"秘訣"。因此,為了避免更新十幾個系統庫(並安裝兩個版本),禁用 GNUnet 不使用的(為數眾多的)所有 cURL 功能是有必要的。對於 GNUnet 來說,cURL 支持的更隱晦的協議接近死代碼——大多是無害的,但也沒有用。然而,由於某些應用程序可能會使用其中一項功能,分發版通常會被迫啟用所有這些功能,從而包括可能由該代碼引起的安全問題。

因此,要使用現代版本的 GnuTLS,一個明智的方法是禁用 cURL 的所有"可選 (optional)"功能,這些功能將鏈接部份連接到舊的 GnuTLS 程式庫中。這是可以運行的,但是使用者"永遠"不應該在 /usr 或 /usr/local 中安裝那個版本的 libcurl,因為這可能會破壞系統的其他部分,而這些部分可能依賴於我們剛剛禁用的功能。Libtool版本控制在這裡沒有幫助,因為 Libtool 版本控制的原意並非處理具有可選功能的程式庫。理所當然地,在其他地方安裝 cURL 也會造成問題,因為我們現在必須非常小心,鏈接器會將 GNUnet 部份連接到正確的版本。請注意,cURL 開發人員無法輕鬆地解決這些問題。

重命名以修復

How does forking fix it? Easy. First, we can get rid of all of the compatibility issues --- if you use libgnurl, you state that you don't need anything but HTTP/HTTPS. Those applications that need more, should stick with the original cURL. Those that do not, can choose to move to something simpler. As the library gets a new name, we do not have to worry about tons of packages breaking as soon as one rebuilds it. So renaming itself and saying that "libgnurl = libcurl with only HTTP/HTTPS support and GnuTLS" fixes 99%% of the problems that darkened my mood. Note that this pretty much CANNOT be done without a fork, as renaming is an essential part of the fix. Now, there might be creative solutions to achieve the same thing within the standard cURL build system, but this was deemed to be too much work when gnurl was originally started. The changes libgnurl makes to curl are miniscule and can easily be applied again and again whenever libcurl makes a new release.

使用 libgnurl

僅將 cURL 用於 HTTP/HTTPS 並且可以與 GnuTLS 一起使用的專案應該能夠通過將"-lcurl"更改為"-lgnurl"來切換到 libgnurl。就是這樣。不需要更改原始碼,因為 libgnurl 力求與 cURL 的 HTTP/HTTPS/GnuTLS 子集錯誤對錯誤相容 (bug-for-bug compatibility)。如果有人提議,我們可能會添加與此核心子集相關的新功能,但到目前為止,我們將更改保持在最低限度,並且沒有添加新功能到原始的 curl source 中。

陷阱 (Gotchas)

libgnurl 和 gnurl 的原意並非作為用戶 curl 的替代品:
這並不意味著我們對使用gnurl完成的工作沒有信心,而是意味著我們期望 curl 或 libcurl 的工具不會使用不同的命名二進製文件和程式庫。如果您知道自己在做什麼,您應該能夠使用gnurl作為您工具的一部分來代替curl。但是,我們不建議這樣做,因為到目前為止,已經測試過的唯一用法是將其作為 Taler 和 GNunet 構建系統的一部分。
由於檔案名稱中沒有發生衝突,您不需要刪除 curl 來使用 gnurl,反之亦然。

原始碼

您可以使用以下命令獲取 gnurl git 儲存庫:

  • git clone https://git.taler.net/gnurl.git
  • git clone git://git.taler.net/gnurl.git

這些版本以(簽字的)git標籤登記。

下載

版本發佈於ftpmirror.gnu.org/gnu/gnunet。您則可以從各種發行版和軟體套件管理系統 (package managers) 中取得 gnurl 。一些包含 gnurl 的軟體套件管理系統包括:GNU Guix(available as "gnurl")、 Gentoo通過 ebuild collection 協作的youbroketheinternetNix、以及 www/gnurl 中的 pkgsrc

建立 gnurl

我們建議您密切關注發佈公告,因為公告內容可能會指出 gnurl 的構建方式發生了變化。
如果您的軟體套件管理系統提供二進制構建或構建指令來從原始碼自動構建 gnurl 並與您的環境相整合,我們強烈建議您使用此二進制構建。
有兩種方法可以構建 gnurl。第一種方法為從最新的 git 標籤 (git tag) 構建,第二種方法則是使用分佈式 tarball (distributed tarball)。分配器 (Distributors ) 通常應該要從 tarball 構建,但我們在此會對兩種方法做描述。這兩種方法都是在考慮到 NetBSD 9 用戶空間的情況下編寫的,請根據需要替換適當的工具。
您應該避免從默認 git 分支(default git branch) 的尖端構建 gnurl,因為只有標籤 (tags) 被認為是穩定的、已批准的構建。

從分佈式 tarballr 建立(首選方法)

如果您想要驗證簽名,請安裝與 OpenPGP 兼容的工具,例如 security/gnupgp2 (並進行設置)。假設您使用 pkgin:

  • pkgin update
  • pkgin install gnupg2

從中獲取簽名密鑰 keys.openpgp.org 或通過 gnupg2 命令行。

獲取版本、簽名,校驗和文件及其簽名:

  • ftp https://ftpmirror.gnu.org/gnu/gnunet/gnurl-7.65.3.tar.Z
  • ftp https://ftpmirror.gnu.org/gnu/gnunet/gnurl-7.65.3.tar.Z.sig
  • ftp https://ftpmirror.gnu.org/gnu.org/gnunet/gnurl-7.65.3.sum.txt
  • ftp https://ftpmirror.gnu.org/gnu.org/gnunet/gnurl-7.65.3.sum.txt.sig

驗證簽名,並針對 .sum.txt 文件中的校驗和進行校驗和認證。

打開壓縮包:

  • tar -zxf gnurl-7.65.3.tar.Z

切換到目錄

  • cd gnurl-7.65.3

現在您可以運行

  • ./configure

直接地(並在進行之前閱讀 configure-gnurl)或調用

  • ./configure-gnurl

並傳遞其他參數,例如自定義的 PREFIX 位置。更多參考為 www/gnurl Makefile. 現在運行

  • make
  • make check (此為非強制的)
  • make install

您已完成。

從標記的 git commit 中建構

請按照上述步驟操作,複製您想要從此建構的 git 標籤,而非下載 tarball。

回報錯誤

您可以透過我們的錯誤追踪器報告錯誤:bugs.gnunet.org。或是您也可以使用我們的報錯寄件名單,但我們較偏好您使用錯誤追踪器來舉報錯誤。

維護者和密碼簽名

gnurl/libgnurl 正在尋找新的維護者。版本 7.69.1 至版本 7.72.0 為 OpenPGP Key 所簽署0xD6B570842F7E7F8D(keys.openpgp.org),其所使用的密鑰指紋為 6115 012D EA30 26F6 2A98 A556 D6B5 7084 2F7E 7F8D