Distributing classic Mac applications from PowerPC Mac to Apple Silicon, bringing retro Mac experiences to modern systems. Why throw away a Mac that still works? True sustainability is using what we have.
A root-certificate rescue tool for old Macs whose Keychain has gone stale, causing HTTPS to fail. It fetches a fresh, signed list of root certificates from a server and applies them — and the signature is checked even if the transfer itself happens over plain HTTP, since some machines this old can't necessarily speak HTTPS to fetch the fix in the first place.
Old Mac → launch RetroCert → fetch the current CA list from the server → apply it to the Keychain → retry the HTTPS connection.
SecureTransport,
and no certificate tool can fix it. On top of that, most people who actively use a Tiger-era Mac today have
already moved to Aquafox or
Thunderbird for browsing/mail, and both carry their own certificate store that's independent of the OS
Keychain and already includes modern roots. If you're already on Aquafox, you probably don't need
this. RetroCert's real audience is the minority who deliberately still use stock Safari/Mail.app.
RetroCert.zip on the old Mac (or unzip elsewhere and copy the folder over).cd into the unzipped folder, and run:python3.12 retrocert.py — a dry run; shows what would change, changes nothing.python3.12 retrocert.py --apply — actually applies the new certificates to your login Keychain.python3.12 retrocert.py --apply --system — applies system-wide instead (needs sudo).| Verified | PowerMac G4 / Mac OS X 10.4.11 (Tiger) / Python 3.12.11, against this site's own production server |
|---|---|
| Requirement | PowerPC Mac, Mac OS X 10.4 (Tiger) or later, Python 3.12 |
A personal hobby project provided with no warranty. MIT licensed. Full source, the publisher-side tooling, and the design notes are in the GitHub repository.
The interesting part of this project turned out not to be "fixing certificates" — that part is routine — but making sure an update fetched over plain HTTP (because some of these machines can't do HTTPS at all until the certificates are fixed, which is a chicken-and-egg problem) can still be trusted.
The signing key lives only on the developer's own machine and is never uploaded anywhere. That machine
signs manifest.json and the client distribution archive; only the signed output goes to the
VPS. The VPS itself holds no private key at all — it's just a static file server. RetroCert checks
the signature with its bundled public key before trusting anything it downloaded. The point:
even if the VPS were fully compromised, an attacker still couldn't produce a valid signature,
so a tampered manifest or certificate file gets rejected by the client itself, regardless of the transport.
Each individual certificate is additionally checked against the SHA-256 recorded in the (already verified)
manifest, so one signature check covers the whole certificate set.
client/verify.py implements RSA-PKCS#1 v1.5 + SHA-256 signature verification in about 90 lines,
using only hashlib, pow(), and a small hand-rolled ASN.1 DER parser — no
cryptography or pyOpenSSL. That matters here because the whole point is running on
old or constrained Python builds where installing those isn't realistic.
SecureTransport, not a certificate problem, and outside what any certificate tool can fix.
/System/Library/Keychains/X509Anchors). The macOS backend
(store_macos.py) branches on this rather than assuming the newer API everywhere.
Given the narrow real-world payoff above, the more interesting part may be the mechanism itself, reusable beyond certificates:
verify.py as a standalone utility anywhere cryptography/
pyOpenSSL aren't available — old Python builds, pip-less sandboxes, an installer's
bootstrap step that shouldn't need extra dependencies.store.py's
per-OS dispatch layer exists specifically for this: old routers, NAS boxes, multi-function printers,
industrial equipment, and old Linux/Windows servers all make HTTPS calls whose certificate store never
gets updated. Reframed as "keep an old TLS client alive" rather than "old Mac web browsing," it could
serve a broader need — just add a store_windows.py or store_linux.py.certutil isn't available on the target machine, but a binding that calls
libnss3.dylib directly via ctypes could in principle add certificates to
cert9.db. That's ironically where the actually-useful feature lives, but it needs to match
NSS's internal API/ABI exactly — a meaningfully larger effort.Full source code, the publisher-side tooling, and license are on GitHub.
Bug reports and requests go straight to the developer, privately — a personal project, so replies aren't guaranteed.