From 86fb3db7ef763dde9f2ea071b97856a0fc33fc1e Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Sun, 19 Jan 2020 10:38:43 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20spring-boot-demo-https=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.mvn/wrapper/MavenWrapperDownloader.java | 118 --------------------- .../.mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 - spring-boot-demo-https/README.md | 86 +++++++++++---- spring-boot-demo-https/pom.xml | 12 --- .../https/SpringBootDemoHttpsApplication.java | 21 ++++ .../config/HttpsConfig.java} | 44 +++----- .../src/main/resources/application.yml | 3 +- .../SpringBootDemoHttpsApplicationTests.java | 2 +- 9 files changed, 103 insertions(+), 185 deletions(-) delete mode 100644 spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 spring-boot-demo-https/.mvn/wrapper/maven-wrapper.jar delete mode 100644 spring-boot-demo-https/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-boot-demo-https/src/main/java/com/xkcoding/https/SpringBootDemoHttpsApplication.java rename spring-boot-demo-https/src/main/java/com/xkcoding/{springbootdemohttps/SpringBootDemoHttpsApplication.java => https/config/HttpsConfig.java} (52%) rename spring-boot-demo-https/src/test/java/com/xkcoding/{springbootdemohttps => https}/SpringBootDemoHttpsApplicationTests.java (82%) diff --git a/spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java b/spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index f6e782c..0000000 --- a/spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if (mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if (mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if (!outputFile.getParentFile().exists()) { - if (!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.jar b/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 KcmV+b0RR6000031 literal 50710 zcmV(w#_2gwO9KQH00;;O0000X00000000000000000{s908K?yK`lv6MlS;ZP)i30 z000000ssI200000P)h>@6aWYa2mk;8ApigX0000000000000yK002!zR6#9CPDU?H zK~70VMN?ERO-7ZEK?=e!5JmTa+#wf8s1-%Jv#u%#g2k)NPzh&68yaZAMIDDwmKYnzM5}vn@=iJgpr5A?AyF%}=4?ym ziapS`IFj#iIK{i-EWcqBW&Rl9t|G9UodOuF(EO!#){`u3CeW*>YfZ@6jzCAS6TO@= zQ8=SsQY-hi9@lPEa!Hrz+&f>x*%MGp2M9}{-7%;D001ii002-+0|XQR2nYxO001EX z0000000000000004*&oFO+{2eElEyBFKuCVWo|D608mQ@2mk;800IC20000008mQ< z1QY-W2nYZG03iSX00000000000000P0000@MN~m8Nlr#DZDDq0ZZBzXE_7jQVRC6N z0{~D<2M7QF0006200000002-+0|XQR2nYxO001EX000000000000000CjbBdO+{2e zElEyBFKuCVWo|ENZ!UCUYhiL}FKuCVWo|8Za$#_AWpXbA08mQ@2mk;800IC200000 z08mQ<1QY-W2nYZG03iSX00000000000000r0000@MN~m8Nlr#DZDDq0ZZBzXE_7jQ zVRC6NZDDq0ZY_6mVQ_F|axZXiZ7y(fZ*XODbZKRCD@!dZ&dkrVHPAEFGvi7x$}cVO zOtH<(*DFcPPAtmgN-QeLOiN5I0Se|OmZj$DmKP-!6r>h$0RT`-2MA2GKm|Gg0021v z002-+0|XQR2nYxO001EX0000000000000001ONa4Z*pfZ0{~D<2M7QF0006200000 z002-+0|XQR2nYxO001EX0000000000000003jhEBZ*pfZVQ^t%Xk{-008mQ@2mk;8 z00IC20000008mQ<1QY-W2nYZG03iSX00000000000000H0001Qa%V4LaA9L;WiM@E zc4cla0{~D<2M7QF0006200000002-+0|XQR2nYxO001EX00000000000000082|tP zZ*pfZVQ^t%Xk{;LVRmJ1FL!cbaByXEF9QHjO9u!500002000000000`O9KQH00;;O z0096Y00000000000000005bpp0B>?7$%>rmUG;` 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 zWkYXnc4cyOWpXZKY+-YArIE`{8!;4y|3g9&0xghor;F(>sg#VmV!=g1iCCa;ky2&v zOim}RX2v6r6O^|qD?KpzU>83ID-2qD#rbMyZl``CXU?;imCz+M>(gj1z`SH!{_ zu^WmBNA8Ulam?EF0_paqiQ({CD_byUC;V98A)?ODAXH$Lb0ueTtxv(D_BH{u$t;G$KinWPcaCXQ0ppB1bv}pn$Lh!aoCEUaLgaL{ApJTp!_Q#$IGV@B+p_b;3}xBQmV?1a;F_c)wRL@?$? zi%{*UvG({(rjOG2$h@s|Dtv?e0i>&FBm45!mTl%*Pu4GfzeDBL1`DWKTgr+xEL*$s zEU^AlhJVKD3~tWgLT&BO9J=)eExe+&9Q4aPx}S?~=Ac{isFQ;db~4rO6HrSB2(NbP zvWWoz044(f08mQ-0u%rg00;;O0000X0000000IC20000000{s9000000000000000 z0000@MN~m8Nlr#DP)h*<6aW+e2nYxO001EXOQGE{r~m)}D**ri6aWAK0000000000 z0021v002!zR6#9CPDU?HK~70VMN?ERO-4{l0Rj{N6aWYa2mk;8ApigX0006200000 z000jF000000000000000BLM&aO+{2eElEyBFKuCVWo|D}O928D02BZS2nYZG03iSX z00002000000000P0000000000000000Ac|E08K?yK`lv6MlWq)c4claX>TrcVQXP> zX)jPq0Rj{N6aWYa2mk;8ApigX0006200000001Wd000000000000000s{sH2O+{2e zElEyBFKuCVWo|ENZ!UCUYhiL}FKuCVWo|8Za$#_AWpXc2O928D02BZS2nYZG03iTO zv_J(q0000v0000r00000000000000000II408K?yK`lv6MlWq)c4claX>TrcVQXP> zX)kSIc4clYcXDBHaAk5YaBpocaB^>OWpZ?BWphwV0Rj{N6aWYa2mk;8ApigX00062 z00000000C4000000000000000p8@~?Z*pfZP)h*<6aW+e2nYxO001EX000000ssI2 z000003jhEB0000000000007eh003`tXD?xJVPj}zFHlPX0u%rg00;;O0000X00000 z00IC20000001*HH00000000000000E0{{STa%V4LaA9L;WiM@Ec4claP)h*<6aW+e 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 此 demo 主要演示了 Spring Boot 如何集成 https -* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) -* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/maven-plugin/) +## 1. 生成证书 +首先使用 jdk 自带的 keytool 命令生成证书复制到项目的 `resources` 目录下(生成的证书一般在用户目录下 C:\Users\Administrator\server.keystore) - -1. 首先使用jdk 自带的keytool 命令生成证书(一般在用户目录下C:\Users\Administrator\server.keystore) 复制到项目中 > 自己生成的证书浏览器会有危险提示,去ssl网站上使用金钱申请则不会 ![ssl 命令截图](ssl.png) +## 2. 添加配置 + +1. 在配置文件配置生成的证书 -2. 然后添加配置 -```yml +```yaml server: ssl: # 证书路径 - key-store: spring-boot-demo-https\src\main\resources\server.keystore + key-store: classpath:server.keystore key-alias: tomcat enabled: true key-store-type: JKS @@ -27,18 +26,27 @@ server: key-store-password: 123456 # 浏览器默认端口 和 80 类似 port: 443 -#debug: true - - ``` -3. 需要与http 自动跳转再添加bean +2. 配置 Tomcat ```java - +/** + *

+ * HTTPS 配置类 + *

+ * + * @author yangkai.shen + * @date Created in 2020/1/19 10:31 + */ +@Configuration +public class HttpsConfig { + /** + * 配置 http(80) -> 强制跳转到 https(443) + */ @Bean - public Connector connector(){ - Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol"); + public Connector connector() { + Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(80); connector.setSecure(false); @@ -47,13 +55,13 @@ server: } @Bean - public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){ - TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){ + public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector) { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { - SecurityConstraint securityConstraint=new SecurityConstraint(); + SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); - SecurityCollection collection=new SecurityCollection(); + SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); @@ -62,7 +70,41 @@ server: tomcat.addAdditionalTomcatConnectors(connector); return tomcat; } - +} ``` +## 3. 测试 + +启动项目,浏览器访问 http://localhost 将自动跳转到 https://localhost + +## 4. 参考 + +- `keytool`命令参考 + +```bash +$ keytool --help +密钥和证书管理工具 + +命令: + + -certreq 生成证书请求 + -changealias 更改条目的别名 + -delete 删除条目 + -exportcert 导出证书 + -genkeypair 生成密钥对 + -genseckey 生成密钥 + -gencert 根据证书请求生成证书 + -importcert 导入证书或证书链 + -importpass 导入口令 + -importkeystore 从其他密钥库导入一个或所有条目 + -keypasswd 更改条目的密钥口令 + -list 列出密钥库中的条目 + -printcert 打印证书内容 + -printcertreq 打印证书请求的内容 + -printcrl 打印 CRL 文件的内容 + -storepasswd 更改密钥库的存储口令 + +使用 "keytool -command_name -help" 获取 command_name 的用法 +``` +- [Java Keytool工具简介](https://blog.csdn.net/liumiaocn/article/details/61921014) \ No newline at end of file diff --git a/spring-boot-demo-https/pom.xml b/spring-boot-demo-https/pom.xml index d90ec5e..bfd1b35 100644 --- a/spring-boot-demo-https/pom.xml +++ b/spring-boot-demo-https/pom.xml @@ -3,13 +3,11 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.xkcoding spring-boot-demo-https 0.0.1-SNAPSHOT spring-boot-demo-https Demo project for Spring Boot - com.xkcoding spring-boot-demo @@ -25,22 +23,12 @@ org.springframework.boot - spring-boot-starter - - - org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test - - - org.junit.vintage - junit-vintage-engine - - diff --git a/spring-boot-demo-https/src/main/java/com/xkcoding/https/SpringBootDemoHttpsApplication.java b/spring-boot-demo-https/src/main/java/com/xkcoding/https/SpringBootDemoHttpsApplication.java new file mode 100644 index 0000000..8a96069 --- /dev/null +++ b/spring-boot-demo-https/src/main/java/com/xkcoding/https/SpringBootDemoHttpsApplication.java @@ -0,0 +1,21 @@ +package com.xkcoding.https; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + *

+ * 启动类 + *

+ * + * @author Chen.Chao + * @date Created in 2020/1/12 10:31 + */ +@SpringBootApplication +public class SpringBootDemoHttpsApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootDemoHttpsApplication.class, args); + } + +} diff --git a/spring-boot-demo-https/src/main/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplication.java b/spring-boot-demo-https/src/main/java/com/xkcoding/https/config/HttpsConfig.java similarity index 52% rename from spring-boot-demo-https/src/main/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplication.java rename to spring-boot-demo-https/src/main/java/com/xkcoding/https/config/HttpsConfig.java index be323c3..3d8b9a3 100644 --- a/spring-boot-demo-https/src/main/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplication.java +++ b/spring-boot-demo-https/src/main/java/com/xkcoding/https/config/HttpsConfig.java @@ -1,39 +1,29 @@ -package com.xkcoding.springbootdemohttps; +package com.xkcoding.https.config; import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.context.annotation.Bean; - +import org.springframework.context.annotation.Configuration; /** *

- * SpringBoot启动类 + * HTTPS 配置类 *

* - * @package: com.xkcoding.https - * @description: SpringBoot启动类 - * @author: Chen.Chao - * @date 2020.01.12 10:31 am - * @copyright: Copyright (c) - * @version: V1.0 - * @modified: Chen.Chao + * @author Chen.Chao + * @date Created in 2020/1/12 10:31 */ -@SpringBootApplication -public class SpringBootDemoHttpsApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringBootDemoHttpsApplication.class, args); - } - - +@Configuration +public class HttpsConfig { + /** + * 配置 http(80) -> 强制跳转到 https(443) + */ @Bean - public Connector connector(){ - Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol"); + public Connector connector() { + Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(80); connector.setSecure(false); @@ -42,13 +32,13 @@ public class SpringBootDemoHttpsApplication { } @Bean - public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){ - TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){ + public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector) { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() { @Override protected void postProcessContext(Context context) { - SecurityConstraint securityConstraint=new SecurityConstraint(); + SecurityConstraint securityConstraint = new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL"); - SecurityCollection collection=new SecurityCollection(); + SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); @@ -57,6 +47,4 @@ public class SpringBootDemoHttpsApplication { tomcat.addAdditionalTomcatConnectors(connector); return tomcat; } - - } diff --git a/spring-boot-demo-https/src/main/resources/application.yml b/spring-boot-demo-https/src/main/resources/application.yml index d6d2def..21ad6fc 100644 --- a/spring-boot-demo-https/src/main/resources/application.yml +++ b/spring-boot-demo-https/src/main/resources/application.yml @@ -1,7 +1,7 @@ server: ssl: # 证书路径 - key-store: spring-boot-demo-https\src\main\resources\server.keystore + key-store: classpath:server.keystore key-alias: tomcat enabled: true key-store-type: JKS @@ -9,4 +9,3 @@ server: key-store-password: 123456 # 浏览器默认端口 和 80 类似 port: 443 -#debug: true diff --git a/spring-boot-demo-https/src/test/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplicationTests.java b/spring-boot-demo-https/src/test/java/com/xkcoding/https/SpringBootDemoHttpsApplicationTests.java similarity index 82% rename from spring-boot-demo-https/src/test/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplicationTests.java rename to spring-boot-demo-https/src/test/java/com/xkcoding/https/SpringBootDemoHttpsApplicationTests.java index ce62f83..b8b343e 100644 --- a/spring-boot-demo-https/src/test/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplicationTests.java +++ b/spring-boot-demo-https/src/test/java/com/xkcoding/https/SpringBootDemoHttpsApplicationTests.java @@ -1,4 +1,4 @@ -package com.xkcoding.springbootdemohttps; +package com.xkcoding.https; import org.junit.Test; import org.springframework.boot.test.context.SpringBootTest;