blob: 2d9db667eced317c713e11b318618998af4f5fea [file] [log] [blame]
Alex Gaynor84d5c6b2014-02-02 10:12:34 -08001Installation
2============
skeuomorfbc26efb2014-01-29 08:31:47 +02003
4You can install ``cryptography`` with ``pip``:
5
6.. code-block:: console
7
8 $ pip install cryptography
9
Alex Stapletonb4684172014-03-15 18:02:13 +000010Supported platforms
11-------------------
12
Paul Kehrer4ee1cb92018-06-27 20:07:14 -070013Currently we test ``cryptography`` on Python 2.7, 3.4+, and
Paul Kehrer6a10b292017-05-27 19:32:26 -050014PyPy 5.3+ on these operating systems.
Alex Stapletonb4684172014-03-15 18:02:13 +000015
Paul Kehrer6a10b292017-05-27 19:32:26 -050016* x86-64 CentOS 7.x
Alex Gaynore6859232017-09-26 20:03:53 -040017* macOS 10.12 Sierra, 10.11 El Capitan
Paul Kehrer6a10b292017-05-27 19:32:26 -050018* x86-64 Ubuntu 14.04, 16.04, and rolling
19* x86-64 Debian Wheezy (7.x), Jessie (8.x), Stretch (9.x), and Sid (unstable)
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050020* x86-64 Alpine (latest)
Paul Kehrerda742982015-10-01 21:10:26 -050021* 32-bit and 64-bit Python on 64-bit Windows Server 2012
Alex Stapletonb4684172014-03-15 18:02:13 +000022
Paul Kehrerfb8dcdb2014-04-20 19:25:18 -050023We test compiling with ``clang`` as well as ``gcc`` and use the following
24OpenSSL releases:
25
Paul Kehrerfb8dcdb2014-04-20 19:25:18 -050026* ``OpenSSL 1.0.1``
Paul Kehrere683dee2014-08-09 08:15:23 -100027* ``OpenSSL 1.0.1e-fips`` (``RHEL/CentOS 7``)
Paul Kehrerda742982015-10-01 21:10:26 -050028* ``OpenSSL 1.0.1f``
29* ``OpenSSL 1.0.2-latest``
Alex Gaynor7a158272016-12-18 16:49:47 -050030* ``OpenSSL 1.1.0-latest``
Paul Kehrer71279722018-08-29 21:29:37 -040031* ``OpenSSL 1.1.1-latest``
Paul Kehrerfb8dcdb2014-04-20 19:25:18 -050032
Alex Gaynor5a54f1a2018-08-31 10:46:20 -040033.. warning::
34 Cryptography 2.4 has deprecated support for OpenSSL 1.0.1.
35
36
Nick Badger63bbf182016-09-03 10:10:36 -070037Building cryptography on Windows
38--------------------------------
Alex Gaynor84d5c6b2014-02-02 10:12:34 -080039
Paul Kehrer156360a2014-06-30 12:14:01 -060040The wheel package on Windows is a statically linked build (as of 0.5) so all
Nick Badger63bbf182016-09-03 10:10:36 -070041dependencies are included. To install ``cryptography``, you will typically
42just run
Paul Kehrer156360a2014-06-30 12:14:01 -060043
44.. code-block:: console
45
46 $ pip install cryptography
47
48If you prefer to compile it yourself you'll need to have OpenSSL installed.
Paul Kehrer6608b7e2015-07-24 21:52:17 +010049You can compile OpenSSL yourself as well or use the binaries we build for our
Paul Kehrer937aa472015-10-11 12:09:27 -050050release infrastructure (`openssl-release`_). Be sure to download the proper
Paul Kehrer4cf6e782017-10-12 06:06:01 +080051version for your architecture and Python (2010 works for Python 2.7, 3.3,
Paul Kehrerf19fef12017-02-09 13:53:44 +080052and 3.4 while 2015 is required for 3.5 and above). Wherever you place your copy
Paul Kehrer6608b7e2015-07-24 21:52:17 +010053of OpenSSL you'll need to set the ``LIB`` and ``INCLUDE`` environment variables
54to include the proper locations. For example:
skeuomorfbc26efb2014-01-29 08:31:47 +020055
skeuomorfb0293bf2014-01-29 21:41:02 +020056.. code-block:: console
57
58 C:\> \path\to\vcvarsall.bat x86_amd64
Paul Kehrer6608b7e2015-07-24 21:52:17 +010059 C:\> set LIB=C:\OpenSSL-win64\lib;%LIB%
60 C:\> set INCLUDE=C:\OpenSSL-win64\include;%INCLUDE%
Paul Kehrer2a39f7f2014-07-02 22:56:01 -050061 C:\> pip install cryptography
62
Paul Kehrerf19fef12017-02-09 13:53:44 +080063As of OpenSSL 1.1.0 the library names have changed from ``libeay32`` and
64``ssleay32`` to ``libcrypto`` and ``libssl`` (matching their names on all other
Paul Kehreradeaacf2017-05-24 12:49:18 -070065platforms). ``cryptography`` links against the new 1.1.0 names by default. If
66you need to compile ``cryptography`` against an older version then you **must**
67set ``CRYPTOGRAPHY_WINDOWS_LINK_LEGACY_OPENSSL`` or else installation will fail.
Paul Kehrerf19fef12017-02-09 13:53:44 +080068
Paul Kehrerd4ea53b2015-12-31 19:48:32 -060069If you need to rebuild ``cryptography`` for any reason be sure to clear the
70local `wheel cache`_.
skeuomorfbc26efb2014-01-29 08:31:47 +020071
Cory Benfield6d447282015-10-07 14:50:50 +010072.. _build-on-linux:
73
Chris Glass2e15c7f2014-02-13 19:10:10 +010074Building cryptography on Linux
75------------------------------
Chris Glass87c4edb2014-02-13 09:34:21 +010076
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050077``cryptography`` ships a ``manylinux1`` wheel (as of 2.0) so all dependencies
78are included. For users on pip 8.1 or above running on a ``manylinux1``
79compatible distribution (almost everything except Alpine) all you should
80need to do is:
Chris Glass87c4edb2014-02-13 09:34:21 +010081
82.. code-block:: console
83
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050084 $ pip install cryptography
Chris Glass87c4edb2014-02-13 09:34:21 +010085
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050086If you are on Alpine or just want to compile it yourself then
87``cryptography`` requires a compiler, headers for Python (if you're not
88using ``pypy``), and headers for the OpenSSL and ``libffi`` libraries
89available on your system.
90
91Alpine
92~~~~~~
93
94Replace ``python3-dev`` with ``python-dev`` if you're using Python 2.
95
96.. code-block:: console
97
98 $ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev
99
100If you get an error with ``openssl-dev`` you may have to use ``libressl-dev``.
101
102Debian/Ubuntu
103~~~~~~~~~~~~~
104
105Replace ``python3-dev`` with ``python-dev`` if you're using Python 2.
106
107.. code-block:: console
108
109 $ sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
110
111RHEL/CentOS
112~~~~~~~~~~~
Ayrxa674c6b2014-02-15 21:24:23 +0800113
114.. code-block:: console
115
Alex Gaynord58c6ad2017-07-14 08:04:18 -0400116 $ sudo yum install redhat-rpm-config gcc libffi-devel python-devel \
117 openssl-devel
Ayrxa674c6b2014-02-15 21:24:23 +0800118
Paul Kehrer1eeaabb2017-07-01 17:34:36 -0500119
120Building
121~~~~~~~~
122
123You should now be able to build and install cryptography. To avoid getting
124the pre-built wheel on ``manylinux1`` distributions you'll need to use
125``--no-binary``.
Chris Glass87c4edb2014-02-13 09:34:21 +0100126
127.. code-block:: console
128
Paul Kehrer1eeaabb2017-07-01 17:34:36 -0500129 $ pip install cryptography --no-binary cryptography
Chris Glass87c4edb2014-02-13 09:34:21 +0100130
Alex Gaynoreb50a2c2014-05-02 09:38:33 -0700131
Chris Glass2e15c7f2014-02-13 19:10:10 +0100132Using your own OpenSSL on Linux
133~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
skeuomorfbc26efb2014-01-29 08:31:47 +0200134
135Python links to OpenSSL for its own purposes and this can sometimes cause
136problems when you wish to use a different version of OpenSSL with cryptography.
137If you want to use cryptography with your own build of OpenSSL you will need to
138make sure that the build is configured correctly so that your version of
139OpenSSL doesn't conflict with Python's.
140
141The options you need to add allow the linker to identify every symbol correctly
142even when multiple versions of the library are linked into the same program. If
143you are using your distribution's source packages these will probably be
144patched in for you already, otherwise you'll need to use options something like
145this when configuring OpenSSL:
146
147.. code-block:: console
148
149 $ ./config -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions -fPIC shared
150
151You'll also need to generate your own ``openssl.ld`` file. For example::
152
Alex Gaynor46c0c622017-03-22 22:56:26 -0400153 OPENSSL_1.1.0E_CUSTOM {
skeuomorfbc26efb2014-01-29 08:31:47 +0200154 global:
155 *;
156 };
157
158You should replace the version string on the first line as appropriate for your
159build.
160
Cory Benfield6d447282015-10-07 14:50:50 +0100161Static Wheels
162~~~~~~~~~~~~~
163
Paul Kehrerf92f2d42017-07-04 16:00:08 -0500164Cryptography ships statically-linked wheels for macOS, Windows, and Linux (via
165``manylinux1``). This allows compatible environments to use the most recent
166OpenSSL, regardless of what is shipped by default on those platforms. Some
167Linux distributions (most notably Alpine) are not ``manylinux1`` compatible so
168we cannot distribute wheels for them.
Cory Benfield6d447282015-10-07 14:50:50 +0100169
170However, you can build your own statically-linked wheels that will work on your
171own systems. This will allow you to continue to use relatively old Linux
172distributions (such as LTS releases), while making sure you have the most
173recent OpenSSL available to your Python programs.
174
175To do so, you should find yourself a machine that is as similar as possible to
176your target environment (e.g. your production environment): for example, spin
177up a new cloud server running your target Linux distribution. On this machine,
178install the Cryptography dependencies as mentioned in :ref:`build-on-linux`.
179Please also make sure you have `virtualenv`_ installed: this should be
180available from your system package manager.
181
Cory Benfield80781842015-10-07 15:07:57 +0100182Then, paste the following into a shell script. You'll need to populate the
183``OPENSSL_VERSION`` variable. To do that, visit `openssl.org`_ and find the
184latest non-FIPS release version number, then set the string appropriately. For
Alex Gaynor46c0c622017-03-22 22:56:26 -0400185example, for OpenSSL 1.0.2k, use ``OPENSSL_VERSION="1.0.2k"``.
Cory Benfield6d447282015-10-07 14:50:50 +0100186
187When this shell script is complete, you'll find a collection of wheel files in
188a directory called ``wheelhouse``. These wheels can be installed by a
189sufficiently-recent version of ``pip``. The Cryptography wheel in this
190directory contains a statically-linked OpenSSL binding, which ensures that you
191have access to the most-recent OpenSSL releases without corrupting your system
192dependencies.
193
194.. code-block:: console
195
196 set -e
197
Cory Benfield80781842015-10-07 15:07:57 +0100198 OPENSSL_VERSION="VERSIONGOESHERE"
Cory Benfield6d447282015-10-07 14:50:50 +0100199 CWD=$(pwd)
200
201 virtualenv env
202 . env/bin/activate
203 pip install -U setuptools
204 pip install -U wheel pip
Matt Thomasa187c972016-10-03 17:48:31 -0400205 curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
Cory Benfield6d447282015-10-07 14:50:50 +0100206 tar xvf openssl-${OPENSSL_VERSION}.tar.gz
207 cd openssl-${OPENSSL_VERSION}
Alex Gaynor46c0c622017-03-22 22:56:26 -0400208 ./config no-shared no-ssl2 no-ssl3 -fPIC --prefix=${CWD}/openssl
Cory Benfield6d447282015-10-07 14:50:50 +0100209 make && make install
210 cd ..
Justin Holmesdd051822018-04-30 19:22:43 -0700211 CFLAGS="-I${CWD}/openssl/include" LDFLAGS="-L${CWD}/openssl/lib" pip wheel --no-binary :all: cryptography
Cory Benfield6d447282015-10-07 14:50:50 +0100212
Paul Kehrer524e7452017-03-09 19:18:24 -0400213Building cryptography on macOS
214------------------------------
Paul Kehrer451c8df2015-07-04 11:03:27 -0500215
Paul Kehrera17d5902016-03-20 22:29:17 -0400216.. note::
217
218 If installation gives a ``fatal error: 'openssl/aes.h' file not found``
219 see the :doc:`FAQ </faq>` for information about how to fix this issue.
220
Paul Kehrer524e7452017-03-09 19:18:24 -0400221The wheel package on macOS is a statically linked build (as of 1.0.1) so for
Paul Kehrera17d5902016-03-20 22:29:17 -0400222users with pip 8 or above you only need one step:
Paul Kehrer451c8df2015-07-04 11:03:27 -0500223
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500224.. code-block:: console
skeuomorfbc26efb2014-01-29 08:31:47 +0200225
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500226 $ pip install cryptography
227
Paul Kehrer524e7452017-03-09 19:18:24 -0400228If you want to build cryptography yourself or are on an older macOS version,
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500229cryptography requires the presence of a C compiler, development headers, and
Paul Kehrer524e7452017-03-09 19:18:24 -0400230the proper libraries. On macOS much of this is provided by Apple's Xcode
231development tools. To install the Xcode command line tools (on macOS 10.9+)
Paul Kehrerb29f4642015-12-31 23:27:25 -0600232open a terminal window and run:
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500233
234.. code-block:: console
235
236 $ xcode-select --install
237
238This will install a compiler (clang) along with (most of) the required
239development headers.
240
241You'll also need OpenSSL, which you can obtain from `Homebrew`_ or `MacPorts`_.
Paul Kehrer355174a2015-12-22 09:47:26 -0600242Cryptography does **not** support Apple's deprecated OpenSSL distribution.
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500243
244To build cryptography and dynamically link it:
Ayrx1ced5b82014-04-08 19:41:26 +0800245
246`Homebrew`_
skeuomorfbc26efb2014-01-29 08:31:47 +0200247
248.. code-block:: console
249
Paul Kehrer524e7452017-03-09 19:18:24 -0400250 $ brew install openssl@1.1
251 $ env LDFLAGS="-L$(brew --prefix openssl@1.1)/lib" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography
skeuomorfbc26efb2014-01-29 08:31:47 +0200252
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500253`MacPorts`_:
Kimmo Parviainen-Jalankoe01e0bf2014-03-19 18:57:09 +0200254
255.. code-block:: console
256
257 $ sudo port install openssl
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500258 $ env LDFLAGS="-L/opt/local/lib" CFLAGS="-I/opt/local/include" pip install cryptography
259
260You can also build cryptography statically:
261
262`Homebrew`_
263
264.. code-block:: console
265
Paul Kehrer524e7452017-03-09 19:18:24 -0400266 $ brew install openssl@1.1
Paul Kehreradeaacf2017-05-24 12:49:18 -0700267 $ env CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS=1 LDFLAGS="$(brew --prefix openssl@1.1)/lib/libssl.a $(brew --prefix openssl@1.1)/lib/libcrypto.a" CFLAGS="-I$(brew --prefix openssl@1.1)/include" pip install cryptography
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500268
269`MacPorts`_:
270
271.. code-block:: console
272
273 $ sudo port install openssl
Paul Kehreradeaacf2017-05-24 12:49:18 -0700274 $ env CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS=1 LDFLAGS="/opt/local/lib/libssl.a /opt/local/lib/libcrypto.a" CFLAGS="-I/opt/local/include" pip install cryptography
skeuomorfbc26efb2014-01-29 08:31:47 +0200275
Paul Kehrerd4ea53b2015-12-31 19:48:32 -0600276If you need to rebuild ``cryptography`` for any reason be sure to clear the
277local `wheel cache`_.
278
Alex Gaynoreb50a2c2014-05-02 09:38:33 -0700279
Alex Gaynor5ad6df92017-02-18 12:52:50 -0500280.. _`Homebrew`: https://brew.sh
Alex Gaynor3197ab52015-10-02 06:33:11 -0700281.. _`MacPorts`: https://www.macports.org
Paul Kehrer5a284e62017-05-29 17:09:23 -0500282.. _`openssl-release`: https://ci.cryptography.io/job/cryptography-support-jobs/job/openssl-release-1.1/
Cory Benfieldba8f6382015-10-07 15:07:47 +0100283.. _virtualenv: https://virtualenv.pypa.io/en/latest/
Alex Gaynor769d5c62016-11-06 04:30:36 -0500284.. _openssl.org: https://www.openssl.org/source/
Paul Kehrerd4ea53b2015-12-31 19:48:32 -0600285.. _`wheel cache`: https://pip.pypa.io/en/stable/reference/pip_install/#caching