All Projects → NicoHood → Gpgit

NicoHood / Gpgit

Licence: mit
A shell script that automates the process of signing Git sources via GPG

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to Gpgit

pgpainless
Simple to use OpenPGP API based on Bouncy Castle
Stars: ✭ 73 (+17.74%)
Mutual labels:  signature, gpg
GPGit
A shell script that automates the process of signing Git sources via GPG
Stars: ✭ 84 (+35.48%)
Mutual labels:  signature, gpg
Uber Apk Signer
A cli tool that helps signing and zip aligning single or multiple Android application packages (APKs) with either debug or provided release certificates. It supports v1, v2 and v3 Android signing scheme has an embedded debug keystore and auto verifies after signing.
Stars: ✭ 677 (+991.94%)
Mutual labels:  signature
Bitsend
BitSend Master (Live Version)
Stars: ✭ 39 (-37.1%)
Mutual labels:  signature
Probot Gpg
A GitHub App that enforces GPG signatures on pull requests (no longer maintained)
Stars: ✭ 13 (-79.03%)
Mutual labels:  gpg
Opmsg
opmsg message encryption
Stars: ✭ 704 (+1035.48%)
Mutual labels:  gpg
Myst
Secure Multiparty Key Generation, Signature and Decryption javacard applet
Stars: ✭ 21 (-66.13%)
Mutual labels:  signature
Die Engine
DIE engine
Stars: ✭ 648 (+945.16%)
Mutual labels:  signature
Drops
opmsg p2p transport network
Stars: ✭ 58 (-6.45%)
Mutual labels:  gpg
Hazedumper
up to date csgo offsets and hazedumper config
Stars: ✭ 860 (+1287.1%)
Mutual labels:  signature
React Native Signature View
A react-native component for signing.
Stars: ✭ 30 (-51.61%)
Mutual labels:  signature
Wechat Jssdk Signature
微信JSSDK服务端生成签名认证,包含后端PHP与前端JS的实现,PHP后端有缓存access_token、jsapi_ticket。
Stars: ✭ 19 (-69.35%)
Mutual labels:  signature
Qtpass
QtPass is a multi-platform GUI for pass, the standard unix password manager.
Stars: ✭ 763 (+1130.65%)
Mutual labels:  gpg
Privatekeyvault
Make Instructions: Airgapped raspberry pi computer for working with blockchains featuring LUKS full disk encryption and using qr-codes to pass encrypted files and offline transaction instructions across the airgap.
Stars: ✭ 29 (-53.23%)
Mutual labels:  gpg
Jose Jwt
Ultimate Javascript Object Signing and Encryption (JOSE) and JSON Web Token (JWT) Implementation for .NET and .NET Core
Stars: ✭ 692 (+1016.13%)
Mutual labels:  signature
Intrinsics Dude
Opensource Visual Studio extension for compiler instrinsics in C/C++
Stars: ✭ 44 (-29.03%)
Mutual labels:  signature
Yubikey Guide
Guide to using YubiKey for GPG and SSH
Stars: ✭ 6,709 (+10720.97%)
Mutual labels:  gpg
Multisignaturewallet
311 byte EIP712 Signing Compliant Delegate-Call Enabled MultiSignature Wallet for the Ethereum Virtual Machine
Stars: ✭ 16 (-74.19%)
Mutual labels:  signature
Signature pad
HTML5 canvas based smooth signature drawing
Stars: ✭ 7,623 (+12195.16%)
Mutual labels:  signature
Minisign
A dead simple tool to sign files and verify digital signatures.
Stars: ✭ 1,105 (+1682.26%)
Mutual labels:  gpg

GPGit

gpgit.png

Introduction

As we all know, today more than ever before, it is crucial to be able to trust our computing environments. One of the main difficulties that package maintainers of GNU/Linux distributions face, is the difficulty to verify the authenticity and the integrity of the source code. With GPG signatures it is possible for packagers to verify source code releases quickly and easily.

Overview of the required tasks:

Buy Me A Coffee

GPGit

GPGit is meant to bring GPG to the masses. It is not only a shell script that automates the process of creating new signed Git releases with GPG, but also includes a quick-start-guide for learning how to use GPG. GPGit integrates perfectly with the Github Release API for uploading. It can even automatically add a Keep A Changelog formatted changelog to the release.

The security status of GNU/Linux projects will be tracked in the Linux Security Database. If you have any further questions, do not hesitate to contact me personally. Thanks for your help in making GNU/Linux projects more secure by using GPG signatures.

Index

GPGit Documentation

Installation

Distribution Packages

Manual Installation

# Install dependencies and optional dependencies
sudo apt-get install bash gnupg2 git tar xz-utils coreutils gawk grep sed
sudo apt-get install gzip bzip lzip file jq curl

