Spring boot未能在tomcat 7上加载密钥库类型JKS,原因是;文件名、目录名或卷标语法不正确;
我将在spring boot中设置SSL。但是,它无法启动,并引发下面的异常Spring boot未能在tomcat 7上加载密钥库类型JKS,原因是;文件名、目录名或卷标语法不正确;,tomcat,ssl,spring-boot,Tomcat,Ssl,Spring Boot,我将在spring boot中设置SSL。但是,它无法启动,并引发下面的异常 ERROR JSSESocketFactory - Failed to load keystore type JKS with path C:\Users\user\AppData\Local\Temp\tomcat.5953177593073698207.443\file:/D:/workspace-spring/project/keystore.jks due to C:\Users\user\AppData\Lo
ERROR JSSESocketFactory - Failed to load keystore type JKS with path C:\Users\user\AppData\Local\Temp\tomcat.5953177593073698207.443\file:/D:/workspace-spring/project/keystore.jks due to C:\Users\user\AppData\Local\Temp\tomcat.5953177593073698207.443\file:\D:\workspace-spring\project\keystore.jks (The filename, directory name, or volume label syntax is incorrect)
java.io.FileNotFoundException: C:\Users\user\AppData\Local\Temp\tomcat.5953177593073698207.443\file:\D:\workspace-spring\project\keystore.jks (The filename, directory name, or volume label syntax is incorrect)
at java.io.FileInputStream.open(Native Method) ~[na:1.6.0_45]
at java.io.FileInputStream.<init>(FileInputStream.java:120) ~[na:1.6.0_45]
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getStore(JSSESocketFactory.java:413) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeystore(JSSESocketFactory.java:319) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:577) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.tomcat.util.net.jsse.JSSESocketFactory.getKeyManagers(JSSESocketFactory.java:517) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:493) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:653) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:449) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1007) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.apache.catalina.core.StandardService.addConnector(StandardService.java:241) [tomcat-embed-core-7.0.59.jar:7.0.59]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.addPreviouslyRemovedConnectors(TomcatEmbeddedServletContainer.java:194) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.start(TomcatEmbeddedServletContainer.java:151) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.startEmbeddedServletContainer(EmbeddedWebApplicationContext.java:290) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.finishRefresh(EmbeddedWebApplicationContext.java:141) [spring-boot-1.3.0.RELEASE.jar:1.3.0.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:540) [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 biz.tfsystem.questionnaire.manager.Application.main(Application.java:32) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_45]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_45]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_45]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_45]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-1.3.0.RELEASE.jar:1.3.0.RELEASE]
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.programmingfree</groupId>
<artifactId>pf-securing-web</artifactId>
<version>0.1.0</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<artifactId>javax.transaction-api</artifactId>
<groupId>javax.transaction</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.transaction</groupId>
<artifactId>jboss-transaction-api_1.2_spec</artifactId>
<version>1.0.0.Final</version>
</dependency>
</dependencies>
<properties>
<java.version>1.6</java.version>
<tomcat.version>7.0.59</tomcat.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
4.0.0
org.programmingfree
在Java6项目中启用HTTPS
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File keystore = new ClassPathResource("keystore.jks").getFile();
File truststore = new ClassPathResource("keystore.jks").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass("<password>");
protocol.setTruststoreFile(truststore.getAbsolutePath());
protocol.setTruststorePass("<password>");
protocol.setKeyAlias("<alias>");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + "keystore"
+ "] or truststore: [" + "keystore" + "]", ex);
}
}
@Bean
公共嵌入的ServletContainerFactory servletContainer(){
TomcatEmbeddedServletContainerFactory tomcat=新的TomcatEmbeddedServletContainerFactory();
addAdditionalTomcatConnectors(createSslConnector());
返回tomcat;
}
专用连接器createSslConnector(){
连接器连接器=新连接器(“org.apache.coyote.http11.Http11NioProtocol”);
Http11NioProtocol协议=(Http11NioProtocol)连接器。getProtocolHandler();
试一试{
File keystore=new ClassPathResource(“keystore.jks”).getFile();
File truststore=new ClassPathResource(“keystore.jks”).getFile();
连接器。设置模式(“https”);
连接器。设置安全(正确);
连接器。设置端口(8443);
协议。设置可启用(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
协议。setKeystorePass(“”);
protocol.setTruststoreFile(truststore.getAbsolutePath());
协议。setTruststorePass(“”);
协议。setKeyAlias(“”);
返回连接器;
}
捕获(IOEX异常){
抛出新的IllegalStateException(“无法访问密钥库:[“+”密钥库”
+“]或信任库:[“+”密钥库“+”],例如);
}
}
您需要使用更为更新的Tomcat 7版本。在编写最新版本时是7.0.67。将tomcat更新到7.0.67版后,它抛出java.lang.NoClassDefFoundError:java/nio/charset/StandardCharset。它是。不会引发此异常的最新tomcat是7.0.59。很抱歉,在这种情况下,您必须自己配置SSL。SpringBoot依赖于7.0.66及更高版本的更改,Tomcat声明Tomcat7只需要Java6。您确定是Tomcat本身需要StandardCharsets
?spring boot starter web依赖于Tomcat embed websocket,根据Tomcat的定义,它需要Java 7。我认为这就是为什么SpringBoot在中指定Tomcat7.0.59的原因。好的,我现在能够在SpringBoot中使用HTTPS示例。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.programmingfree</groupId>
<artifactId>pf-securing-web</artifactId>
<version>0.1.0</version>
<packaging>war</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<exclusions>
<exclusion>
<artifactId>javax.transaction-api</artifactId>
<groupId>javax.transaction</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.spec.javax.transaction</groupId>
<artifactId>jboss-transaction-api_1.2_spec</artifactId>
<version>1.0.0.Final</version>
</dependency>
</dependencies>
<properties>
<java.version>1.6</java.version>
<tomcat.version>7.0.59</tomcat.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-releases</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</pluginRepository>
</pluginRepositories>
</project>
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector());
return tomcat;
}
private Connector createSslConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
try {
File keystore = new ClassPathResource("keystore.jks").getFile();
File truststore = new ClassPathResource("keystore.jks").getFile();
connector.setScheme("https");
connector.setSecure(true);
connector.setPort(8443);
protocol.setSSLEnabled(true);
protocol.setKeystoreFile(keystore.getAbsolutePath());
protocol.setKeystorePass("<password>");
protocol.setTruststoreFile(truststore.getAbsolutePath());
protocol.setTruststorePass("<password>");
protocol.setKeyAlias("<alias>");
return connector;
}
catch (IOException ex) {
throw new IllegalStateException("can't access keystore: [" + "keystore"
+ "] or truststore: [" + "keystore" + "]", ex);
}
}