【问题标题】:WSIT: JKS relative filepathWSIT:JKS 相对文件路径
【发布时间】:2011-02-14 15:30:43
【问题描述】:

使用 Netbeans、Maven、Metro 和 Tomcat 创建 Web 服务服务器时,如何在 wsit 配置中使用相对文件路径?

例如,我在 wsit 文件中有这一行:

<sc:KeyStore wspp:visibility="private" location="SERVER_KeyStore.jks" type="JKS" storepass="*****" alias="*****"/>

我应该把 jks 文件放在哪里以便它匹配那个位置?

【问题讨论】:

    标签: java tomcat filepath jks wsit


    【解决方案1】:

    终于,我找到了答案。

    当提供 密钥库/信任库名称和位置 wsit-*.xml 文件,请注意 它们将作为资源加载 扫描 META-INF 目录 你的包(WEB-INF/classes/META-INF 在 JBoss 上使用 war 包时 应用服务器 5)。

    来自JBossWS - Stack Metro User Guide

    在我的情况下,这意味着将 META-INF 文件夹添加到我的资源文件夹中,并将 &lt;include&gt;**/*.jks&lt;/include&gt; 添加到 pom 文件中。

    【讨论】:

      【解决方案2】:

      我看到一些关于wsit 安全配置的问题,其中大部分涉及外部化 SSL 配置,而不是硬编码到 wsdl 文件中。只是因为可能有开发和生产环境,而且无论如何硬编码配置都是不好的。我在这个问题上花了几天时间,在 stackoverflow 和其他各种论坛中只发现了一些(通常是可怕的)提示。但解决方案确实没有那么复杂。我只是把它留给某人(它也符合原始问题,因为它允许在任何地方拥有 jks,也有外部配置文件)。

      假设,您的 wsdl 文件中有 wsit 策略,如下所示:

      <wsp1:Policy wsu:Id="MyBinding_IWebServicePolicy">
          <wsp1:ExactlyOne>
              <wsp1:All>
                  <sc:KeyStore wspp:visibility="private" type="JKS" storepass="pass" alias="some-alias" keypass="pass" location="keystore.jks"/>
                  <sc:TrustStore wspp:visibility="private" type="JKS" peeralias="other-alias" storepass="pass" location="truststore.jks"/>
              </wsp1:All>
          </wsp1:ExactlyOne>
      </wsp1:Policy>
      

      您需要改用CallbackHandler

      调整后的政策:

      <wsp1:Policy wsu:Id="MyBinding_IWebServicePolicy">
          <wsp1:ExactlyOne>
              <wsp1:All>
                  <sc:KeyStore wspp:visibility="private" callbackHandler="com.my.KeyStoreHandler"/>
                  <sc:TrustStore wspp:visibility="private" callbackHandler="com.my.TrustStoreHandler"/>
              </wsp1:All>
          </wsp1:ExactlyOne>
      </wsp1:Policy>
      

      处理程序可能看起来像这样(我使用 scala,但您可以轻松地将其转换为 java):

      import javax.security.auth.callback.{ CallbackHandler => ICallbackHandler, Callback }
      import com.sun.xml.wss.impl.callback.{ KeyStoreCallback, PrivateKeyCallback }
      import java.security.{ PrivateKey, KeyStore }
      import java.io.FileInputStream
      
      abstract class CallbackHandler extends ICallbackHandler {
        def conf: Config // getting external configuration
      
        def handle(callbacks: Array[Callback]): Unit = callbacks foreach {
          // loads the keystore
          case cb: KeyStoreCallback =>
            val ks = KeyStore.getInstance(conf.getString("type"))
            val is = new FileInputStream(conf.getString("file"))
            try ks.load(is, conf.getString("store-password").toCharArray) finally is.close()
            cb.setKeystore(ks)
      
          // loads private key
          case cb: PrivateKeyCallback =>
            cb.setAlias(conf.getString("alias"))
            cb.setKey(cb.getKeystore.getKey(conf.getString("alias"), conf.getString("key-password").toCharArray).asInstanceOf[PrivateKey])
      
          // other things
          case cb => // I didn't need anything else, but just in case
        }
      }
      
      class TrustStoreHandler extends CallbackHandler {
        lazy val conf = getMyTrustStoreConfig
      }
      
      class KeyStoreHandler extends CallbackHandler {
        lazy val conf = getMyKeyStoreConfig
      }
      

      在java中只需使用if (cb isinstanceof Class)而不是case cb: Class =&gt;,其他代码实际上是没有分号的java。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-18
        • 2012-01-28
        • 2021-12-02
        • 1970-01-01
        • 2016-12-11
        • 2018-05-05
        • 2014-07-31
        • 2013-10-29
        相关资源
        最近更新 更多