A GTK 4 Certification Authority manager
View the Project on GitHub davefx/gnoMint
This is a task-oriented walkthrough. It assumes you have gnoMint installed — if not, see the install guide first.
The manual is divided into:
Want to be productive in five minutes? Run through this checklist; the rest of the manual goes deeper on each step.
gnomint from a terminal or your application menu. A
default database is created at
~/.local/share/gnomint/default.gnomint.Example Root CA)fullchain.pem ready for nginx /
Apache / HAProxy.That’s it. You have a working CA, one issued cert, and a deployable chain bundle.
A CA database is a single SQLite file (extension .gnomint) that
holds:
You can have as many CA databases as you like — one per organisation
is typical. The default file lives at
~/.local/share/gnomint/default.gnomint; use File → Open or
File → New to switch to another.
Every certificate is rooted in a self-signed CA. Intermediates are chained by signing one CA’s certificate with another CA’s key. The tree view in the main window reflects this structure: drill into a CA to see what it has signed.
.gnomint database.The “New CA” dialog opens. Fill in the subject fields:

Pick a key algorithm. The bit-length / curve selector below swaps to match: a spinbutton for RSA/DSA, a P-256/P-384/P-521 dropdown for ECDSA, and nothing for Ed25519 (key size is fixed by the curve).



If your database holds production keys, encrypt it at creation time. gnoMint asks for an optional passphrase when you create a CA; if you set one, private keys are stored PKCS#8-encrypted with PKCS#12 3DES. You can also add/change/remove the passphrase later from File → Database password.

With a CA selected, Certificates → Add new certificate opens the issuance dialog. Fill in:
Click OK and gnoMint generates a fresh keypair, signs the resulting certificate with the CA’s key, and writes both into the database.
For the two most common cases gnoMint offers wizards that hide all the key-usage / EKU fiddling.
Certificates → Add web-server certificate:
www.example.com).The wizard sets keyUsage = digitalSignature, keyEncipherment and
extendedKeyUsage = serverAuth, plus the SAN, and signs.
Certificates → Add email certificate:
email
SAN).Key usage and EKU are set for S/MIME (signing + key encipherment, plus
emailProtection EKU).
If a colleague hands you a CSR (.csr or .pem PKCS#10), import it:
The issued certificate is filed under the CA you picked.
Right-click any non-revoked certificate and choose Renew with fresh key. gnoMint:
CLI equivalent: renewcert <cert-id>. Useful from cron — pipe a list
of expiring cert ids and let gnomint-cli reissue them on a schedule.
Right-click any issued certificate and choose Revoke. Confirm the dialog; the cert is marked revoked, and its serial number is added to the CA’s CRL state with a revocation timestamp and reason.
Certificates → Export CRL writes the current CRL for the selected CA in PEM or DER form. Re-export whenever you revoke something new.
Right-click a certificate and choose Export certificate. Picks of:
-----BEGIN CERTIFICATE-----)
Right-click and choose Extract private key. The key is exported PKCS#8 PEM, optionally re-wrapped with a fresh passphrase.
Right-click a leaf certificate and choose Export full certificate
chain. You get a single PEM bundle in web-server order — leaf first,
intermediates next, root last — ready to drop into Apache, nginx,
HAProxy, or any other server that expects a fullchain.pem. Issue
#52.
Hold Ctrl to add individual rows to the selection, or Shift to select a range. With multiple rows selected:
Mixed selections (certs + CSRs) are fine — the action that doesn’t apply to a given row silently skips it. Bulk-revoke records the same revocation reason and timestamp for every entry, so they all appear together in the CRL. Issue #54.
A search box sits above the tree view. Type any substring of a subject CN/DN or a serial number and the tree narrows in real-time to the matching rows. CAs are always shown so you can see which CA issued each match. Press Ctrl+F anywhere in the main window to jump into the search entry. Clear the entry (or just delete the text) to restore the full view. Issue #53.
In the CLI:
gnomint> search example.com
Matches (id serial subject):
3 1 www.example.com
7 3 vpn.example.com
2 matches.
Right-click any certificate → Compare with PEM file…. Pick a
second certificate (from a .pem file you have lying around), and
gnoMint opens a side-by-side diff dialog:
| Field | Selected cert | Other cert |
|---|---|---|
| Subject CN | example.com | www.example.com |
| Serial | 7 | 12 |
| Activation | 2026-05-01 | 2027-05-22 |
| Subject Key ID | (one hash) | (different hash) |
| … |
Rows that differ are highlighted in amber, identical rows are plain. Useful for:
CLI equivalent — either argument can be a DB id or a path to a PEM file:
gnomint> diff 7 /tmp/served.pem
Field 7 /tmp/served.pem
----- ---- -----
* Subject CN example.com www.example.com
Subject DN ... ...
* Activation 2026-05-01 … 2027-05-22 …
…
3 fields differ.
Issue #55.
Rows in the tree view are coloured by their effective expiration:
Expiry is cascade-computed: a leaf certificate is effectively expired
at the earliest of its own notAfter and every ancestor CA’s
notAfter. So a 10-year leaf issued under a CA that expires in two
months will turn amber along with the CA. Issue
#51.
View → Show expired certificates toggles whether expired entries (and their entire subtree, in the case of an expired CA) appear in the list. The setting is persisted in GSettings.
If you already have a CA built with another tool, gnoMint can usually absorb it.
File → Import file… picks up:
Imported certificates land under the matching CA in the tree (matched by issuer SKI). Standalone certs with no matching CA in the database end up at the top level as orphans.
File → Import directory… absorbs a full OpenSSL-style CA layout
(certs/, private/, index.txt, serial, etc.). gnoMint reads:
cacert.pem + private/cakey.pem
or the path your openssl.cnf points at).certs/ and newcerts/.This is the recommended way to migrate a long-running OpenSSL CA into gnoMint without re-issuing every certificate.
Certificates → Generate DH parameters… writes a PKCS#3 file for use by OpenVPN / Apache / nginx. Pick a bit length (2048 minimum, 3072 recommended); generation takes a while because finding a safe prime is genuinely slow.
CLI equivalents: importfile <path>, importdir <path>,
dhgen <bits> <path>.
Everything above is also available from gnomint-cli, a readline shell
with tab completion. Common commands:
gnomint-cli # default DB
gnomint-cli ~/some-other.gnomint # explicit DB
gnomint> help # list commands
gnomint> showcas # list CAs
gnomint> showcerts # list issued certs
gnomint> showcsrs # list pending CSRs
gnomint> addca # interactive new CA
gnomint> addservercert # web-server cert wizard
gnomint> addemailcert # email cert wizard
gnomint> sign <csr-id> # sign an imported CSR
gnomint> revokecert <id> # revoke a cert
gnomint> exportcert <id> <path.pem>
gnomint> exportchain <id> <path.pem>
gnomint> exportcrl <ca-id> <path.pem>
Same database; the GUI and CLI can be opened against the same file at different times (don’t open it from both simultaneously — SQLite locking will reject the second writer).

