Azure Key Vault秘诀Spring Boot Starter 0.1.5

问题描述

我正在使用旧版本的Azure Key Vault Secrets Spring Boot Starter-0.1.5 还有旧版本的spring-boot-starter,如下所示:

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.15.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>

Azure密钥仓库没有代码更改,在application.properties中,我们添加了以下内容

azure.keyvault.uri=<<keyvault URL>>
azure.client-id=<<keyvault client Id>>
azure.client-key=<<keyvault Key>>

现在,我如下升级了Spring boot starter和azure keyvault的版本:

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
  </parent>

    <dependency>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
      <version>2.3.3</version>
      <scope>runtime</scope>
    </dependency>

application.properties

azure.keyvault.uri=<<keyvault URL>>
azure.keyvault.enabled=true
azure.client-id=<<Client-ID>>
azure.client-key=<<Cleint key>>

它失败并显示以下错误,如果我要升级到最新版本,请您提供帮助。

13:36:59.270 [main]错误org.springframework.boot.SpringApplication-应用程序运行失败 java.lang.IllegalStateException:无法配置keyvault属性源 在com.microsoft.azure.keyvault.spring.keyvaultEnvironmentPostProcessorHelper.addkeyvaultPropertySource(keyvaultEnvironmentPostProcessorHelper.java:110)处 在com.microsoft.azure.keyvault.spring.keyvaultEnvironmentPostProcessor.postProcessEnvironment(keyvaultEnvironmentPostProcessor.java:47) 在org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent(ConfigFileApplicationListener.java:200) 在org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEvent(ConfigFileApplicationListener.java:188) 在org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) 在org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) 在org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) 在org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127) 在org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:80) 在org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53) 在org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345) 在org.springframework.boot.SpringApplication.run(SpringApplication.java:308) 在org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) 在org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) 在com.honeywell.CaaS.GatewayManagerAPI.webapi.SpringBootMain.main(SpringBootMain.java:47) 原因:java.lang.RuntimeException:最多重试3次。错误详细信息:网络无法访问:连接 在com.azure.core.http.policy.RetryPolicy.lambda $ attemptAsync $ 1(RetryPolicy.java:119) 在Reactor.core.publisher.FluxOnErrorResume $ ResumeSubscriber.onError(FluxOnErrorResume.java:88) 在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.onError(MonoFlatMap.java:165) 在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.onError(MonoFlatMap.java:165) 在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.secondError(MonoFlatMap.java:185) 在Reactor.core.publisher.MonoFlatMap $ FlatMapInner.onError(MonoFlatMap.java:251) 在Reactor.core.publisher.MonopeekTerminal $ MonoTerminalPeekSubscriber.onError(MonopeekTerminal.java:251) 在Reactor.core.publisher.MonopeekTerminal $ MonoTerminalPeekSubscriber.onError(MonopeekTerminal.java:251) 在Reactor.core.publisher.FluxPeekFuseable $ PeekFuseableConditionalSubscriber.onError(FluxPeekFuseable.java:545) 在Reactor.core.publisher.FluxPeekFuseable $ PeekFuseableConditionalSubscriber.onError(FluxPeekFuseable.java:545) 在reactor.core.publisher.Operators.error(Operators.java:196) 在Reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:134) 在reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) 在reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57) 在reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) 在Reactor.core.publisher.MonoFlatMap $ FlatMapMain.onNext(MonoFlatMap.java:150) 在reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) 在reactor.core.publisher.FluxMapFuseable $ MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) 在Reactor.core.publisher.FluxPeekFuseable $ PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:203) 在Reactor.core.publisher.Operators $ MonoSubscriber.complete(Operators.java:1782) 在reactor.core.publisher.MonoSingle $ SingleSubscriber.onComplete(MonoSingle.java:171) 在reactor.core.publisher.Operators $ Scalarsubscription.request(Operators.java:2346) 在Reactor.core.publisher.MonoFlatMapMany $ FlatMapManyMain.onSubscribeInner(MonoFlatMapMany.java:143)上 在reactor.core.publisher.MonoFlatMapMany $ FlatMapManyMain.onNext(MonoFlatMapMany.java:182) 在Reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) 在reactor.core.publisher.Fluxretrywhen $ retrywhenMainSubscriber.onNext(Fluxretrywhen.java:162) 在Reactor.core.publisher.MonoCreate $ DefaultMonoSink.success(MonoCreate.java:156) 在react.netty.http.client.HttpClientConnect $ HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:432) 在react.netty.ReactorNetty $ CompositeConnectionObserver.onStateChange(ReactorNetty.java:518) 在react.netty.resources.PooledConnectionProvider $ disposableAcquire.onStateChange(PooledConnectionProvider.java:561) 在react.netty.resources.PooledConnectionProvider $ PooledConnection.onStateChange(PooledConnectionProvider.java:448) 在react.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:594) 在react.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:96) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) 在io.netty.channel.CombinedChannelDuplexHandler $ DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) 在io.netty.handler.codec.BytetoMessageDecoder.fireChannelRead(BytetoMessageDecoder.java:324) 在io.netty.handler.codec.BytetoMessageDecoder.fireChannelRead(BytetoMessageDecoder.java:311) 在io.netty.handler.codec.BytetoMessageDecoder.callDecode(BytetoMessageDecoder.java:425) 在io.netty.handler.codec.BytetoMessageDecoder.channelRead(BytetoMessageDecoder.java:276) 在io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) 在io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1526) 在io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1287) 在io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1324) 在io.netty.handler.codec.BytetoMessageDecoder.decodeRemovalReentryProtection(BytetoMessageDecoder.java:501) 在io.netty.handler.codec.BytetoMessageDecoder.callDecode(BytetoMessageDecoder.java:440) 在io.netty.handler.codec.BytetoMessageDecoder.channelRead(BytetoMessageDecoder.java:276) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) 在io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead(DefaultChannelPipeline.java:1410) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) 在io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) 在io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read(AbstractNioByteChannel.java:163) 在io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) 在io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) 在io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) 在io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) 在io.netty.util.concurrent.SingleThreadEventExecutor $ 4.run(SingleThreadEventExecutor.java:989) 在io.netty.util.internal.ThreadExecutorMap $ 2.run(ThreadExecutorMap.java:74) 在io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在java.lang.Thread.run(Thread.java:748) 由以下原因引起:java.net.socketException:网络无法访问:connect 在java.net.DualStackPlainSocketImpl.waitForConnect(本机方法) 在java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) 在java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 在java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 在java.net.socksSocketImpl.connect(SocksSocketImpl.java:392) 在java.net.socket.connect(Socket.java:606) 在sun.net.NetworkClient.doConnect(NetworkClient.java:175) 在sun.net.www.http.HttpClient.openServer(HttpClient.java:463) 在sun.net.www.http.HttpClient.openServer(HttpClient.java:558) 在sun.net.www.http.HttpClient。(HttpClient.java:242) 在sun.net.www.http.HttpClient.New(HttpClient.java:339) 在sun.net.www.http.HttpClient.New(HttpClient.java:357) 在sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226) 在sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162) 在sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056) 在sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990) 在com.azure.identity.implementation.IdentityClient.lambda $ checkImdsAvailable $ 14(IdentityClient.java:463) 在Reactor.core.publisher.MonoCallable.call(MonoCallable.java:91) 在reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:126)

