Show HN: Let's Seal – Let's Encrypt for document signing, free and self-hosted

9 hours ago (github.com)

TLDR, Let's Seal gives the finger to Adobe and every doc signing tool (docusign, google, etc) who pay to play with the Adobe Approved Trust List and then charge you for something that should be free.

Currently even the person checking if a document/contract is sealed or code is authentic has to also be inside the same Adobe walled garden too. Verification, the part that should be free is the part everyone charges for. Thats the shape Let's Encrypt fixed for TLS, and I wanted the same thing for documents and files.

The core idea therefore needed to go a bit beyond e signatures and i created an open standard (SEAL), plus free tools that implement it.

When you seal a file, three independent things happen.

1. it gets a signature from a certificate authority, chaining to a public root. 2. its record is appended to an RFC 6962 transparency log. and 3. its SHA256 is timestamped on a public blockchain (Bitcoin) via OpenTimestamps. Those three give you integrity, transparency and a timestamped proof. And importantly, none of those depend on Let's Seal and none are gated.

You can verify with the tools you already have, no Let's Seal account and no Let's Seal software. A sealed PDF carries a standard PAdES signature, so any PDF reader validates it. A sealed build artefact carries a cosign compatible signature and a SLSA provenance attestation. The Bitcoin timestamp verifies with stock ots.

3 ways to use it.

1. The free web app. We kindly have backing from Backblaze to cover storage costs for the foreseeable. So you can upload or issue any number of documents, get a public proof page at /d/<hash> and verify it at https://verify.letsseal.org for free. Multiple accounts, multiple seats, enterprise functions. Free.

2. Self host the whole thing. Apache-2.0, one Next.js app plus a signing service that holds the CA key on localhost. Storage is any S3-compatible bucket or local disk. If you'd rather run your own root of trust, you can.

3. Programmatically. via the CLI and a hosted API. This is the Let's Encrypt/certbot angle. Seal or anchor things from CI, or have a backend seal every invoice or report as its generated.

The CLI is sealbot. It runs anywhere Node runs (npx sealbot) and there are native binaries for macOS, Linux and Windows with no runtime needed.

Theres a GitHub Action wrapping the same tool, so a release workflow can seal its own artifacts. Its what proves our own releases.

KYC is semi-handled (to a degree) it's hard to do for free (at least for now), but issuers (your companies or websites) domains can be authenticated with a DNS record added, which proves the issuer has control over a domain. Sign-in can be authenticated to an email via Google Sign in and a few others will be added to the web app in time (Same as Docusign currently). Ideas welcome on future KYC should there be a demand.

Feedback welcome on the standard (SPEC.md in the repo).

Repo: https://github.com/letsseal/letsseal Site: letsseal.org

Thx

