4

我们的开发团队开发了一个在 Weblogic 10.3 上运行的 J2EE 应用程序。每台开发机器都运行自己的 Weblogic 10.3 应用服务器副本。开发环境的 Weblogic 域最初是在一台机器上创建的,然后使用 Weblogic 的配置工具(bea10/wlserver_10.3/common/bin/config.cmd)复制到所有机器上。

每台开发机器都有自己的 config.xml 副本。此文件中的所有密码(用于 JDBC 数据源等的密码)都已加密,并且加密显然在每台机器上使用不同的种子,因为相同的密码在不同的机器上具有不同的加密形式。

问题是每隔一段时间 config.xml 需要更新(例如,当添加新的 EJB 时)并且需要在所有机器上应用更新。我们应该怎么做呢?如果我们只是将文件放入 CVS 并从那里更新其他机器,每台机器上的加密密码将被覆盖。当服务器尝试解密最初在另一台机器上加密的密码短语时,这会导致丑陋的填充异常。

是否有 ant 任务(我找不到)或类似的机制可以正确合并 config.xml 中的更改而不覆盖加密的密码?或者是否有可能以某种方式指定明文密码并在第一次启动时对其进行加密(我有一个模糊的回忆,这在以前的版本中是可能的,但在 10.3 中是不可能的)。

从事 Weblogic 的开发团队如何处理这个问题?

BR,

马尔科

4

4 回答 4

6

[...] 每台开发机器都有自己的 config.xml 副本。此文件中的所有密码(用于 JDBC 数据源等的密码)均已加密...

是的,WebLogic Server 会加密存储在其域配置 XML 文件中的所有纯文本密码。这是为了防止访问敏感信息。当使用管理控制台或脚本工具输入密码时,它会在存储到配置 XML 文件之前自动加密。

...并且加密显然在每台机器上使用不同的种子,因为相同的密码在不同的机器上具有不同的加密形式。

关于encrypt实用程序(来自 Oracle WebLogic Server Java Utilities),文档说:

加密明文字符串以weblogic.security.Encrypt用于 WebLogic Server。该实用程序使用当前目录的加密服务,或指定 WebLogic Server 域根目录的加密服务。

注意:加密字符串必须已由将使用它的 WebLogic Server 域中的加密服务加密。否则,服务器将无法解密该字符串。

这在文档中没有提到,但是,AFAIK,Weblogic 使用域的密码盐文件 ( SerializedSystemIni.dat) 来加密明文字符串。

[...] 如果我们只是将文件放入 CVS 并从那里更新其他机器,每台机器上的加密密码将被覆盖。

您可以选择在存储在 VCS 中的 config.xml 中使用明文密码(如果这不是问题)。实际上,在 WebLogic Server 9.0 之前,密码会在随后的重启过程中被加密。从 WebLogic Server 9.0 开始,仅开发域“完全”支持在配置文件中使用明文密码,并且 Weblogic 不会重新加密密码。在这两种情况下,这都可以让人们轻松地签出配置文件。

是否有一个 ant 任务(我找不到)或类似的机制来处理正确合并 config.xml 中的更改而不覆盖加密密码?...

我不确定这是否能直接回答您的问题,但 Oracle WebLogic Server为其大部分(如果不是全部)Java 实用程序提供了Ant 任务。也许您会在那里找到一些有用的东西(查看使用 wlconfig Ant 任务配置 WebLogic Server 域

或者是否有可能以某种方式指定明文密码并在第一次启动时对其进行加密(我有一个模糊的回忆,这在以前的版本中是可能的,但在 10.3 中是不可能的)。

正如我在上面所写的,这是 Weblogic Server 9.0 之前的“默认”行为。我不知道您是否可以在以后的版本中强制执行此行为。当然,你总是可以使用 ant 和encrypt来做到这一点,但老实说,如果你让人们看到一次明文密码,我真的不明白事后加密它们的意义。

于 2009-10-03T14:44:01.073 回答
1

我会使用 mercurial 或 git 之类的东西,并使用导出/导入功能,以便将更改移动到差异中,而不是完整的文件中。

简短说明

好吧,如果你被 CVS 卡住了(对不起,我在某种程度上分享了你的痛苦),你可以考虑创建一个 CVS 的 diff 存储库。例如,当创建配置文件的新版本时,将新文件与旧文件进行比较,并将比较文件添加到存储库中,其他主机从 cvs 签出并修补配置文件。

这是一个黑客,但应该工作。

于 2009-10-01T13:46:45.713 回答
1

就我个人而言,我会考虑 WLST 进行大规模域更新。即使您没有使用 python 或 WLST 的经验,它也非常简单

  1. 打开域的录制(管理 Web 界面)
  2. 在一个域上进行更改(管理 Web 界面)
  3. 激活更改(管理 Web 界面)
  4. 你应该在你的默认域文件夹中获得一个 python 脚本
  5. 对于每个环境
    1. 使用 WLST 连接到管理服务器
    2. 应用你的脚本
    3. 如果需要,重新启动域或托管服务器

目前,我工作的公司与您所描述的事情类似 - 使用 weblogic 域文件进行修改,然后将相同的文件部署到我们所有的环境中进行小的调整。多年来,我们最终陷入了混乱。这不是要走的路。

于 2009-10-13T04:03:01.590 回答
1

我们使用 WLST 做到了。我们在python中使用某种简单的声明性“域模型”,它相当抽象(即它没有指定集群中不同服务器的配置,在我们的环境中所有节点必须相同)。这个模型很短(对于拥有 30 多个连接池、一堆 JMS 东西和一些外国 JMS 提供者的最大应用程序来说,只有 2-3 页)。之后,我们有两个脚本:首先在目标环境中创建一个空域,第二个应用域模型。为了收集开发人员在“主”环境中所做的更改,我们有一个脚本,它通过域配置并输出模型文件。使用这些模型文件的差异,我们可以看到发生了什么变化。

这看起来像是一个重量级的框架,但当我们必须管理 100 多个应用程序的开发、测试、登台和生产环境时,它确实节省了大量时间。

对于较小的情况,只需复制文件并使用相同的 SerializedSystemIni.dat 即可。只要确保您的域名保持不变,调整地址/端口即可。如果您想使用不同的 SerializedSystemInit.dat,也很容易做到这一点,基于此代码(http://gustlik.wordpress.com/2008/08/06/decryption-of-configuration-passwords-in -weblogic/)编写一个实用程序非常容易,该实用程序将使用原始 SerializedSystemIni.dat 解码密码并使用新密码进行编码。这应该可以解决问题。

于 2009-10-24T21:48:08.803 回答