解决方法

似乎您错过了application.properties中的属性azure.keyvault.tenant-id

我已重现此错误 java.lang.IllegalStateException:无法配置KeyVault属性源。参见:

enter image description here

在文件中添加azure.keyvault.tenant-id=<your-tenant-id>之后。它的工作原理:

enter image description here


我指的是How to use the Spring Boot Starter for Azure Key Vaultsample。要使其正常工作,请确保该应用程序有权获取和列出密钥库访问策略中的机密。

application.properties

azure.keyvault.enabled=true
azure.keyvault.uri=https://{your-azure-keyvault}.vault.azure.net/
azure.keyvault.client-id=put-your-azure-client-id-here
azure.keyvault.client-key=put-your-azure-client-key-here
azure.keyvault.tenant-id=put-your-azure-tenant-id-here

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <java.version>11</java.version>
    <azure.version>2.3.3</azure.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-spring-boot-bom</artifactId>
            <version>${azure.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

DemoKeyVaultApplication.java

@SpringBootApplication
@RestController
public class DemoKeyVaultApplication implements CommandLineRunner {

   @Value("${test1}")
   private String testSecretName;

   
    public static void main(final String[] args) {
        SpringApplication.run(DemoKeyVaultApplication.class,args);
    }

    public void run(final String... varl) throws Exception {        
        System.out.println("testSecretName stored in Azure Key Vault: " + testSecretName);
    }
}