Edit → Preferences controls:
All preferences live in GSettings under the
org.gnome.gnomint schema, so gsettings works too:
gsettings list-keys org.gnome.gnomint
gsettings set org.gnome.gnomint expire-warning-days 60
gnomint
.ui templates and trip GTK criticals. Re-run
sudo make install after every build that touches gui/*.ui.GDK_BACKEND=x11 gnomint.The signing path looks up the parent CA by matching the new
certificate’s Authority Key ID against existing CAs’ Subject Key
ID. Very old CAs (pre-1.0 gnoMint, or imports from tools that don’t
populate SKI) have an empty subject_key_id, so this lookup fails.
Workarounds:
subject_key_id on the offending CA’s row to a value matching the
child’s issuer_key_id.Most often this means the database is passphrase-protected and the prompt was cancelled or answered wrong. Re-try and provide the correct passphrase. If you’ve forgotten the database passphrase, there’s no recovery — that’s the point.
renewcert / Renew with fresh key inserts the new cert directly
under the same parent CA as the original. If the tree looks wrong,
verify the parent CA still has a subject_key_id populated (see the
previous troubleshooting entry).
| File | Path |
|---|---|
| Default database | $XDG_DATA_HOME/gnomint/default.gnomint (typically ~/.local/share/gnomint/default.gnomint) |
| Legacy DB location (auto-migrated) | ~/.gnomint/default.gnomint |
| Preferences (GSettings) | org.gnome.gnomint schema; backing file under $XDG_CONFIG_HOME/dconf/user |
| Installed UI templates | $prefix/share/gnomint/*.ui (typically /usr/local/share/gnomint/) |
| Translations | $prefix/share/locale/<lang>/LC_MESSAGES/gnomint.mo |
After a ./configure && make from a source checkout:
make -C tests check
What it covers:
check_y2k38 — confirms 64-bit time_t so post-2038 validity dates workcheck_ui_consistency — static check of every gui/*.ui for layout
collisions, missing handlers, etc.check_workflows — runtime regression test under a headless Wayland
compositor (weston). Exercises new-CA / sign / revoke / renew /
expiry banner / search filter / certificate diff.check_cli_email.sh, check_cli_wizard.sh, check_cli_parity.sh —
shell tests that drive gnomint-cli end-to-end and grep the output.If make check fails, run tests/run-headless.sh tests/check_workflows
directly for the most detailed output.
docs/ in the repo).