Конфигурирование Spring Boot с HTTPS с использованием предоставляемого HSM хранилища ключей приводит к ошибке
Стандартная конфигурация, позволяющая Java использовать хранилище ключей на основе HSCS PKCS#11, заключается в том, чтобы ничего не настраивать для пути хранилища ключей (оставить его пустым) и настраивать безопасность Java, чтобы получить поставщика безопасности PKCS 11. Более подробная информация (с Sun/Oracle JVM) доступна здесь. Документы Java по хранилищу ключей указывают - чтобы создать пустое хранилище ключей или если хранилище ключей не может быть инициализировано из потока, передайте значение null в качестве аргумента потока. (Ссылка: здесь) Однако выполнение Spring Boot приводит к следующему исключению:
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is
java.lang.IllegalArgumentException: Resource location must not be null
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:531) ~[spring-context-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.SpringApplication.doRun(SpringApplication.java:347) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:295) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1112) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1101) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at com.example.manager.ManagerApplication.main(ManagerApplication.java:27) [axon-manager-ws-0.3.2-SNAPSHOT.jar:0.3.2-SNAPSHOT] Caused by:
java.lang.IllegalArgumentException: Resource location must not be null
at org.springframework.util.Assert.notNull(Assert.java:115) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.util.ResourceUtils.getURL(ResourceUtils.java:131) ~[spring-core-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.configureSslKeyStore(TomcatEmbeddedServletContainerFactory.java:329) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.configureSsl(TomcatEmbeddedServletContainerFactory.java:312) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.customizeSsl(TomcatEmbeddedServletContainerFactory.java:278) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.customizeConnector(TomcatEmbeddedServletContainerFactory.java:257) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:159) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ~[spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
... 8 more
Похоже, что класс "org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory" не допускает, чтобы путь к хранилищу ключей был нулевым. Он пытается загрузить ресурс по указанному пути.
Версия Spring Boot - 1.3.0. Я посмотрел на последнюю версию, https://github.com/spring-projects/spring-boot/blob/master/spring-boot/src/main/java/org/springframework/boot/context/embedded/tomcat/TomcatEmbeddedServletContainerFactory.java и код, похоже, не изменяются (строка 343). Интересно, что когда код пытается загрузить хранилище доверенных сертификатов, он хорошо защищен (допускает нулевой путь хранилища доверенных сертификатов), см. строку 358.
Это простое исправление - проверить, является ли путь к хранилищу ключей пустым и / или пустым, и разрешить его.
Для всех, кто хочет решить эту проблему, существует обходной путь - путем переопределения метода "configureSsl" org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory "и настройки этого экземпляра как EmbeddedServletContainerFactory в конфигурации приложения.
Вопрос: есть ли другой способ настроить хранилища безопасности / ключей в Spring Boot таким образом, чтобы мне не нужно было переопределять TomcatEmbeddedServletContainerFactory? Или я должен рассмотреть вопрос о регистрации в Spring Boot и предложить патч?