# Download and verify source
VERSION=1.4.1
wget "https://github.com/NicoHood/gpgit/releases/download/${VERSION}/gpgit-${VERSION}.tar.xz"
wget "https://github.com/NicoHood/gpgit/releases/download/${VERSION}/gpgit-${VERSION}.tar.xz.asc"
gpg2 --keyserver hkps://keyserver.ubuntu.com --recv-keys 97312D5EB9D7AE7D0BD4307351DAE9B7C1AE9161
gpg2 --verify "gpgit-${VERSION}.tar.xz.asc" "gpgit-${VERSION}.tar.xz"

# Extract, install and run GPGit
tar -xf "gpgit-${VERSION}.tar.xz"
sudo make -C "gpgit-${VERSION}" PREFIX=/usr/local install
gpgit --help

Script Usage

The script guides you through all 5 steps of the GPG quick start guide. Run GPGit with the tag name as parameter. All other options will get auto detected. When running the script for the first time GPGit runs in interactive (-i) mode and guide you through all steps of secure source code signing.

If you add and commit a CHANGELOG.md file to your Git with the Keep a Changelog format, GPGit will autodetect that file and add the corresponding changelog section to the tag message and Github release notes.

Sample Usage

screenshot

Parameters and Configuration

$ gpgit --help
Usage: gpgit [options] <tagname> [<commit> | <object>]

GPGit 1.4.1 https://github.com/NicoHood/gpgit
A shell script that automates the process of signing Git sources via GPG.

Mandatory arguments:
  <tagname>                The name of the tag to create.

Optional arguments:
  -h, --help               Show this help message and exit.
  -m, --message <msg>      Use the given <msg> as the commit message.
                           If multiple -m options are given, their values are
                           concatenated as separate paragraphs.
  -C, --directory <path>   Run as if GPGit was started in <path> instead of the
                           current working directory.
  -u, --local-user <keyid> Use the given GPG key (same as --signingkey).
  -o, --output <path>      Safe all release assets to the specified <path>.
  -p, --pre-release        Flag as Github pre-release.
  -f, --force              Force the recreation of Git tag and release assets.
  -i, --interactive        Run in interactive mode, step-by-step.
      --<option>           Temporary set a 'gpgit.<option>' from config below.
  <commit>, <object>       The object that the new tag will refer to.

Examples:
  gpgit 1.0.0
  gpgit -p -m "First alpha release." 0.1.0 --hash "sha256 sha512"
  gpgit -C git/myproject/ -o /tmp/gpgit -n -m "Internal test release." 0.0.1

Configuration options:
  gpgit.signingkey <keyid>, user.signingkey <keyid>
  gpgit.output <path>
  gpgit.token <token>
  gpgit.compression <xz | gzip | bzip2 | lzip | zip>
  gpgit.hash <sha512 | sha384 | sha256 | sha1 | md5>
  gpgit.changelog <auto | true | false>
  gpgit.github <auto | true | false>
  gpgit.githubrepo <username/projectname>
  gpgit.project <projectname>
  gpgit.keyserver <keyserver>

Examples:
  git config --global gpgit.output ~/gpgit
  git config --local user.signingkey 97312D5EB9D7AE7D0BD4307351DAE9B7C1AE9161
  git config --local gpgit.compression "xz zip"

GPG Quick Start Guide

GPGit guides you through 5 simple steps to get your software project ready with GPG signatures. Further details can be found below.

  1. Generate a new GPG key
    1. Strong, unique, secret passphrase
    2. Key generation
  2. Publish your key
    1. Send GPG key to a key server
    2. Publish full fingerprint
    3. Associate GPG key with Github
  3. Use Git with GPG
    1. Configure Git GPG key
    2. Enble commit signing
    3. Create signed Git tag
  4. Create a signed release archive
    1. Create compressed archive
    2. Sign the archive
    3. Create the message digest
  5. Upload the release
    1. Configure HTTPS download server
    2. Upload to Github

1. Generate a new GPG key

1.1 Strong, unique, secret passphrase

Make sure that your new passphrase for the GPG key meets high security standards. If the passphrase/key is compromised all of your signatures are compromised too.

Here are a few examples how to keep a passphrase strong but easy to remember:

1.2 Key generation

If you don't have a GPG key yet, create a new one first. You can use RSA (4096 bits) or ECC (Curve 25519) for a strong key. GPG offers you the option to use the most future-proof key algorithm available. Use the most recent version gnupg2, not gnupg1!

Ed25519 ECC GPG keys are currently not supported by Github. To generate an ECC key use future-default instead of rsa4096 as parameter.

Make sure that your secret key is stored somewhere safe and use a unique strong password.

Example key generation:
$ gpg2 --quick-generate-key "John Doe <[email protected]>" future-default default 1y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 2F8E73B1D445CCD3 marked as ultimately trusted
gpg: revocation certificate stored as '/home/john/.gnupg/openpgp-revocs.d/6718A9A63030E182A86FEE152F8E73B1D445CCD3.rev'
public and secret key created and signed.

