使用 Python win32crypt 访问 windows 本地机器存储
Access windows local machine store with Python win32crypt
我正在尝试访问存储在 windows 本地机器存储中的证书。这不能用 wincertstore 完成,因为它使用 CertOpenSystemStoreA 函数(见备注:https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certopensystemstorea)
但是 pywin32 的 CertOpenStore 可以访问,我只是不知道如何传递正确的参数。
这是我的代码:
import win32crypt
# store provider
CERT_STORE_PROV_SYSTEM = 13
#dwFlags
CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x0100
CERT_SYSTEM_STORE_CURRENT_USER = 0x0200
CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY = 0x0400
CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x0800
CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x1000
CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x2000
CERT_SYSTEM_STORE_SERVICES = 0x4000
CERT_SYSTEM_STORE_USERS = 0x8000
store = win32crypt.CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, None, CERT_SYSTEM_STORE_LOCAL_MACHINE, "MY")
for cert in store.CertEnumCertificatesInStore():
print("1 Cert: " + str(cert))
print("2 CertEnumCertificateContextProperties: " + str(cert.CertEnumCertificateContextProperties()))
print("3 cert.Subject: " + str(win32crypt.CertNameToStr(cert.Subject)))
当运行时,我得到一个异常:(-2147024809, 'CertOpenStore', 'Wrong Parameter.')
pywin32 中的 CertOpenStore 文档:http://timgolden.me.uk/pywin32-docs/win32crypt__CertOpenStore_meth.html
Windows 开发中心的 CertOpenStore 文档:https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certopenstore
你弄乱了常量。我不知道你从哪里得到的,但值(至少你使用的两个)是错误的,所以我把它们全部删除了(没看其他的)。它们(或它们中的大部分)是 预处理器宏 ,在 [MS.Docs]: wincrypt.h header 中定义([=36= 的一部分] SDK - 不幸的是我没有在网络上找到可以下载它的 官方 位置 - 我有它在我的笔记本电脑上,因为它是由自动安装的Visual Studio).
code00.py:
#!/usr/bin/env python
import sys
import win32crypt as wcrypt
# lpszStoreProvider
CERT_STORE_PROV_SYSTEM = 0x0000000A
# dwFlags
CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x00020000
def main(*argv):
store = wcrypt.CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, None, CERT_SYSTEM_STORE_LOCAL_MACHINE, "My")
for cert in store.CertEnumCertificatesInStore():
print("1 Cert: {0:}".format(cert))
print("2 CertEnumCertificateContextProperties returned: {0:}".format(cert.CertEnumCertificateContextProperties()))
print("3 cert.Subject: {0:}".format(wcrypt.CertNameToStr(cert.Subject)))
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main(*sys.argv[1:])
print("\nDone.")
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q061118677]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32
1 Cert: <PyCERT_CONTEXT object at 0x0000021CDE3BD740>
2 CertEnumCertificateContextProperties returned: [92, 15, 20, 11, 2, 3, 4, 25, 89]
3 cert.Subject: localhost
Done.
我正在尝试访问存储在 windows 本地机器存储中的证书。这不能用 wincertstore 完成,因为它使用 CertOpenSystemStoreA 函数(见备注:https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certopensystemstorea)
但是 pywin32 的 CertOpenStore 可以访问,我只是不知道如何传递正确的参数。 这是我的代码:
import win32crypt
# store provider
CERT_STORE_PROV_SYSTEM = 13
#dwFlags
CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x0100
CERT_SYSTEM_STORE_CURRENT_USER = 0x0200
CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY = 0x0400
CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x0800
CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x1000
CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x2000
CERT_SYSTEM_STORE_SERVICES = 0x4000
CERT_SYSTEM_STORE_USERS = 0x8000
store = win32crypt.CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, None, CERT_SYSTEM_STORE_LOCAL_MACHINE, "MY")
for cert in store.CertEnumCertificatesInStore():
print("1 Cert: " + str(cert))
print("2 CertEnumCertificateContextProperties: " + str(cert.CertEnumCertificateContextProperties()))
print("3 cert.Subject: " + str(win32crypt.CertNameToStr(cert.Subject)))
当运行时,我得到一个异常:(-2147024809, 'CertOpenStore', 'Wrong Parameter.')
pywin32 中的 CertOpenStore 文档:http://timgolden.me.uk/pywin32-docs/win32crypt__CertOpenStore_meth.html Windows 开发中心的 CertOpenStore 文档:https://docs.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-certopenstore
你弄乱了常量。我不知道你从哪里得到的,但值(至少你使用的两个)是错误的,所以我把它们全部删除了(没看其他的)。它们(或它们中的大部分)是 预处理器宏 ,在 [MS.Docs]: wincrypt.h header 中定义([=36= 的一部分] SDK - 不幸的是我没有在网络上找到可以下载它的 官方 位置 - 我有它在我的笔记本电脑上,因为它是由自动安装的Visual Studio).
code00.py:
#!/usr/bin/env python
import sys
import win32crypt as wcrypt
# lpszStoreProvider
CERT_STORE_PROV_SYSTEM = 0x0000000A
# dwFlags
CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x00020000
def main(*argv):
store = wcrypt.CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, None, CERT_SYSTEM_STORE_LOCAL_MACHINE, "My")
for cert in store.CertEnumCertificatesInStore():
print("1 Cert: {0:}".format(cert))
print("2 CertEnumCertificateContextProperties returned: {0:}".format(cert.CertEnumCertificateContextProperties()))
print("3 cert.Subject: {0:}".format(wcrypt.CertNameToStr(cert.Subject)))
if __name__ == "__main__":
print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
main(*sys.argv[1:])
print("\nDone.")
输出:
[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q061118677]> "e:\Work\Dev\VEnvs\py_pc064_03.07.06_test0\Scripts\python.exe" code00.py Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] 64bit on win32 1 Cert: <PyCERT_CONTEXT object at 0x0000021CDE3BD740> 2 CertEnumCertificateContextProperties returned: [92, 15, 20, 11, 2, 3, 4, 25, 89] 3 cert.Subject: localhost Done.