2015-11-16 4 views
1

Я пытаюсь защитить свою веб-службу, запущенную на Jetty. Служба была реализована с использованием sparkjava v.2.3, которая имеет специальную команду для этой цели:Недопустимый формат хранилища ключей при попытке использовать защищенную команду sparkjava

secure(keystoreFile, keystorePassword, truststoreFile, truststorePassword); 

Таким образом, я использовал эту команду и генерируется хранилище файлов с помощью утилиты Keytool:

keytool -genkeypair -keystore keystore.jks -alias $MYHOST -keyalg RSA -keysize 2048 -dname "CN=$MYHOST" 

При условии пароля и получил этот keystore.jks файл, однако, когда я пытаюсь начать свою службу я получаю следующее исключение:

java.io.IOException: Invalid keystore format 
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650) ~[na:1.8.0_45] 
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55) ~[na:1.8.0_45] 
at java.security.KeyStore.load(KeyStore.java:1445) ~[na:1.8.0_45] 
at org.eclipse.jetty.util.security.CertificateUtils.getKeyStore(CertificateUtils.java:52) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.ssl.SslContextFactory.loadTrustStore(SslContextFactory.java:1046) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.ssl.SslContextFactory.doStart(SslContextFactory.java:338) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.server.SslConnectionFactory.doStart(SslConnectionFactory.java:64) ~[jetty-server-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:260) ~[jetty-server-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) ~[jetty-server-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:244) ~[jetty-server-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.server.Server.doStart(Server.java:384) ~[jetty-server-9.3.3.v20150827.jar:9.3.3.v20150827] 
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) ~[jetty-util-9.3.3.v20150827.jar:9.3.3.v20150827] 
at spark.webserver.JettySparkServer.ignite(JettySparkServer.java:131) ~[spark-core-2.3.jar:na] 
at spark.SparkInstance.lambda$init$0(SparkInstance.java:341) [spark-core-2.3.jar:na] 
at spark.SparkInstance$$Lambda$7/1326393666.run(Unknown Source) [spark-core-2.3.jar:na] 
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45] 

ИМХО keyst ore.jks действителен, поскольку сертификат, сгенерированный из него, был успешно установлен. Исследуя проблему дальше, я смотрю на исходный код sun.security.provider.JavaKeyStore и увидеть следующий код:

645    int xMagic = dis.readInt(); 
    646    int xVersion = dis.readInt(); 
    647 
    648    if (xMagic!=MAGIC || 
    649     (xVersion!=VERSION_1 && xVersion!=VERSION_2)) { 
    650     throw new IOException("Invalid keystore format"); 
    651    } 
    652 

упомянутых выше констант, определенных в том же файле:

68  private static final int MAGIC = 0xfeedfeed; 
    69  private static final int VERSION_1 = 0x01; 
    70  private static final int VERSION_2 = 0x02; 
    71 

Теперь я открываю keystore.jks файл с помощью утилиты шестнадцатеричного и увидеть в верхней части его:

$ hexdump -C keystore.jks 
00000000 fe ed fe ed 00 00 00 02 00 00 00 01 00 00 00 01 |................| 

Итак, основываясь на том, что я вижу переменную xMagic равна константе MAGIC, а xVersion равно VERSION_2. Это исключение не должно вызывать, но это так.

Если кто-то может пролить свет на то, что мне не хватает здесь, и как заставить его работать, я буду очень благодарен.

+0

Я только что проверил ключевой файл, который в настоящее время работает, и имеет тот же hexdump в первой строке, которую вы показываете, поэтому нет проблемы. Вы уверены, что указываете на запись в нужное место? –

+0

Да, я. В противном случае это вызовет FileNotFoundException или что-то вроде этого. Согласно stacktrace, он считывает эти два целых числа из DataInputStream. –

+0

Возможно, вы могли бы поставить точку останова и посмотреть, какие значения? –

ответ

0

Я нашел причину проблемы. Файл Keystore был в порядке, но truststore был поврежден. К сожалению, он использует тот же кусок кода для проверки и не указывает в сообщении об ошибке, в котором он находится. Было бы полезно, если команда разработчиков Spark в следующем выпуске включит эту информацию в сообщение об исключении.

Смежные вопросы