What is the correct procedure to download the official bitcoin client, and validate it was signed by the developers, and not infected with any malware by a man in the middle?

  • 3
    It just occured to me after upgrading the client right now to 0.3.24 that I don't take any verification steps. <paranoia>There might be trojans in my system now, and I wouldn't even know it!</paranoia> – ripper234 Sep 4 '11 at 22:57
  • see similar thread here: bitcointalk.org/index.php?topic=49889 howto verify bitcoin archive authenticity – osmosis Nov 11 '11 at 3:52

Jeff Garzik signs every release with his GPG key (also here). You can find release announcements (such as this one) on the SourceForge.net Bitcoin development list.

To verify the signature on a release, obtain the key from the link above. Obtain the release announcement from the link above. Obtain the download from any source. Then point GPG at the release annoucement (or the signature block from it, including the BEGIN and END lines). GPG will ask what file you want to verify, pick any of the ones listed in the signature certificate. It will then tell you if the release is identical to the release Jeff Garzik signed.

  • 3
    and while you are at it... you should also take some steps to verify that the gpg key indeed belongs to whom it appears to belong. /anyone/ can make a key with "jeff garzik" in the uid. – nanotube Oct 2 '11 at 22:26
  • 2
    @nanotube: Good point. The fingerprint of the release key is 60B0 0235 B335 5D84 BF2A 4E35 DA1D C20F 2DBF 0CA8. – David Schwartz Oct 2 '11 at 22:33
  • and assuming we can all trust that you have properly checked that this key indeed belongs to jeff before posting that fingerprint... that's a good first step :) we should probably make an effort to improve the gpg web of trust between the core devs and the rest of the community. – nanotube Oct 3 '11 at 3:03
  • I am no longer able to edit that comment. If it is incorrect, one would hope someone would say so. So you actually don't have to trust me. (Plus, if that was incorrect, I would be publicly vouching for incorrect information, knowing it's security sensitive. I would deserve a good shaming.) – David Schwartz Oct 3 '11 at 3:11

Intructions for Linux:

You need to have the following files:

  1. Download the file you want to check:

    wget -c https://bitcoin.org/bin/bitcoin-core-0.13.2/bitcoin-0.13.2-x86_64-linux-gnu.tar.gz
  2. Download the hash sums containing file:

    wget -c https://bitcoin.org/bin/bitcoin-core-0.13.2/SHA256SUMS.asc
  3. Download the release signing key:

    wget -c https://bitcoin.org/laanwj-releases.asc

You check the file as follows:

  1. The signing key needs to be imported:

    gpg --import laanwj-releases.asc
  2. Check the hash sum file signature:

    gpg --verify-files SHA256SUMS.asc laanwj-releases.asc

    It should say:

    Good signature from "Wladimir J. van der Laan.

    So now we know that the hash sum file is signed with the provided key we trust.

  3. Finally, check the file of interest:

     gpg --verify-files bitcoin-0.12.1-linux64.tar.gz SHA256SUMS.asc

    It should say:

    Good signature from "Wladimir J. van der Laan (Bitcoin Core binary release signing key) "

    So now we know that the tarred file is signed with the provided key we trust.

  4. Check that the hash sum matches:

     sha256sum --ignore-missing -c SHA256SUMS.asc

    It should say:

    bitcoin-0.13.2-x86_64-linux-gnu.tar.gz: OK

  • I was going to upvote this because it seems the best answer, but when going through the steps I find the following: for version 0.12.1 the "release signatures" linked are bitcoin.org/bin/bitcoin-core-0.12.1/SHA256SUMS.asc, however you link to laanwj-releases.asc file, and that file is in a link titled v0.11.0+, not 0.12.1. Does the + character here mean "or later"? As in "0.11.0 or later"? – knocte Jun 23 '16 at 4:35
  • @knocte Yes, it means "or later". – Vlastimil Jun 23 '16 at 7:25

I would grab this script from bitcoin-core's repository, then comment out the line where it calls the clean_up function at the end. Then when you call it, it not only downloads the binaries in /tmp/bitcoin/, it also verifies the hashes.

  1. Visit http://sourceforge.net/projects/bitcoin/files/Bitcoin/
  2. Pick the latest version folder.
  3. Download one of the SHA...SUMS files and examine it in your favorite text editor.
  4. Download the installation file you want to use.
  5. If you don't know how to get your computer to tell you the checksum of a file, you'll have to go figure that out. Compare the checksum with the one in the file. If they match, then you've determined one thing that is important: The file you downloaded is the same as the file used by whoever created that checksum.

