Installation
============
All versions of ``python-tuf`` can be installed from
`PyPI `_ with
`pip `_.
::
python3 -m pip install tuf
By default tuf is installed as pure python package with limited cryptographic
abilities. See `Install with full cryptographic abilities`_ for more options.
Install with full cryptographic abilities
-----------------------------------------
Default installation supports signature verification only, using a pure Python
*ed25519* implementation. While this allows to operate a *basic client* on
almost any computing device, you will need additional cryptographic abilities
for *repository* code, i.e. key and signature generation, additional
algorithms, and more performant backends. Opt-in is available via
``securesystemslib``.
.. note::
Please consult with underlying crypto backend installation docs. e.g.
`cryptography `_
for possible system dependencies.
::
python3 -m pip securesystemslib[crypto] tuf
Install for development
-----------------------
To install tuf in editable mode together with development dependencies,
`clone `_ the
`python-tuf repository `_
from GitHub, change into the project root directory, and install with pip
(using `venv `_ is recommended).
.. note::
Development installation will `Install with full cryptographic abilities`_.
Please check above for possible system dependencies.
::
python3 -m pip install -r requirements/dev.txt
Application deployment
----------------------
The initial trusted root metadata (``root.json``) is the trust anchor for all
subsequent metadata verification. Applications should deploy a trusted root
with the application and provide it to :class:`tuf.ngclient.Updater`.
Recommended storage locations for bootstrap root metadata include:
* a system-wide read-only path (e.g. ``/usr/share/your-app/root.json``)
* an application bundle with appropriate permissions
* a read-only mounted volume in containerized deployments
Not recommended:
* ``metadata_dir`` (the metadata cache) since it is writable by design
* user-writable install paths (e.g. a user site-packages directory)
* any location writable by the account running the updater
Example::
from tuf.ngclient import Updater
with open("/usr/share/your-app/root.json", "rb") as f:
bootstrap = f.read()
updater = Updater(
metadata_dir="/var/lib/your-app/tuf/metadata",
metadata_base_url="https://example.com/metadata/",
bootstrap=bootstrap,
)
Verify release signatures
-------------------------
Releases on PyPI are signed with a maintainer key using
`gpg `_ (see
`MAINTAINERS.txt `_
for key fingerprints). Signatures can be downloaded from the
`GitHub release `_
page (look for *\*.asc* files in the *Assets* section).
Below code shows how to verify the signature of a
`built `_ distribution,
signed by the maintainer *Lukas Pühringer*. It works
alike for `source `_ distributions.
::
# Get wheel from PyPI and signature from GitHub
python3 -m pip download --no-deps tuf==0.20.0
wget https://github.com/theupdateframework/python-tuf/releases/download/v0.20.0/tuf-0.20.0-py3-none-any.whl.asc
# Get public key, compare fingerprint in MAINTAINERS.txt, and verify with gpg
gpg --recv-keys 89A2AD3C07D962E8
gpg --verify tuf-0.20.0-py3-none-any.whl.asc
# Output:
# gpg: assuming signed data in 'tuf-0.20.0-py3-none-any.whl'
# gpg: Signature made Thu Dec 16 09:21:38 2021 CET
# gpg: using RSA key 8BA69B87D43BE294F23E812089A2AD3C07D962E8
# gpg: Good signature from "Lukas Pühringer " [ultimate]