如何让我的密钥库文件与我的 Java Vert.x 项目一起工作(无效的密钥库格式)

How to get my Keystore file to work with my Java Vert.x project (Invalid keystore format)

我有一个 Java Vert.x Gradle 项目,我正在尝试让 Vert.x auth JWT 使用它,但是当我 运行 我的项目我收到 Invalid keystore format 错误。

我正在尝试在本地执行此操作;我在 iMac 上。

这是我的 build.gradle 文件的一部分:

build.gradle

// Import to replace ant-style tokens (@environmentVariable@) with values
import org.apache.tools.ant.filters.ReplaceTokens

buildscript {
  ext.vertxVersion = '3.5.4'
}

dependencies {
  compile "io.vertx:vertx-core:$vertxVersion"
  compile "io.vertx:vertx-web:$vertxVersion"
  compile "io.vertx:vertx-web-client:$vertxVersion"
  compile "io.vertx:vertx-web-templ-thymeleaf:3.5.4"
  compile "io.vertx:vertx-unit:$vertxVersion"
  compile 'io.vertx:vertx-auth-jwt:3.5.4'
  compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.1'
  compile "org.slf4j:slf4j-api:1.7.25"
  testCompile group: 'junit', name: 'junit', version: '4.12'
  implementation 'com.google.code.gson:gson:2.8.5'
}

//Replace ant-style tokens with properties.
processResources {
    filter( ReplaceTokens, tokens:  properties )
}

下面是我在 Vert.x verticle 中的实现方式。

MainVerticle.java

JWTAuthOptions config = new JWTAuthOptions();
config.setKeyStore(new KeyStoreOptions()
        .setType(Constants.KEY_STORE_TYPE) /* = "jceks" */
        .setPath(Constants.KEY_STORE_PATH) /* = "keystore.jceks" */
        .setPassword(Constants.AUTH_KEY_STORE_PASSWORD)); /* correct password */

JWTAuth provider = JWTAuth.create(vertx, config);

router.route(Constants.HOME_PAGE + "/*").handler(JWTAuthHandler.create(provider));

这里是我保存 keystore.jceks 文件的地方:

keystore.jceks

My-Project
  |----src
        |----main
              |----resources
                      |----keystore.jceks

我首先使用 gradle:

构建我的项目
$ ./gradlew clean build

构建我的项目工作正常。然后我尝试 运行 我的项目:

$ java -jar build/libs/MyProject-far-1.0.jar

当我 运行 我的项目时,出现以下错误:

java.lang.RuntimeException: java.io.IOException: Invalid keystore format
at io.vertx.ext.auth.jwt.impl.JWTAuthProviderImpl.<init>(JWTAuthProviderImpl.java:107)
at io.vertx.ext.auth.jwt.JWTAuth.create(JWTAuth.java:56)
at com.ucg.warehouselocationmapping.app.MainVerticle.start(MainVerticle.java:54)
at io.vertx.core.impl.DeploymentManager.lambda$doDeploy(DeploymentManager.java:491)
at io.vertx.core.impl.ContextImpl.lambda$wrapTask(ContextImpl.java:339)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
at io.netty.util.concurrent.SingleThreadEventExecutor.run(SingleThreadEventExecutor.java:886)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:745)

我参考了this如何实现Vert.x auth JWT,以及另一个项目的代码。

我正在使用的 keystore.jceks 文件是从另一个完美运行的项目复制而来的。它首先是通过在 Eclipse 周围拖动它来复制的。当这不起作用时,我尝试在终端中复制它:

$ cp /Users/Me/workspace/My-Service/src/main/resources/keystore.jceks /Users/Me/workspace/My-Project/src/main/resources

那没有用,所以我尝试通过 Finder 复制它。那也没用。

以前有人遇到过这个问题吗?我不太熟悉 jks/jceks 文件或身份验证。

回答

import org.apache.tools.ant.filters.ReplaceTokens 插件在我的 keystore.jceks 文件中找到 @ 符号并操纵它们,而我真的只想在我的属性文件中替换 ant 样式的标记。我更新了 build.gradle 文件以仅替换以 .properties 结尾的文件,这解决了我的问题。

//Replace ant-style tokens with properties.
processResources {
    filesMatching('**/*.properties') {
        filter( ReplaceTokens, tokens:  properties )
    }
}

import org.apache.tools.ant.filters.ReplaceTokens 插件在我的 keystore.jceks 文件中找到 @ 符号并操纵它们,而我真的只想在我的属性文件中替换 ant 样式的标记。我更新了 build.gradle 文件以仅替换以 .properties 结尾的文件,这解决了我的问题。

//Replace ant-style tokens with properties.
processResources {
    filesMatching('**/*.properties') {
        filter( ReplaceTokens, tokens:  properties )
    }
}