我正在用python编写一个Windows服务,并使用keyring模块来安全地存储需要定期持久使用的凭证。这意味着keyring使用本地系统用户凭据存储密码。在
我所做的就是使用两个基本的keyring函数:get_password(SERVICE_NAME, username, password)
和
set_password(SERVICE_NAME, username)
。我没有预先配置keyring,因为我了解它,并看到它自动配置其后端。在
当我在WindowsServer2008上运行这个程序时,一切都很顺利。但当我在Windows Server 2003上运行此程序时,我遇到了一个严重的错误:
error: (1312, 'CredWrite', 'A specified logon session does not exist. It may already have been terminated.')
我假设它与用于运行我的服务的本地系统用户的登录会话有关,尽管它很奇怪,因为我知道它是一种超级管理员超级用户,应该有权限在系统中做任何事情。但是,当我将用户的登录凭据更改为本地管理员时,一切都很顺利。在
我需要在我的服务配置中进行一些更改才能使其正常工作吗?或者更改本地系统用户的安全策略?还是应该要求用户使用本地管理员凭据运行此服务?在
在WindowsServer2003中,本地系统用户似乎有一个限制,即不能访问保存凭据的Windows机制(也称为凭据保险库)。在
keyring的Windows默认后端是使用这个内置的Windows保险库机制,而这正是创建这个机制的原因,也是触发Windows异常的原因。在
此问题的解决方案是使用另一个名为
Win32CryptoKeyring
的密钥环后端,如下所示:此后端使用Win32加密API安全地保存凭据,因此从安全角度来说,它与使用Windows Vault机制一样安全。区别只是凭据保存到的位置。我不知道证件保存在哪里,但事实证明这与我的案子无关。在
需要再次注意的是,只有在Windows Server 2003下使用本地系统用户的Windows Vault时,才会出现此错误。在较新的Windows版本上,这个功能非常好,对于windowsserver2003上的其他用户来说,它也非常好用。在
如果您希望跨平台而不使用多个安全机制来保存代码中的凭据,那么在较新版本的Windows上使用
Win32CryptoKeyring
后端也可以很好地工作。在相关问题 更多 >
编程相关推荐