Now you want to know if you can trust that person. He has an account at Sourceforge and he has made a file available to you and you now have that file, and what you proved in step 5 is that you got the same file he made available, as opposed to a fake from someone on the Internet between you and Sourceforge.

I just did this with version 0.7.1, and that person is Gavin Andresen. I have Kleopatra for Windows, so I looked up "Gavin Andresen" on the pgp.mit.edu certificate server, and found a certificate for him with "(CODE SIGNING KEY)" in the name. I imported it to Kleopatra and then verified that the checksum file I downloaded in step 3 was signed by the person who made that key (Anybody can make a key and pretend to be Gavin).

But let's be paranoid...

I could still have bad code because I might have downloaded an imposter's certificate, and had my connection hijacked for the download. So I Googled "Gavin Andresen certificate fingerprint" (without quotes) and found a page at https://bitcointalk.org/index.php?action=printpage;topic=69355.0 that displays the fingerprint of "Gavin"'s certificate, and it matches. With all this information, I assume I'm ok. If I didn't, I'd have to get the source and examine it, as Evil Spork explained.


Here is an easy walk through on how to authenticate bitcoin-qt on GNU/Linux systems (Like Trisquel, Fedora, Ubuntu, Debian, etc):

  1. Open a terminal
  2. Download the core developers PGP key (https://bitcoin.org/en/development)

(Gavin Andresen)

  1. Import the core developers PGP key with GPG:

gpg --import gavinandresen.asc

  1. From the https://bitcoin.org/en/download page click on the "Linux (tgz)" file to download.

  2. From the bitcoin download page click on the "Verify release signatures" link to download the signature.

  3. Authenticate the file release was compiled by the core developer:

gpg --verify SHA256SUMS.asc

The most important line to make sure you see is:

gpg: Good signature from "Gavin Andresen (CODE SIGNING KEY) "

A 2nd line you will see is:

gpg: WARNING: This key is not certified with a trusted signature!

This line means that you don't know if you can trust the signature that you imported. Short of meeting the core developer Gavin Andresen in person or at least getting his public key from somebody you trust who has met him you won't ever be able to truly trust the download. However you can at least be confident that all future releases are at least being compiled by the same person. If you don't see "Good signature" you know you have a problem.

While you are at it you may want to import the keys of other core developers just in case. It may be at some point another core developer signs. You'll have more confidence its from a trusted party than if you have to import the key at the time of the download.


Generally if you want it really secure you go to the official source, download it, inspect the code, then compile it yourself.

Otherwise just check it versus the md5 hash or sha hash.

  • 3
    I would like the answer to this question to be phrased in a way non tech savvy users will be able to do it. – ripper234 Sep 4 '11 at 23:01
  • 1
    The "official source" is GitHub? I see that the "official" distribution site, sourceforge, does not use SSL. – Stephen Gornick Sep 5 '11 at 0:30
  • 1
    From bitcoin.org I get to SourceForge, which includes a page with a signed SHA1. So with Summer Properties I can check that sha1, but i have to check that it is properly signed as well (an attacker can spoof the sha1 as well). So, how do I check the PGP signature? Vs which key? – ripper234 Sep 5 '11 at 7:54
  • 1
    pgp signing, leaves a complex hash at the bottom that you can test to 'prove' that the document was signed by a trusted key. Essentially, the private key can sign publicly, and the public key can sign privately, so if you sign with your private key, anyone who knows your public key, can verify that this truly comes from you... However in the first place you need to have the creator's public key. which again comes back to the same problem. – Evil Spork Sep 5 '11 at 10:06
  • 1
    There is no other way to be sure a bit of code isn't malicious other than checking it yourself. :P so hardly a non-answer, just far more than most people are willing to do. – Evil Spork Sep 24 '11 at 13:13

Q: How can one download the bitcoin client securely?

A: https://github.com/bitcoin/bitcoin/downloads

  • 2
    Unless github's SSL certificate is compromised ;-) – nmat Sep 14 '11 at 8:30
  • 3
    @nmat: or if any public root CA whatsoever is compromised – Longpoke Sep 14 '11 at 15:03
  • 6
    github downloads do not go over https either. though the download area is https, once you click on an individual file to download it, it comes from cloud.github.com - no https in sight. it is at any rate irrelevant to the question at hand, since https doesn't protect you from server compromise. you really should just verify the gpg sig. – nanotube Oct 2 '11 at 22:23
  • outdated link now – knocte Jun 23 '16 at 8:13

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.