In my opinion, all of these open source/free/open document signing tools are neat on paper (and technically fulfill the goal of being able to verify a document's chain-of-custody/signature provenance) - but won't take off in any meaningful way legally because there's no entity behind them taking the responsibility for accuracy and culpability.

DocuSign/Adobe/whomever is trust anchor, it's an entity you can sue or subpoena if something goes wrong. Someone who's actually on the hook for making sure whatever's signed is accurate and truthful (outside of the reputational risk of fraud completely obliterating any trust in your platform)...

No amount of cryptographic verification substitutes for having a legal person on the other end who can be held accountable for actually verifying the document was signed accurately/process was followed.

  • Indeed. It doesn’t meet the requirements of EU qualified signatures or seals, for example.

    • What are the actual requirements?

      In USA we only have a few requirements from the E-SIGN act:

      Key Legal Requirements

      Intent to Sign: Parties must show a clear, provable action to sign the document. Electronic Consent: Parties must agree to use electronic records, with consumer transactions requiring specific advance disclosures.

      Signature Association: The system must capture an audit trail or text linking the signature to the specific document.

      Record Retention: Contracts must be accurately stored and remain accessible for future reference by all authorized parties.

      Consumer Disclosure Rules

      Hardware/Software Notice: Tell users what tools they need to access and save the records.

      Paper Copy Rights: Inform users how to get paper copies and whether any fees apply.

      Withdrawal Details: Explain how consumers can change their mind and cancel their electronic consent.

      2 replies →

  • that's true. i think that if it's obvious that the audit is finding everything, every detail, every file, piece of data touched.... at what level do we need to verify?

Nice idea but with all related things the ultimate question remains whether courts will actually recognize it.

Currently courts will still consider paper-signed and scanned PDFs as legally binding, so any verification on top of that is superfluous to them.

More realistically, you take an oauth when you take the stand at the court, and if a signed document was altered by the counterparty you'd say so truthfully, if it weren't, you'd say so truthfully, and the penalty of that oauth purjury is high enough that most people wouldn't do it. Cryptography not needed.

You can't be the "Let's Encrypt of" anything if it's self-hosted. The entire point of Let's Encrypt is that there is a centralized reputable entity of note signing everyone's keys. Without that, it's entirely worthless. It's no better than a self-signed SSL cert or putting your own PGP key on a document manually. There's no point in a layer of abstraction atop that.

Why not use RFC 3161?

Due to how the code signing works, timestamping servers are provided by all major CAs with full public access, e.g. timestamp.digicert.com, timestamp.comodoca.com, timestamp.sectigo.com, etc.

PS. OP, your comments are auto-killed for some reason. You may want to message mods to get this sorted.

Loved it until I saw its using Bitcoin. With proof of work doesn’t it tie this project to a bit of an environmental nitemare? Bitcoin isn’t the best place for this, no?

I would have imagined Ethereum or some other ledger would have been better no?

Anyone with more crypto ledger knowledge be able to say what I’m trying to say more precisely.

Tried to poke a little to see if I can find any name (I could not). Challenge with this domain is the TRUST anchor. As an organization/company you have to establish yourself first (directly or through reference) otherwise its hard for anyone to trust you.

Looks interesting, but in order to actually compete with any e-signing platform you'll at the very least need to have templates with pre-filled information, an API to autofill docs with required information, and more field types. Right now for example, you can only add text, checkbox, and date/signature fields. Checkboxes are required to be checked (no making them optional), so if there are multiple checkbox options, they have to check them all to continue. Not very useful for actual e-signing flows.

It’s a neat proof of concept, but it’s hard to see the organizations that care about certified documents adopting this. Inherently conservative. Let’s Encrypt invested a lot in their early partnerships and used that to sneak up on the conservative buyers and trusters of certs.

Poked around a bit..excited to see where this goes.

Just a quick note, Under "Get help from the community > Disucssions", there's a 404 to https://github.com/letsseal/letsseal/discussions .

The idea makes sense in principle I think, and but I'll be chewing on it a bit, haha. Seems like a solid standard, but you know how standards go.... (Relevant XKCD: https://xkcd.com/927/)

I like that you kept a lot of the same commands/naming/syntax from LetsEncrypt. As someone familiar with LetsEncrypt, makes me feel like I'd slide right in here easily.

I'd like to learn more about the 'Bitcoin anchored root'...is that part of RFC 6962 or something else entirely? Do you mean a 'Bitcoin-like blockchain' or are you using the actual BTC chain? Could you point me in the right direction?

It's astonishing how easy it is for an LLM to convince its user they have an idea worth a genuinely sound standard, let alone an open standard.

Each open standard where it's clear the only consultation was between the prompt engineer and Claude is as tedious as the weekly cryptocurrency whitepaper of the mid-2010's.

The only novel factor in the proliferation of lazily prompted open standards is we have a perfect demonstration of the futility of LLLM sycophancy when combined with a mind looking for an easy win.

I love the concept, it would be great to see broader uptake of an open standard for this sort of space.

  • Thx. The spec matters more than the site here, its SPEC.md in the repo. Still v1.1 and cheap to change, so any/all notes welcome.

A few months ago, I released the Open Claiming Protocol, in order for an interoperable, open standard for people cryptographically signing things. I wonder, how does this overlap with that, and could it be useful to support it? I agree it's much more general purpose though...

http://openclaiming.org/

I know that there are some sites, like proofofexistence.com that acts like a notary service anchored to Bitcoin. Is that similar?

To me, it seems that there are some secret things you might want to hash and sign, and timestamp, like agreements that you can prove that both parties signed them, etc.