WSIT:JKS相对文件路径

时间:2011-02-14 15:30:44

标签: java tomcat filepath jks wsit

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

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

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

我应该在哪里放置jks文件,使其与该位置匹配?

2 个答案:

答案 0 :(得分:2)

最后,我找到了答案。

  

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

来自JBossWS - Stack Metro User Guide

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

答案 1 :(得分:1)

我看到了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 =>,其他代码实际上是没有分号的java。