进入java安装目录的bin文件中,执行dir命令,我们可以看到有一个keytool的可执行程序。我们就是用这个来生成 我们所需要的数字证书
D:\Program Files\Java\jdk1.8.0_201\bin>dir
驱动器 D 中的卷是 软件
卷的序列号是 9E34-493B
D:\Program Files\Java\jdk1.8.0_201\bin 的目录
2019/02/20 20:12 <DIR> .
2019/02/20 20:12 <DIR> ..
2019/02/20 20:12 16,728 appletviewer.exe
2019/02/20 20:12 17,240 extcheck.exe
2019/02/20 20:12 17,240 idlj.exe
2019/02/20 20:12 35,160 jabswitch.exe
2019/02/20 20:12 16,728 jar.exe
2019/02/20 20:12 17,240 jarsigner.exe
2019/02/20 20:12 16,728 java-rmi.exe
2019/02/20 20:12 207,704 java.exe
2019/02/20 20:12 16,728 javac.exe
2019/02/20 20:12 17,240 javadoc.exe
2019/02/20 20:12 149,336 javafxpackager.exe
2019/02/20 20:12 16,728 javah.exe
2019/02/20 20:12 16,728 javap.exe
2019/02/20 20:12 149,336 javapackager.exe
2019/02/20 20:12 208,216 javaw.exe
2019/02/20 20:12 354,648 javaws.exe
2019/02/20 20:12 16,728 jcmd.exe
2019/02/20 20:12 17,752 jconsole.exe
2019/02/20 20:12 17,240 jdb.exe
2019/02/20 20:12 16,728 jdeps.exe
2019/02/20 20:12 16,728 jhat.exe
2019/02/20 20:12 17,240 jinfo.exe
2019/02/20 20:12 16,728 jjs.exe
2019/02/20 20:12 175,960 jli.dll
2019/02/20 20:12 17,240 jmap.exe
2019/02/20 20:12 322,392 jmc.exe
2019/02/20 20:12 417 jmc.ini
2019/02/20 20:12 16,728 jps.exe
2019/02/20 20:12 17,240 jrunscript.exe
2019/02/20 20:12 17,240 jsadebugd.exe
2019/02/20 20:12 17,240 jstack.exe
2019/02/20 20:12 16,728 jstat.exe
2019/02/20 20:12 16,728 jstatd.exe
2019/02/20 20:12 197,464 jvisualvm.exe
2019/02/20 20:12 17,240 keytool.exe
2019/02/20 20:12 17,240 kinit.exe
2019/02/20 20:12 17,240 klist.exe
2019/02/20 20:12 17,240 ktab.exe
2019/02/20 20:12 827,728 msvcr100.dll
2019/02/20 20:12 17,240 native2ascii.exe
2019/02/20 20:12 17,240 orbd.exe
2019/02/20 20:12 17,240 pack200.exe
2019/02/20 20:12 17,240 policytool.exe
2019/02/20 20:12 16,728 rmic.exe
2019/02/20 20:12 16,728 rmid.exe
2019/02/20 20:12 17,240 rmiregistry.exe
2019/02/20 20:12 17,240 schemagen.exe
2019/02/20 20:12 17,240 serialver.exe
2019/02/20 20:12 17,240 servertool.exe
2019/02/20 20:12 17,240 tnameserv.exe
2019/02/20 20:12 200,536 unpack200.exe
2019/02/20 20:12 16,728 wsgen.exe
2019/02/20 20:12 17,240 wsimport.exe
2019/02/20 20:12 17,240 xjc.exe
54 个文件 3,545,297 字节
2 个目录 99,847,462,912 可用字节
从打印结果中我们可以看到我们需要的keytool,如果没有的话就要重新安装一下自己的java环境
2019/02/20 20:12 17,240 keytool.exe
我们可以help一下,了解一下keytool命令
D:\Program Files\Java\jdk1.8.0_201\bin>keytool /?
非法选项: /?
密钥和证书管理工具
命令:
-certreq 生成证书请求
-changealias 更改条目的别名
-delete 删除条目
-exportcert 导出证书
-genkeypair 生成密钥对
-genseckey 生成密钥
-gencert 根据证书请求生成证书
-importcert 导入证书或证书链
-importpass 导入口令
-importkeystore 从其他密钥库导入一个或所有条目
-keypasswd 更改条目的密钥口令
-list 列出密钥库中的条目
-printcert 打印证书内容
-printcertreq 打印证书请求的内容
-printcrl 打印 CRL 文件的内容
-storepasswd 更改密钥库的存储口令
使用 "keytool -command_name -help" 获取 command_name 的用法
接下来我们要使用下面这些东西来生成我们的CA,执行命令:
keytool -genkey -alias spring -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore E:/keys/spring.keystore -storepass 123456
运行过程输入必要信息,我随便填写的,最终命令执行成功:
D:\Program Files\Java\jdk1.8.0_201\bin>keytool -genkey -alias spring -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore E:/keys/spring.keystore -storepass 123456
您的名字与姓氏是什么?
[Unknown]: spring
您的组织单位名称是什么?
[Unknown]: spring
您的组织名称是什么?
[Unknown]: spring
您所在的城市或区域名称是什么?
[Unknown]: spring
您所在的省/市/自治区名称是什么?
[Unknown]: spring
该单位的双字母国家/地区代码是什么?
[Unknown]: spring
CN=spring, OU=spring, O=spring, L=spring, ST=spring, C=spring是否正确?
[否]: y
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore E:/keys/spring.keystore -destkeystore E:/keys/spring.keystore -deststoret
ype pkcs12" 迁移到行业标准格式 PKCS12。
执行下面命令
keytool -genkey -alias spring_client -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype PKCS12 -keystore E:/keys/client1.p12 -storepass 123456
执行命令,并输入必要信息,我还是随便写的。过程如下所示
D:\Program Files\Java\jdk1.8.0_201\bin>keytool -genkey -alias spring_client -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -storetype P
KCS12 -keystore E:/keys/client1.p12 -storepass 123456
您的名字与姓氏是什么?
[Unknown]: spring
您的组织单位名称是什么?
[Unknown]: spring
您的组织名称是什么?
[Unknown]: spring
您所在的城市或区域名称是什么?
[Unknown]: spring
您所在的省/市/自治区名称是什么?
[Unknown]: spring
该单位的双字母国家/地区代码是什么?
[Unknown]: spring
CN=spring, OU=spring, O=spring, L=spring, ST=spring, C=spring是否正确?
[否]: y
keytool -export -alias spring_client -keystore E:/keys/client1.p12 -storetype PKCS12 -keypass 123456 -file E:/keys/client.cer
执行如下所示,密码需要重新输入
D:\Program Files\Java\jdk1.8.0_201\bin>keytool -export -alias spring_client -keystore E:/keys/client1.p12 -storetype PKCS12 -keypass 123456 -fil
e E:/keys/client.cer
输入密钥库口令:
存储在文件 /keys/client.cer> 中的证书
keytool -import -v -file E:/keys/client.cer -keystore E:/keys/spring.keystore -storepass 123456
执行过程可以看到如下信息
D:\Program Files\Java\jdk1.8.0_201\bin>keytool -import -v -file E:/keys/client.cer -keystore E:/keys/spring.keystore -storepass 123456
所有者: CN=spring, OU=spring, O=spring, L=spring, ST=spring, C=spring
发布者: CN=spring, OU=spring, O=spring, L=spring, ST=spring, C=spring
序列号: 6a4075dc
有效期为 Thu May 02 17:59:34 CST 2019 至 Fri May 01 17:59:34 CST 2020
证书指纹:
MD5: 38:9A:9F:42:F0:6D:BB:F8:55:CA:DA:EE:F6:C0:EF:1E
SHA1: 2D:AF:DB:7B:44:70:26:61:FF:70:7A:24:C7:B5:42:0A:93:C1:58:70
SHA256: AC:57:24:45:53:38:38:BD:D9:35:E4:36:4E:15:F7:36:C5:BC:86:27:E5:8F:05:D4:B9:95:63:EC:3D:12:C2:AC
签名算法名称: SHA256withRSA
主体公共密钥算法: 1024 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: BD 37 5E E0 7D F7 7A 8E B6 64 20 4A 37 A7 D8 86 .7^...z..d J7...
0010: E0 C4 5F D2 .._.
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
[正在存储E:/keys/spring.keystore]
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore E:/keys/spring.keystore -destkeystore E:/keys/spring.keystore -deststoret
ype pkcs12" 迁移到行业标准格式 PKCS12。
keytool -keystore E:/keys/spring.keystore -export -alias spring -file E:/keys/server.cer
执行过程如下所示,需要输入密码
D:\Program Files\Java\jdk1.8.0_201\bin>keytool -keystore E:/keys/spring.keystore -export -alias spring -file E:/keys/server.cer
输入密钥库口令:
存储在文件 /keys/server.cer> 中的证书
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore E:/keys/spring.keystore -destkeystore E:/keys/spring.keystore -deststoret
ype pkcs12" 迁移到行业标准格式 PKCS12。
双击server.cer,一路next,完成安装
server.port=8080
server.ssl.key-store=E:/keys/spring.keystore
server.ssl.key-store-password=123456
我们继续使用8080端口(https默认应该是443,http默认是80),然后填入我们服务器端证书的位置和我们的密码
此时,在我们的浏览器中使用https访问我们的数据可以发现能够正常访问了
此时,如果我们继续使用http访问,会发现报错,信息如下所示
Bad Request
This combination of host and port requires TLS.
第二步中我们使用http访问时报错,虽然这严格上来说是用户输入错误和服务器无关。但是,更进一步,我们希望即支持http,又支持https;
为了代码更具一般性,我们把https的端口号修改回默认值。
修改方式:添加自定义ServletWebServerFactory,取代默认的设置。我直接添加在了自己的MainApplication中。思路就是把http的默认端口直接重新传到https的默认端口号。修改后代码如下所示。
package com.example.demo;
import org.apache.catalina.connector.Connector;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
@Bean
ServletWebServerFactory servletWebServerFactory() {
TomcatServletWebServerFactory serverFactory = new TomcatServletWebServerFactory();
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(80);
connector.setSecure(false);
connector.setRedirectPort(443);
serverFactory.addAdditionalTomcatConnectors(connector);
return serverFactory;
}
}