Python/win32crypt,尝试将证书保存到“本地计算机”Windows 存储但使用“当前用户”存储时“访问被拒绝”

问题描述 投票:0回答:1

已解决:我只需选择以管理员身份运行 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 和可执行文件。

python winapi certificate pywin32
1个回答
0
投票

我的解决方案是以管理员身份运行 IDE 和可执行文件

© www.soinside.com 2019 - 2024. All rights reserved.