| Date: February 11, 2007 |
| Author: Daniel Stenberg <daniel@haxx.se> |
| URL: http://curl.haxx.se/legal/distro-dilemma.html |
| |
| Condition |
| |
| This document is written to describe the situation as it is right now. |
| libcurl 7.16.1 is currently the latest version available. Things may of |
| course change in the future. |
| |
| This document reflects my view and understanding of these things. Please tell |
| me where and how you think I'm wrong, and I'll try to correct my mistakes. |
| |
| Background |
| |
| The Free Software Foundation has deemed the Original BSD license[1] to be |
| "incompatible"[2] with GPL[3]. I'd rather say it is the other way around, but |
| the point is the same: if you distribute a binary version of a GPL program, |
| it MUST NOT be linked with any Original BSD-licensed parts or libraries. |
| Doing so will violate the GPL license. For a long time, very many GPL |
| licensed programs have avoided this license mess by adding an exception[8] to |
| their license. And many others have just closed their eyes for this problem. |
| |
| libcurl is MIT-style[4] licensed - how on earth did this dilemma fall onto |
| our plates? |
| |
| libcurl is only a little library. libcurl can be built to use OpenSSL for its |
| SSL/TLS capabilities. OpenSSL is basically Original BSD licensed[5]. |
| |
| If libcurl built to use OpenSSL is used by a GPL-licensed application and you |
| decide to distribute a binary version of it (Linux distros - for example - |
| tend to), you have a clash. GPL vs Original BSD. |
| |
| This dilemma is not libcurl-specific nor is it specific to any particular |
| Linux distro. (This article mentions and refers to Debian several times, but |
| only because Debian seems to be the only Linux distro to have faced this |
| issue yet since no other distro is shipping libcurl built with two SSL |
| libraries.) |
| |
| Part of the Operating System |
| |
| This would not be a problem if the used lib would be considered part of the |
| underlying operating system, as then the GPL license has an exception |
| clause[6] that allows applications to use such libs without having to be |
| allowed to distribute it or its sources. Possibly some distros will claim |
| that OpenSSL is part of their operating system. |
| |
| Debian does however not take this stance and has officially(?) claimed that |
| OpenSSL is not a required part of the Debian operating system |
| |
| Some people claim that this paragraph cannot be exploited this way by a Linux |
| distro, but I am not a lawyer and that is a discussion left outside of this |
| document. |
| |
| GnuTLS |
| |
| Since May 2005 libcurl can get built to use GnuTLS instead of OpenSSL. GnuTLS |
| is an LGPL[7] licensed library that offers a matching set of features as |
| OpenSSL does. Now, you can build and distribute an TLS/SSL capable libcurl |
| without including any Original BSD licensed code. |
| |
| I believe Debian is the first (only?) distro that provides libcurl/GnutTLS |
| packages. |
| |
| yassl |
| |
| libcurl can get also get built to use yassl for the TLS/SSL layer. yassl is a |
| GPL[3] licensed library. |
| |
| |
| GnuTLS vs OpenSSL vs yassl |
| |
| While these three libraries offer similar features, they are not equal. |
| libcurl does not (yet) offer a standardized stable ABI if you decide to |
| switch from using libcurl-openssl to libcurl-gnutls or vice versa. The GnuTLS |
| and yassl support is very recent in libcurl and it has not been tested nor |
| used very extensively, while the OpenSSL equivalent code has been used and |
| thus matured since 1999. |
| |
| GnuTLS |
| - LGPL licensened |
| - supports SRP |
| - lacks SSLv2 support |
| - lacks MD2 support (used by at least some CA certs) |
| - lacks the crypto functions libcurl uses for NTLM |
| |
| OpenSSL |
| - Original BSD licensened |
| - lacks SRP |
| - supports SSLv2 |
| - older and more widely used |
| - provides crypto functions libcurl uses for NTLM |
| - libcurl can do non-blocking connects with it in 7.15.4 and later |
| |
| yassl |
| - GPL licensed |
| - much untested and unproven in the real work by (lib)curl users so we don't |
| know a lot about restrictions or benefits from using this |
| |
| The Better License, Original BSD, GPL or LGPL? |
| |
| It isn't obvious or without debate to any objective interested party that |
| either of these licenses are the "better" or even the "preferred" one in a |
| generic situation. |
| |
| Instead, I think we should accept the fact that the SSL/TLS libraries and |
| their different licenses will fit different applications and their authors |
| differently depending on the applications' licenses and their general usage |
| pattern (considering how GPL and LGPL libraries for example can be burdensome |
| for embedded systems usage). |
| |
| In Debian land, there seems to be a common opinion that LGPL is "maximally |
| compatible" with apps while Original BSD is not. Like this: |
| |
| http://lists.debian.org/debian-devel/2005/09/msg01417.html |
| |
| More SSL Libraries |
| |
| In libcurl, there's no stopping us here. There are more Open Source/Free |
| SSL/TLS libraries out there and we would very much like to support them as |
| well, to offer application authors an even wider scope of choice. |
| |
| Application Angle of this Problem |
| |
| libcurl is built to use one SSL/TLS library. It uses a single fixed name (by |
| default) on the built/created lib file, and applications are built/linked to |
| use that single lib. Replacing one libcurl instance with another one that |
| uses the other SSL/TLS library might break one or more applications (due to |
| ABI differences and/or different feature set). You want your application to |
| use the libcurl it was built for. |
| |
| Project cURL Angle of this Problem |
| |
| We distribute libcurl and everyone may build libcurl with either library at |
| their choice. This problem is not directly a problem of ours. It merely |
| affects users - GPL application authors only - of our lib as it comes |
| included and delivered on some distros. |
| |
| libcurl has different ABI when built with different SSL/TLS libraries due to |
| these reasons: |
| |
| 1. No one has worked on fixing this. The mutex/lock callbacks should be set |
| with a generic libcurl function that should use the proper underlying |
| functions. |
| |
| 2. The CURLOPT_SSL_CTX_FUNCTION option is not possible to "emulate" on GnuTLS |
| but simply requires OpenSSL. |
| |
| 3. There might be some other subtle differences just because nobody has yet |
| tried to make a fixed ABI like this. |
| |
| Distro Angle of this Problem |
| |
| To my knowledge there is only one distro that ships libcurl built with either |
| OpenSSL or GnuTLS. |
| |
| Debian Linux is now (since mid September 2005) providing two different |
| libcurl packages, one for libcurl built with OpenSSL and one built with |
| GnuTLS. They use different .so names and can this both be installed in a |
| single system simultaneously. This has been said to be a transitional system |
| not desired to keep in the long run. |
| |
| Footnotes |
| |
| [1] = http://www.xfree86.org/3.3.6/COPYRIGHT2.html#6 |
| [2] = http://www.fsf.org/licensing/essays/bsd.html |
| [3] = http://www.fsf.org/licensing/licenses/gpl.html |
| [4] = http://curl.haxx.se/docs/copyright.html |
| [5] = http://www.openssl.org/source/license.html |
| [6] = http://www.fsf.org/licensing/licenses/gpl.html end of section 3 |
| [7] = http://www.fsf.org/licensing/licenses/lgpl.html |
| [8] = http://en.wikipedia.org/wiki/OpenSSL_exception |
| |
| Feedback/Updates provided by |
| |
| Eric Cooper |