已解决:我只需选择以管理员身份运行 PyCharm 和可执行文件。
我有一个创建自签名证书的 Python 程序,现在我尝试添加一项功能,将同一证书保存到“证书 - 本地计算机”存储中的 Windows“受信任的根证书颁发机构”文件夹中。我在保存到“当前用户”证书存储时可以正常工作,但仅此而已。当我尝试保存本地计算机存储时,我收到此访问被拒绝消息:
(-2147024891, 'PyCERTSTORE::CertAddEncodedCertificateToStore', 'Access is denied.')
这是将证书作为字符串接收的函数:
CERT_STORE_PROV_SYSTEM = 0x0000000A
CERT_STORE_OPEN_EXISTING_FLAG = 0x00004000
CERT_STORE_MAXIMUM_ALLOWED_FLAG = 0x00001000
CRYPT_STRING_BASE64HEADER = 0x00000000
CERT_SYSTEM_STORE_CURRENT_USER_ACCOUNT = 0x00010000
CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x00020000
X509_ASN_ENCODING = 0x00000001
CERT_STORE_ADD_REPLACE_EXISTING = 3
CERT_CLOSE_STORE_FORCE_FLAG = 0x00000001
def save_cert_to_store(cert_to_save: str) -> None:
cert_byte = win32crypt.CryptStringToBinary(
cert_to_save,
CRYPT_STRING_BASE64HEADER
)[0]
store = win32crypt.CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
None,
CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_MAXIMUM_ALLOWED_FLAG,
"Root"
)
try:
store.CertAddEncodedCertificateToStore(
X509_ASN_ENCODING,
cert_byte,
CERT_STORE_ADD_REPLACE_EXISTING
)
except Exception as e:
print(e)
finally:
store.CertCloseStore(CERT_CLOSE_STORE_FORCE_FLAG)
我怀疑问题出在这一行:
CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_MAXIMUM_ALLOWED_FLAG
,但我在这里尝试了不同的组合,得到了相同的结果。我看到 CERT_STORE_MAXIMUM_ALLOWED_FLAG
以写入权限开头,我想我在这里想要这样的权限,因为我要添加到商店,所以我很困惑为什么它拒绝我的访问。我也试过CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_OPEN_EXISTING_FLAG
。
我也不确定使用“Root”和“My”有什么区别。我都尝试过。编辑:没关系,我找到了这个问题的答案。
我已经查看了 SO 上与此类似的所有其他相关帖子,但实际上没有一个帖子试图将新证书保存到该商店,只是从中读取。
我还想知道这个操作是否可能被Windows完全阻止。
我在这里引用微软的文档:https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certopenstore
注意:要运行此程序,您需要
pip install pywin32
已解决:我只需选择以管理员身份运行 PyCharm 和可执行文件。
我的解决方案是以管理员身份运行 IDE 和可执行文件