blob: a4649f51bd42f83d9ffdb81b3851a39b248bc394 [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 Kehrerfb8dcdb2014-04-20 19:25:18 -050031
Nick Badger63bbf182016-09-03 10:10:36 -070032Building cryptography on Windows
33--------------------------------
Alex Gaynor84d5c6b2014-02-02 10:12:34 -080034
Paul Kehrer156360a2014-06-30 12:14:01 -060035The wheel package on Windows is a statically linked build (as of 0.5) so all
Nick Badger63bbf182016-09-03 10:10:36 -070036dependencies are included. To install ``cryptography``, you will typically
37just run
Paul Kehrer156360a2014-06-30 12:14:01 -060038
39.. code-block:: console
40
41 $ pip install cryptography
42
43If you prefer to compile it yourself you'll need to have OpenSSL installed.
Paul Kehrer6608b7e2015-07-24 21:52:17 +010044You can compile OpenSSL yourself as well or use the binaries we build for our
Paul Kehrer937aa472015-10-11 12:09:27 -050045release infrastructure (`openssl-release`_). Be sure to download the proper
Paul Kehrer4cf6e782017-10-12 06:06:01 +080046version for your architecture and Python (2010 works for Python 2.7, 3.3,
Paul Kehrerf19fef12017-02-09 13:53:44 +080047and 3.4 while 2015 is required for 3.5 and above). Wherever you place your copy
Paul Kehrer6608b7e2015-07-24 21:52:17 +010048of OpenSSL you'll need to set the ``LIB`` and ``INCLUDE`` environment variables
49to include the proper locations. For example:
skeuomorfbc26efb2014-01-29 08:31:47 +020050
skeuomorfb0293bf2014-01-29 21:41:02 +020051.. code-block:: console
52
53 C:\> \path\to\vcvarsall.bat x86_amd64
Paul Kehrer6608b7e2015-07-24 21:52:17 +010054 C:\> set LIB=C:\OpenSSL-win64\lib;%LIB%
55 C:\> set INCLUDE=C:\OpenSSL-win64\include;%INCLUDE%
Paul Kehrer2a39f7f2014-07-02 22:56:01 -050056 C:\> pip install cryptography
57
Paul Kehrerf19fef12017-02-09 13:53:44 +080058As of OpenSSL 1.1.0 the library names have changed from ``libeay32`` and
59``ssleay32`` to ``libcrypto`` and ``libssl`` (matching their names on all other
Paul Kehreradeaacf2017-05-24 12:49:18 -070060platforms). ``cryptography`` links against the new 1.1.0 names by default. If
61you need to compile ``cryptography`` against an older version then you **must**
62set ``CRYPTOGRAPHY_WINDOWS_LINK_LEGACY_OPENSSL`` or else installation will fail.
Paul Kehrerf19fef12017-02-09 13:53:44 +080063
Paul Kehrerd4ea53b2015-12-31 19:48:32 -060064If you need to rebuild ``cryptography`` for any reason be sure to clear the
65local `wheel cache`_.
skeuomorfbc26efb2014-01-29 08:31:47 +020066
Cory Benfield6d447282015-10-07 14:50:50 +010067.. _build-on-linux:
68
Chris Glass2e15c7f2014-02-13 19:10:10 +010069Building cryptography on Linux
70------------------------------
Chris Glass87c4edb2014-02-13 09:34:21 +010071
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050072``cryptography`` ships a ``manylinux1`` wheel (as of 2.0) so all dependencies
73are included. For users on pip 8.1 or above running on a ``manylinux1``
74compatible distribution (almost everything except Alpine) all you should
75need to do is:
Chris Glass87c4edb2014-02-13 09:34:21 +010076
77.. code-block:: console
78
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050079 $ pip install cryptography
Chris Glass87c4edb2014-02-13 09:34:21 +010080
Paul Kehrer1eeaabb2017-07-01 17:34:36 -050081If you are on Alpine or just want to compile it yourself then
82``cryptography`` requires a compiler, headers for Python (if you're not
83using ``pypy``), and headers for the OpenSSL and ``libffi`` libraries
84available on your system.
85
86Alpine
87~~~~~~
88
89Replace ``python3-dev`` with ``python-dev`` if you're using Python 2.
90
91.. code-block:: console
92
93 $ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev
94
95If you get an error with ``openssl-dev`` you may have to use ``libressl-dev``.
96
97Debian/Ubuntu
98~~~~~~~~~~~~~
99
100Replace ``python3-dev`` with ``python-dev`` if you're using Python 2.
101
102.. code-block:: console
103
104 $ sudo apt-get install build-essential libssl-dev libffi-dev python3-dev
105
106RHEL/CentOS
107~~~~~~~~~~~
Ayrxa674c6b2014-02-15 21:24:23 +0800108
109.. code-block:: console
110
Alex Gaynord58c6ad2017-07-14 08:04:18 -0400111 $ sudo yum install redhat-rpm-config gcc libffi-devel python-devel \
112 openssl-devel
Ayrxa674c6b2014-02-15 21:24:23 +0800113
Paul Kehrer1eeaabb2017-07-01 17:34:36 -0500114
115Building
116~~~~~~~~
117
118You should now be able to build and install cryptography. To avoid getting
119the pre-built wheel on ``manylinux1`` distributions you'll need to use
120``--no-binary``.
Chris Glass87c4edb2014-02-13 09:34:21 +0100121
122.. code-block:: console
123
Paul Kehrer1eeaabb2017-07-01 17:34:36 -0500124 $ pip install cryptography --no-binary cryptography
Chris Glass87c4edb2014-02-13 09:34:21 +0100125
Alex Gaynoreb50a2c2014-05-02 09:38:33 -0700126
Chris Glass2e15c7f2014-02-13 19:10:10 +0100127Using your own OpenSSL on Linux
128~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
skeuomorfbc26efb2014-01-29 08:31:47 +0200129
130Python links to OpenSSL for its own purposes and this can sometimes cause
131problems when you wish to use a different version of OpenSSL with cryptography.
132If you want to use cryptography with your own build of OpenSSL you will need to
133make sure that the build is configured correctly so that your version of
134OpenSSL doesn't conflict with Python's.
135
136The options you need to add allow the linker to identify every symbol correctly
137even when multiple versions of the library are linked into the same program. If
138you are using your distribution's source packages these will probably be
139patched in for you already, otherwise you'll need to use options something like
140this when configuring OpenSSL:
141
142.. code-block:: console
143
144 $ ./config -Wl,--version-script=openssl.ld -Wl,-Bsymbolic-functions -fPIC shared
145
146You'll also need to generate your own ``openssl.ld`` file. For example::
147
Alex Gaynor46c0c622017-03-22 22:56:26 -0400148 OPENSSL_1.1.0E_CUSTOM {
skeuomorfbc26efb2014-01-29 08:31:47 +0200149 global:
150 *;
151 };
152
153You should replace the version string on the first line as appropriate for your
154build.
155
Cory Benfield6d447282015-10-07 14:50:50 +0100156Static Wheels
157~~~~~~~~~~~~~
158
Paul Kehrerf92f2d42017-07-04 16:00:08 -0500159Cryptography ships statically-linked wheels for macOS, Windows, and Linux (via
160``manylinux1``). This allows compatible environments to use the most recent
161OpenSSL, regardless of what is shipped by default on those platforms. Some
162Linux distributions (most notably Alpine) are not ``manylinux1`` compatible so
163we cannot distribute wheels for them.
Cory Benfield6d447282015-10-07 14:50:50 +0100164
165However, you can build your own statically-linked wheels that will work on your
166own systems. This will allow you to continue to use relatively old Linux
167distributions (such as LTS releases), while making sure you have the most
168recent OpenSSL available to your Python programs.
169
170To do so, you should find yourself a machine that is as similar as possible to
171your target environment (e.g. your production environment): for example, spin
172up a new cloud server running your target Linux distribution. On this machine,
173install the Cryptography dependencies as mentioned in :ref:`build-on-linux`.
174Please also make sure you have `virtualenv`_ installed: this should be
175available from your system package manager.
176
Cory Benfield80781842015-10-07 15:07:57 +0100177Then, paste the following into a shell script. You'll need to populate the
178``OPENSSL_VERSION`` variable. To do that, visit `openssl.org`_ and find the
179latest non-FIPS release version number, then set the string appropriately. For
Alex Gaynor46c0c622017-03-22 22:56:26 -0400180example, for OpenSSL 1.0.2k, use ``OPENSSL_VERSION="1.0.2k"``.
Cory Benfield6d447282015-10-07 14:50:50 +0100181
182When this shell script is complete, you'll find a collection of wheel files in
183a directory called ``wheelhouse``. These wheels can be installed by a
184sufficiently-recent version of ``pip``. The Cryptography wheel in this
185directory contains a statically-linked OpenSSL binding, which ensures that you
186have access to the most-recent OpenSSL releases without corrupting your system
187dependencies.
188
189.. code-block:: console
190
191 set -e
192
Cory Benfield80781842015-10-07 15:07:57 +0100193 OPENSSL_VERSION="VERSIONGOESHERE"
Cory Benfield6d447282015-10-07 14:50:50 +0100194 CWD=$(pwd)
195
196 virtualenv env
197 . env/bin/activate
198 pip install -U setuptools
199 pip install -U wheel pip
Matt Thomasa187c972016-10-03 17:48:31 -0400200 curl -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
Cory Benfield6d447282015-10-07 14:50:50 +0100201 tar xvf openssl-${OPENSSL_VERSION}.tar.gz
202 cd openssl-${OPENSSL_VERSION}
Alex Gaynor46c0c622017-03-22 22:56:26 -0400203 ./config no-shared no-ssl2 no-ssl3 -fPIC --prefix=${CWD}/openssl
Cory Benfield6d447282015-10-07 14:50:50 +0100204 make && make install
205 cd ..
Justin Holmesdd051822018-04-30 19:22:43 -0700206 CFLAGS="-I${CWD}/openssl/include" LDFLAGS="-L${CWD}/openssl/lib" pip wheel --no-binary :all: cryptography
Cory Benfield6d447282015-10-07 14:50:50 +0100207
Paul Kehrer524e7452017-03-09 19:18:24 -0400208Building cryptography on macOS
209------------------------------
Paul Kehrer451c8df2015-07-04 11:03:27 -0500210
Paul Kehrera17d5902016-03-20 22:29:17 -0400211.. note::
212
213 If installation gives a ``fatal error: 'openssl/aes.h' file not found``
214 see the :doc:`FAQ </faq>` for information about how to fix this issue.
215
Paul Kehrer524e7452017-03-09 19:18:24 -0400216The wheel package on macOS is a statically linked build (as of 1.0.1) so for
Paul Kehrera17d5902016-03-20 22:29:17 -0400217users with pip 8 or above you only need one step:
Paul Kehrer451c8df2015-07-04 11:03:27 -0500218
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500219.. code-block:: console
skeuomorfbc26efb2014-01-29 08:31:47 +0200220
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500221 $ pip install cryptography
222
Paul Kehrer524e7452017-03-09 19:18:24 -0400223If you want to build cryptography yourself or are on an older macOS version,
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500224cryptography requires the presence of a C compiler, development headers, and
Paul Kehrer524e7452017-03-09 19:18:24 -0400225the proper libraries. On macOS much of this is provided by Apple's Xcode
226development tools. To install the Xcode command line tools (on macOS 10.9+)
Paul Kehrerb29f4642015-12-31 23:27:25 -0600227open a terminal window and run:
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500228
229.. code-block:: console
230
231 $ xcode-select --install
232
233This will install a compiler (clang) along with (most of) the required
234development headers.
235
236You'll also need OpenSSL, which you can obtain from `Homebrew`_ or `MacPorts`_.
Paul Kehrer355174a2015-12-22 09:47:26 -0600237Cryptography does **not** support Apple's deprecated OpenSSL distribution.
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500238
239To build cryptography and dynamically link it:
Ayrx1ced5b82014-04-08 19:41:26 +0800240
241`Homebrew`_
skeuomorfbc26efb2014-01-29 08:31:47 +0200242
243.. code-block:: console
244
Paul Kehrer524e7452017-03-09 19:18:24 -0400245 $ brew install openssl@1.1
246 $ 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 +0200247
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500248`MacPorts`_:
Kimmo Parviainen-Jalankoe01e0bf2014-03-19 18:57:09 +0200249
250.. code-block:: console
251
252 $ sudo port install openssl
Paul Kehrer1e071ac2015-09-05 16:30:25 -0500253 $ env LDFLAGS="-L/opt/local/lib" CFLAGS="-I/opt/local/include" pip install cryptography
254
255You can also build cryptography statically:
256
257`Homebrew`_
258
259.. code-block:: console
260
Paul Kehrer524e7452017-03-09 19:18:24 -0400261 $ brew install openssl@1.1
Paul Kehreradeaacf2017-05-24 12:49:18 -0700262 $ 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 -0500263
264`MacPorts`_:
265
266.. code-block:: console
267
268 $ sudo port install openssl
Paul Kehreradeaacf2017-05-24 12:49:18 -0700269 $ 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 +0200270
Paul Kehrerd4ea53b2015-12-31 19:48:32 -0600271If you need to rebuild ``cryptography`` for any reason be sure to clear the
272local `wheel cache`_.
273
Alex Gaynoreb50a2c2014-05-02 09:38:33 -0700274
Alex Gaynor5ad6df92017-02-18 12:52:50 -0500275.. _`Homebrew`: https://brew.sh
Alex Gaynor3197ab52015-10-02 06:33:11 -0700276.. _`MacPorts`: https://www.macports.org
Paul Kehrer5a284e62017-05-29 17:09:23 -0500277.. _`openssl-release`: https://ci.cryptography.io/job/cryptography-support-jobs/job/openssl-release-1.1/
Cory Benfieldba8f6382015-10-07 15:07:47 +0100278.. _virtualenv: https://virtualenv.pypa.io/en/latest/
Alex Gaynor769d5c62016-11-06 04:30:36 -0500279.. _openssl.org: https://www.openssl.org/source/
Paul Kehrerd4ea53b2015-12-31 19:48:32 -0600280.. _`wheel cache`: https://pip.pypa.io/en/stable/reference/pip_install/#caching