pub   ed25519 2017-09-24 [SC] [expires: 2018-09-24]
      6718A9A63030E182A86FEE152F8E73B1D445CCD3
uid                      John Doe <[email protected]>
sub   cv25519 2017-09-24 [E]

The generated key has the fingerprint 6718A9A63030E182A86FEE152F8E73B1D445CCD3 in this example. Share it with others so they can verify your source. [Read more]

If you ever move your installation make sure to backup ~/.gnupg/ as it contains the private key and the revocation certificate. Handle it with care. [Read more]

2. Publish your key

2.1 Send GPG key to a key server

To make the public key widely available, upload it to a key server. Now the user can get your key by requesting the fingerprint from the keyserver: [Read more]

# Publish key
gpg2 --keyserver hkps://keyserver.ubuntu.com --send-keys <fingerprint>

# Import key
# Alternative keyserver: hkps://hkps.pool.sks-keyservers.net
gpg2 --keyserver hkps://keyserver.ubuntu.com --recv-keys <fingerprint>

2.2 Publish full fingerprint

To make it easy for everyone else to find your key it is crucial that you publish the full fingerprint on a trusted platform, such as your website or Github. To give the key more trust other users can sign your key too. [Read more]

2.3 Associate GPG key with Github

To make Github display your commits as "verified" you also need to add your public GPG key to your Github profile. [Read more]

# List keys + full fingerprint
gpg2 --list-secret-keys --keyid-format LONG

# Generate public key
gpg2 --armor --export <fingerprint>

# If you have multiple uids or signatures you can minimize the output:
gpg2 --armor --export --export-filter keep-uid="uid =~ <email>" --export-options export-minimal <fingerprint>

3. Use Git with GPG

3.1 Configure Git GPG key

In order to make Git use your GPG key you need to set the default signing key for Git. [Read more]

# List keys + full fingerprint
gpg2 --list-secret-keys --keyid-format LONG

git config --global user.signingkey <fingerprint>

3.2 Enable commit signing

To verify the Git history, Git commits needs to be signed. You can manually sign commits or enable it by default for every commit. It is recommended to globally enable Git commit signing. [Read more]

git config --global commit.gpgsign true

3.3 Create signed Git tag

Git tags need to be created from the command line and always need a switch to enable tag signing. [Read more]

# Creates a signed tag
git tag -s 1.0.0

# Re-tag an older, unsigned tag
git tag -sf 1.0.0 1.0.0

# Verifies the signed tag
git tag -v 1.0.0

4. Create a signed release archive

4.1 Create compressed archive

You can use git archive to create archives of your tagged Git release. It is highly recommended to use a strong compression which is especially beneficial for those countries with slow and unstable internet connections. [Read more]

# .tar.gz
git archive --format=tar.gz -o gpgit-1.0.0.tar.gz --prefix gpgit-1.0.0/ 1.0.0

# .tar.xz
git archive --format=tar --prefix gpgit-1.0.0/ 1.0.0 | xz > gpgit-1.0.0.tar.xz

4.2 Sign the archive

Type the filename of the tarball that you want to sign and then run:

gpg2 --digest-algo SHA512 --armor --detach-sign gpgit-1.0.0.tar.xz

Do not blindly sign the Github source downloads unless you have compared its content with the local files via diff. [Read more]

To not need to retype your password every time for signing you can also use gpg-agent.

This gives you a file called gpgit-1.0.0.tar.xz.asc which is the GPG signature. Release it along with your source tarball and let everyone know to first verify the signature after downloading. [Read more]

gpg2 --verify gpgit-1.0.0.tar.xz.asc

4.3 Create the message digest

Message digests are used to ensure the integrity of a file. It can also serve as checksum to verify the download. Message digests do not replace GPG signatures. They rather provide and alternative simple way to verify the source. Make sure to provide message digest over a secure channel like https.

sha512sum gpgit-1.0.0.tar.xz > gpgit-1.0.0.tar.xz.sha512

5. Upload the release

5.1 Configure HTTPS download server

5.2 Upload to Github

Create a new "Github Release" to add additional data to the tag. Then drag the .tar.xz .sig and .sha512 files onto the release.

The script also supports uploading to Github directly. Create a new Github token first and then follow the instructions of the script. How to generate a Github token:

  • Go to "Settings - Personal access tokens"
  • Generate a new token with permissions public_repo and admin:gpg_key. In order to access private repositories you must allow access to the whole repo scope.
  • Store it safely

Appendix

Email Encryption

You can also use your GPG key for email encryption with thunderbird.

Contact

You can get securely in touch with me here. My GPG key ID is 9731 2D5E B9D7 AE7D 0BD4 3073 51DA E9B7 C1AE 9161. Don't hesitate to file a bug at Github. More cool projects from me can be found on my Website.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].