我们有一个在 IIS(Windows Server 2019)中运行的工作进程,它在后台向 AWS 中的 kafka 资源发出 https 请求。为了使此过程正常工作,我们必须将来自 Amazon 的证书导入本地计算机证书存储,以便可以建立 ssl 连接,并且它将信任从 AWS 中的资源提供的证书。我们已经导入了证书链,并让它与以下警告一起工作:为 AppPool 身份指定的服务帐户必须是本地管理员或者我们必须运行一些进程,任何进程(除了已经运行的 w3wp.exe) ,作为服务帐户。
我已经处理了很多证书、权限等问题,但真正奇怪的是,如果我打开记事本,例如,作为服务帐户,那么只要记事本正在运行该进程就可以工作 - 意思是读取证书并能够建立 ssl 连接。如果我关闭记事本,则该过程将失败,并且出现以下错误:
ssl://b-2.kafkamsk.abc123.c2.kafka.us-west-2.amazonaws.com:9094/bootstrap: SSL handshake failed: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed: broker certificate could not be verified, verify that ssl.ca.location is correctly configured or root CA certificates are installed (add broker's CA certificate to the Windows Root certificate store) (after 72ms in state CONNECT)
(将 URL 中的文本替换为 abc123 以进行混淆)
请注意,我们不需要访问证书的私钥,我们只需要从证书存储中读取证书。CA 证书已导入“受信任的根证书颁发机构”。中间证书已导入“中间证书颁发机构”,叶证书已导入个人存储区——所有这些都在本地计算机证书存储区中。同样,如果我们只需登录并以服务帐户身份运行某个进程,即使它不是本地管理员,这一切都可以正常工作。
我在执行失败的进程时运行了 sysinternals procmon,并在 HKEY_USERS.DEFAULT\Software\Microsoft\SystemCertificates 上看到了多次访问被拒绝尝试,如果我在尝试该进程时将记事本作为服务帐户运行,则不会出现这些尝试。我已经为这些注册表项上的服务帐户授予了明确的权限,但它没有帮助。
出于明显的安全原因,我们不希望我们的服务帐户成为机器上的本地管理员,并且出于操作/管理的原因,我们不希望依靠让其他进程作为该帐户运行以使其工作。