加密密码
从 ActiveMQ Classic 5.4.1 开始,您可以加密密码并将其安全地存储在配置文件中。要加密密码,您可以使用新添加的 encrypt
命令,例如
$ bin/activemq encrypt --password activemq --input mypassword
...
Encrypted text: eeWjNyX6FY8Fjp3E+F6qTytV11bZItDp
其中,您要加密的密码通过 input
参数传递,而 password
参数是加密器使用的密钥。以类似的方式,您可以测试您的密码,例如
$ bin/activemq decrypt --password activemq --input eeWjNyX6FY8Fjp3E+F6qTytV11bZItDp
...
Decrypted text: mypassword
注意:建议您只对密码使用字母数字字符。不支持特殊字符,例如 $/^&
。
从 5.16.0 版本开始,已添加对“encrypt”和“decrypt”命令指定算法参数的支持。默认情况下,使用的算法是“PBEWithMD5AndDES”。要使用更现代的加密算法,您可以指定
$ bin/activemq encrypt --password activemq --input mypassword --algorithm PBEWITHHMACSHA256ANDAES_256
...
Encrypted text: h/cWj/ZZelMt3Y7NSzUG2vHYSnfWK561qjNg9Ywyr9yT72ru7pR4IEUnHLIdLSOb
下一步是将密码添加到相应的配置文件中,默认情况下为 $ACTIVEMQ_HOME/conf/credentials-enc.properties
。
activemq.username=system
activemq.password=ENC(mYRkg+4Q4hua1kvpCCI2hg==)
guest.password=ENC(Cf3Jf3tM+UrSOoaKU50od5CuBa8rxjoL)
...
jdbc.password=ENC(eeWjNyX6FY8Fjp3E+F6qTytV11bZItDp)
注意,我们使用 ENC()
来包装加密的密码。您可以在属性文件中混合使用明文和加密的密码,因此加密的密码必须以这种方式包装。
最后,您需要指示属性加载器在将属性加载到内存时解密变量。为此,我们将使用特殊的属性加载器(参见 \$ACTIVEMQ_HOME/conf/activemq-security.xml
),而不是标准的属性加载器。
<bean id="environmentVariablesConfiguration" class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
<property name="algorithm" value="PBEWithMD5AndDES" />
<property name="passwordEnvName" value="ACTIVEMQ\_ENCRYPTION\_PASSWORD" />
</bean>
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="config" ref="environmentVariablesConfiguration" />
</bean>
<bean id="propertyConfigurer" class="org.jasypt.spring31.properties.EncryptablePropertyPlaceholderConfigurer">
<constructor-arg ref="configurationEncryptor" />
<property name="location" value="file:${activemq.base}/conf/credentials-enc.properties"/>
</bean>
通过这种配置,ActiveMQ Classic 将尝试从 ACTIVEMQ_ENCRYPTION_PASSWORD
环境变量加载加密器密码,然后使用它从 credential-enc.properties
文件中解密密码。
另一种方法是使用简单的变体,并将加密器密码存储在 xml 文件中,如下所示
<bean id="configurationEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
<property name="algorithm" value="PBEWithMD5AndDES"/>
<property name="password" value="activemq"/>
</bean>
但是,这样会失去加密器密钥的保密性。您也可以参考 http://www.jasypt.org/advancedCommunity/FAQ/configuration.md,了解更多关于如何配置 Jasypt 的信息。
最后,我们可以像平常一样使用属性
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="system" password="${activemq.password}"
groups="users,admins"/>
<authenticationUser username="user" password="${guest.password}"
groups="users"/>
<authenticationUser username="guest" password="${guest.password}" groups="guests"/>
</users>
</simpleAuthenticationPlugin>
或
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="${jdbc.password}"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
如果您想使用此配置运行代理,您需要执行以下操作
- 设置环境变量
$ export ACTIVEMQ\_ENCRYPTION\_PASSWORD=activemq
- 启动代理
$ bin/activemq start xbean:conf/activemq-security.xml
- 取消设置环境变量
$ unset ACTIVEMQ\_ENCRYPTION\_PASSWORD
这样,您的加密器密钥将永远不会保存在您的系统上,并且您的加密密码将安全地存储在配置文件中。