生成自己的数字证书使网站支持HTTPS

生成自己的数字证书使网站支持HTTPS

    • 一、了解keytool命令
    • 二、为服务器端生成证书
    • 三、为客户端生成证书
    • 四、让客户端和服务器相互信任
      • 1. 让服务器信任客户端
      • 2. 让客户端信任服务器
    • 五、SpringBoot WEB项目配置
        • 1. 在application.properties文件中进行SSL配置
        • 2. 访问
        • 3. http请求重定向到https端口

一、了解keytool命令

进入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

四、让客户端和服务器相互信任

1. 让服务器信任客户端

  1. 客户端证书导出为一个单独的CER文件
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> 中的证书
  1. 将该文件导入到服务器的证书库,添加为一个信任证书
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。

2. 让客户端信任服务器

  1. 服务器证书导出为一个单独的CER文件
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。
  1. 双击server.cer文件,按照提示安装证书,将证书加入到“受信任的根证书颁发机构”

    如图,我们执行完上述过程,可以看到我们的目录下有如下文件
    生成自己的数字证书使网站支持HTTPS_第1张图片

双击server.cer,一路next,完成安装

五、SpringBoot WEB项目配置

1. 在application.properties文件中进行SSL配置

server.port=8080
server.ssl.key-store=E:/keys/spring.keystore
server.ssl.key-store-password=123456

我们继续使用8080端口(https默认应该是443,http默认是80),然后填入我们服务器端证书的位置和我们的密码

2. 访问

此时,在我们的浏览器中使用https访问我们的数据可以发现能够正常访问了
生成自己的数字证书使网站支持HTTPS_第2张图片

此时,如果我们继续使用http访问,会发现报错,信息如下所示

Bad Request
This combination of host and port requires TLS.

3. http请求重定向到https端口

第二步中我们使用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;
	}
}

你可能感兴趣的:(生成自己的数字证书使网站支持HTTPS)