首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WSIT: JKS相对文件路径

WSIT: JKS相对文件路径
EN

Stack Overflow用户
提问于 2011-02-14 23:30:44
回答 2查看 1.4K关注 0票数 2

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

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

代码语言:javascript
复制
<sc:KeyStore wspp:visibility="private" location="SERVER_KeyStore.jks" type="JKS" storepass="*****" alias="*****"/>

我应该把jks文件放在哪里,这样它才能与那个位置匹配?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-15 02:20:31

最后,我找到了答案。

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

来自JBossWS - Stack Metro User Guide

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

票数 2
EN

Stack Overflow用户

发布于 2015-09-05 21:25:48

我看到了一些关于security配置的问题,其中大多数都涉及外部化wsit配置,而不是将其硬编码到wsdl文件中。只是因为可能有开发和生产环境,总之硬编码的配置是不好的。我花了几天的时间来处理这个问题,在stackoverflow和其他各种论坛上只发现了一些(通常是可怕的)提示。但解决方案实际上并不那么复杂。我只是把它留给别人(它也匹配原来的问题,因为它将允许在任何地方有jks,也有外部配置文件)。

假设您在wsdl文件中有这样的wsit策略:

代码语言:javascript
复制
<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

调整后的策略:

代码语言:javascript
复制
<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 ):

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4993972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档