WildFly Elytron集成Azure Key Vault报错:找不到'DKS'类型适配提供程序
WildFly Elytron 集成 Azure Key Vault JCA 获取 SSL 证书
问题背景
在WildFly 15中尝试通过Elytron子系统直接从Azure Key Vault获取SSL证书,Tomcat环境中使用DKS类型+AzureKeyVault提供程序的配置可正常工作,但Elytron配置始终报错。
已完成操作
- 将
azure-security-keyvault-jca-2.7.1.jar部署到WildFly模块modules/com/azure/security/keyvault/jca/main/,并配置module.xml。 - 在
standalone.conf.bat中添加JVM参数:-Dazure.keyvault.uri=https://my-keyvault.vault.azure.net/ -Dazure.keyvault.managed-identity=true。 - 修改
java.security添加security.provider.14=com.azure.security.keyvault.jca.KeyVaultJcaProvider。 - 配置Elytron提供程序聚合及密钥库、密钥管理器,但启动时报错。
报错信息
ERROR [org.wildfly.security.key-store.azure-keyvault-keystore] ... No suitable provider found for type 'DKS'
已尝试的解决方法
- 更换密钥库类型(JKS、PKCS12、AzureKeyVault)。
- 确认AzureKeyVault provider-loader配置正确,JAR及模块加载正常。
- 尝试移除/保留
credential-reference配置。
可行配置方案
1. 修正模块依赖配置
确保modules/com/azure/security/keyvault/jca/main/module.xml包含必要依赖:
<?xml version="1.0" encoding="UTF-8"?> <module xmlns="urn:jboss:module:1.3" name="com.azure.security.keyvault.jca"> <resources> <resource-root path="azure-security-keyvault-jca-2.7.1.jar"/> <!-- 若WildFly未自带Azure依赖,需添加azure-core、azure-identity等JAR --> </resources> <dependencies> <module name="javax.api"/> <module name="javax.security.auth.message.api"/> <module name="org.jboss.logging"/> </dependencies> </module>
2. 调整Elytron提供程序配置
无需将AzureKeyVault加入聚合提供程序列表,只需确保provider-loader加载正确,并设置聚合提供程序为默认:
<providers> <aggregate-providers name="combined-providers"> <providers name="elytron"/> <providers name="openssl"/> </aggregate-providers> <provider-loader name="elytron" module="org.wildfly.security.elytron"/> <provider-loader name="openssl" module="org.wildfly.openssl"/> <provider-loader name="AzureKeyVault" module="com.azure.security.keyvault.jca"/> <default-providers providers="combined-providers"/> </providers>
3. 正确配置密钥库与SSL上下文
使用AzureKeyVault作为密钥库类型,而非DKS,并指定对应的提供程序:
<tls> <key-stores> <key-store name="azure-keyvault-keystore"> <credential-reference clear-text=""/> <implementation type="AzureKeyVault" provider-name="AzureKeyVault"/> <!-- 可选:指定要使用的证书别名 --> <attributes> <attribute name="keyAlias" value="mycert"/> </attributes> </key-store> </key-stores> <key-managers> <key-manager name="azure-keyvault-key-manager" key-store="azure-keyvault-keystore"> <credential-reference clear-text=""/> </key-manager> </key-managers> <server-ssl-contexts> <server-ssl-context name="https-context" key-manager="azure-keyvault-key-manager" protocol="TLSv1.3"/> </server-ssl-contexts> </tls>
4. 移除全局JCA提供程序配置
删除java.security中添加的security.provider.14配置,避免与Elytron的provider-loader冲突。
问题解答
- 无需本地密钥库即可集成:按照上述配置,Elytron可直接通过Azure Key Vault JCA提供程序获取证书,无需本地密钥库文件。
- 有效类型与提供程序组合:使用
type="AzureKeyVault"+provider-name="AzureKeyVault"是适配Azure JCA提供程序的正确组合,Tomcat中使用的DKS类型并非Azure提供程序的原生支持类型,Elytron对类型校验更严格。 - 完整配置示例:上述配置即为Elytron集成Azure Key Vault JCA的完整可运行示例。
内容的提问来源于stack exchange,提问作者sdanzig
相关产品推荐
相关产品推荐

