This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Title: Beta GPG signature check failing
Type: security Stage: resolved
Components: Installation Versions: Python 3.8
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: ned.deily Nosy List: Trishank Kuppusamy, christian.heimes, lkollar, lukasz.langa, mattip, ned.deily
Priority: normal Keywords:

Created on 2019-08-28 07:38 by mattip, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (11)
msg350660 - (view) Author: mattip (mattip) * Date: 2019-08-28 07:38
Over at [multibuild](, they ran into an issue trying to build c-extensions with the 3.8rc3 since it seems it is not gpg signed.

I could not find a HOWTO_RELEASE document to check that the release workflow includes signing the package. One exists in Tools/msi/README.txt.
msg350665 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2019-08-28 15:23
The description of this issue is incorrect. All the release artifacts for the 3.8.0b3 have GPG signatures available - see - like all other releases.  Looking at the log of the failed Travis run in, the failure there appears to be not finding the release manager's public key to verify the GPG signature against.  There is a languishing open issue about the published public keys files having bogus keys in it (, perhaps that is related.  I'll take a close look shortly.
msg351849 - (view) Author: László Kiss Kollár (lkollar) Date: 2019-09-11 12:51
We are seeing the same issue with 3.8b4:

+ curl -fsSLO
+ curl -fsSLO
+ gpg --verify Python-3.8.0b4.tgz.asc
gpg: Signature made Thu 29 Aug 2019 10:43:07 PM UTC using RSA key ID 10250568
gpg: Can't check signature: No public key

msg351850 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2019-09-11 13:01
It looks like you don't have Łukasz key and your GnuPG is not configured for automatic key download.

Automatic key download works for me:

$ gpg --verify Python-3.8.0b4.tgz.asc 
gpg: assuming signed data in 'Python-3.8.0b4.tgz'
gpg: Signature made 2019-08-30T00:43:07 CEST
gpg:                using RSA key E3FF2839C048B25C084DEBE9B26995E310250568
gpg: requesting key 0xB26995E310250568 from hkp server
gpg: key 0xB26995E310250568: public key "Łukasz Langa (GPG <>" imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: Good signature from "Łukasz Langa (GPG <>" [undefined]
gpg:                 aka "Łukasz Langa <>" [unknown]
gpg:                 aka "Łukasz Langa (Work e-mail account) <>" [undefined]
gpg:                 aka "[jpeg image of size 24479]" [unknown]

You could also download the key from keybase:

$ gpg --fetch-keys ""
gpg: requesting key from ''
gpg: key 0xB26995E310250568: "Łukasz Langa (GPG <>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1
msg351941 - (view) Author: mattip (mattip) * Date: 2019-09-11 15:29
Is automatic download really the best solution?
msg351951 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2019-09-11 15:44
This is GPG. You have to download and verify the signature somehow. That's how GPG works. You can either let GPG do it automatically or you can do it manually.
msg351968 - (view) Author: mattip (mattip) * Date: 2019-09-11 16:35
I am not a gpg expert, but I think the proper solution is to add the release manager's key to the official Python GPG public key list. What would it take for that to happen?
msg351979 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2019-09-11 16:49
If you use pubkeys.txt from, then GPG verification gives you no additional security. An attack with write access to or access to the private key of can easily replace the pubkeys.txt with a key file under his control. You only get additional security if you retrieve the key from a different location *and* verify that the key owned by Łukasz.
msg352018 - (view) Author: mattip (mattip) * Date: 2019-09-11 19:24
> If you use pubkeys.txt from, then GPG verification gives you no additional security

I am confused. If the pubkeys.txt on has no benefit, why does it exist? What is considered best practices for people wanting to verify the download from ?
msg352115 - (view) Author: Ned Deily (ned.deily) * (Python committer) Date: 2019-09-12 11:19
> If the pubkeys.txt on has no benefit, why does it exist?

That's an excellent question!  Based on the points raised here and elsewhere, we discussed this more off-line and decided that we should remove the pubkeys.txt file from the website since, as noted here, it encourages a false sense of security and has proven difficult to keep up-to-date.

I have submitted a request to have the file removed from the website (it may take some time for the URL to disappear) and have already updated the wording in the OpenPGP section of the Downloads page of the website.  If anyone has suggestions for improvements to the wording, feel free to submit them on the pythondotorg issue tracker.

Thanks all for bringing this up and helping to come to a resolution.
msg352219 - (view) Author: Trishank Kuppusamy (Trishank Kuppusamy) Date: 2019-09-12 17:36
The problem with not authoritatively publishing one or more public keys for the Python tarballs is that no one will know for sure which key to trust. If you naively download the public key associated with a malicious tarball, you would trust it w/o realizing that it's malicious (assuming that the tarball developers themselves have not gone rogue).

I strongly urge the Python developers to use at least one official GPG key to sign all tarballs, and publish that on its web site (perhaps indirectly using Keybase).
Date User Action Args
2022-04-11 14:59:19adminsetgithub: 82148
2019-09-12 17:36:09Trishank Kuppusamysetnosy: + Trishank Kuppusamy
messages: + msg352219
2019-09-12 11:19:53ned.deilysetstatus: open -> closed
resolution: fixed
messages: + msg352115

stage: resolved
2019-09-11 19:24:14mattipsetmessages: + msg352018
2019-09-11 16:49:27christian.heimessetmessages: + msg351979
2019-09-11 16:35:21mattipsetmessages: + msg351968
2019-09-11 15:44:18christian.heimessetmessages: + msg351951
2019-09-11 15:29:36mattipsetmessages: + msg351941
2019-09-11 13:01:57christian.heimessetnosy: + christian.heimes
messages: + msg351850
2019-09-11 12:55:11lkollarsettitle: release candidate is not gpg signed (and missing release workflow)? -> Beta GPG signature check failing
2019-09-11 12:51:19lkollarsetnosy: + lkollar
messages: + msg351849
2019-08-28 15:23:37ned.deilysetassignee: ned.deily
messages: + msg350665
2019-08-28 07:48:37xtreaksetnosy: + ned.deily, lukasz.langa
2019-08-28 07:38:37mattipcreate