类似于问题:

我正在尝试从使用 Active Directory 中定义为“account1$”的运行的服务访问本地计算机“我的(个人)存储”中的证书

如果我向任何本地或域用户授予特殊的读取访问权限,它可以在从 CLI 运行程序时访问。

如果我授予托管服务帐户(account1$)对证书的读取和完全访问权限,该服务将返回密钥库的访问被拒绝错误。

服务正在使用 Java(tomcat),但我知道问题不在于 Java,因为我使用的是 jdk 11.0.23,并且从控制台启动时它可以正常工作。

24-Jun-2024 17:01:11.432 SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException Failed to initialize component [Connector[HTTP/1.1-8443]]
        org.apache.catalina.LifecycleException: Protocol handler initialization failed
                at org.apache.catalina.connector.Connector.initInternal(Connector.java:1051)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at org.apache.catalina.core.StandardService.initInternal(StandardService.java:556)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1045)
                at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
                at org.apache.catalina.startup.Catalina.load(Catalina.java:724)
                at org.apache.catalina.startup.Catalina.load(Catalina.java:746)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.base/java.lang.reflect.Method.invoke(Method.java:566)
                at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:305)
                at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:475)
        Caused by: java.lang.IllegalArgumentException: java.security.KeyStoreException: Access is denied.
                at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:107)
                at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71)
                at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:235)
                at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1227)
                at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1240)
                at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:603)
                at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80)
                at org.apache.catalina.connector.Connector.initInternal(Connector.java:1048)
                ... 13 more
        Caused by: java.io.IOException: java.security.KeyStoreException: Access is denied.
                at jdk.crypto.mscapi/sun.security.mscapi.CKeyStore.engineLoad(CKeyStore.java:735)
                at jdk.crypto.mscapi/sun.security.mscapi.CKeyStore$MYLocalMachine.engineLoad(CKeyStore.java:72)
                at java.base/java.security.KeyStore.load(KeyStore.java:1479)
                at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:69)
                at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:217)
                at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207)
                at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:283)
                at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:247)
                at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:105)
                ... 20 more
        Caused by: java.security.KeyStoreException: Access is denied.
                at jdk.crypto.mscapi/sun.security.mscapi.CKeyStore.loadKeysOrCertificateChains(Native Method)
                at jdk.crypto.mscapi/sun.security.mscapi.CKeyStore.engineLoad(CKeyStore.java:732)
                ... 28 more

5

  • 1
    我猜想访问被拒绝是针对商店,而不是证书。可能是打开商店时指定或声明的选项。打开并枚举商店的代码是什么样子的?


    – 

  • 好观点@GregAskew!我应该检查 tomcat 和源代码,因为使用带有 jdk 库的标准示例是可行的。我还发现,授予托管帐户本地管理员权限似乎可以提高。没有出现错误,但无法连接到 SSL 端口。我会继续调查。谢谢!


    – 

  • 1
    在我看来,授予 Tomcat gMSA 本地管理员权限是行不通的。


    – 

  • 我同意。这只是一个试图发现并限制问题的测试。


    – 

  • 似乎根据所使用的 KeyStore,使用 null 或 “” 是不一样的。如 getStore() 上所示,我将通过更改 server.xml 中的 <Connector/> 属性进行一些测试


    – 


最佳答案
1

最后,我得到了一个适用于证书存储的配置。它非常具体,到目前为止我找不到任何其他配置。

它可以工作,但在我们的环境中还需要手动步骤。我认为它应该在 Windows 中配置,并且对于所有请求私钥的程序都是通用的,而不是 Tomcat 独有的。

显示 Windows 安全对话框,要求允许访问,类似于 UAC,但用于证书。

使用的 server.xml 配置是

<Connector port="8443"
           scheme="https" secure="true" SSLEnabled="true">
    <SSLHostConfig>
        <Certificate 
          certificateKeystoreType="Windows-MY-LOCALMACHINE"
             certificateKeystoreFile=""
             certificateKeyAlias="tomcat"/>
    </SSLHostConfig>
</Connector>

我继续研究尝试使用不同的密码和属性,因为如果没有,我将无法使用标准。对我来说,很明显,Tomcat 中使用了不同的内部库,所以当我只使用时,它不起作用,并且它不会在存储中找到密钥。

就最初的问题而言,我认为这个解决方案是有效的,因为 Tomcat 能够与 Windows 本地计算机证书存储一起使用。

解决方案要求:

  • JDK 11.0.20+ 或已修复错误的 JDK 版本
  • 使用 Tomcat 9.0.63 进行测试
  • 在 Windows 2019 中测试

0