一、java生成keystore密钥对

1、打开jdk的bin目录,使用keytool工具生成keystore密钥对

Keytool 是一个 Java 数据证书的管理工具 ,Keytool 将密钥(key)和证书(certificates)存储于一个称为 keystore 的密钥库文件中。

2、可查看帮助命令参考

keytool -help

(1)-genkeypair

-genkeypair命令可以产生密钥对(一个公钥与关联的私钥),将公钥打包至X.509 v3自签名证书中,证书以单元素证书链的形式存储。该证书链与私钥存储在密钥库的新条目中,通过-alias选项进行标识

(2)-genseckey

可以创建一个秘密密钥并将其存储在新的SecretKeyEntry中,通过-alias选项进行标识。

(3)-importcert

读取file选项指定的证书或证书链(证书链为PKCS#7格式回复),并将其保存至密钥库中alias选项指定的条目中。若未指定file选项,则从标准输入读取证书或PKCS#7回复。

keytool可以导入X.509版本1、版本2、版本3的证书,以及PKCS#7格式的证书组成的证书链。被导入的数据需要为二进制格式,或可打印的编码格式(即Base64编码)。当导入Base64编码格式的证书时,证书数据的头部需要以"-----BEGIN"开头,尾部需要以"-----END"开头。

以下两种情况需要将证书导入密钥库:

a.将证书添加到密钥库的受信任证书列表中;
b.将提交给CA的证书签名请求对应的CA返回的证书回复导入密钥库。

在早期的版本中,该命令的名字为-import。在当前版本与以后的版本中,旧名称仍然被支持,但推荐使用新名字-importcer

(4)-list

用于打印-alias选项标识的密钥库条目的内容。如果未指定-alias选项,密钥库的全部内容将会被打印。

该命令默认打印证书的MD5指纹。当指定了-v选项时,会使用可读的形式进行打印,包含额外的信息,如所有者、所有者、序列号等。当指定了-rfc选项时,证书内容会以Internet RFC 1421标准定义的可打印编码格式进行输出。

-v与-rfc选项不可以同时指定。

(5)-printcert

从-file选项指定的文件中读取证书,并将其内容以可读的形式进行指定。若未指定-file选项,则从标准输入读取证书。

被查看的证书可为二进制编码形式或Internet RFC 1421标准定义的可打印编码格式。

(6)-delete

用于从密钥库中删除-alias选项对应的条目。当未指定-alias选项时,将会提示输入。

(7)-storepass

storepass选项对应的密码用于保护密钥库的完整性。storepass必须为至少6个字节。当需要操作密钥库内容时,所有的命令都需要指定storepass选项。对于这些命令,如果-storepass选项未在命令行中指定,keytool将会提示用户。

当从密钥库检索信息时,密码是可选的;如果不指定密码,被检索信息的完整性将无法检查,且会有警告显示。

3、相关选项默认值:

(1)-alias

指定密钥库操作的条目对应的别名,默认值为"mykey"。

(2)-keyalg

keyalg选项指定生成密钥对或私钥时使用的算法,1.6版本后默认值与生成秘钥的命令有关。如下:

JRE版本keyalg默认值
1.5DSA
1.6DSA(-genkeypair) & DES(-genseckey)
1.7DSA(-genkeypair) & DES(-genseckey)
1.8DSA(-genkeypair) & DES(-genseckey)

(3)-keystore

指定密钥库文件位置,默认值为用户目录(C:\Users\Administrator)的.keystore文件。

(4)-sigalg

sigalg选项指定对自签名证书或证书签名请求进行签名时使用的算法,sigalg对应的算法需要与keyalg对应的算法兼容。在生成公/私钥对时,sigalg选项对应的签名算法从底层私钥的算法衍生而来。

JRE版本sigalg选项默认值
1.5SHA1withDSA(底层私钥为DSA类型),MD5withRSA(底层私钥为RSA类型)
1.6SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型)
1.7SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型),SHA256withECDSA (底层私钥为EC类型)
1.8SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型),SHA256withECDSA (底层私钥为EC类型)

(5)-keysize

指定生成的密钥长度,默认值如下:

JRE版本keysize默认值
1.51024
1.6

1024 (使用-genkeypair)

56 (使用-genseckey且-keyalg选项为"DES")

168 (使用-genseckey且-keyalg选项为"DESede")

1.7

2048 (使用-genkeypair且-keyalg为"RSA")

1024 (使用-genkeypair且-keyalg为"DSA")

256 (使用-genkeypair且-keyalg为"EC")

56 (使用-genseckey且-keyalg为"DES")

168 (使用-genseckey且-keyalg为"DESede")

1.8

2048 (使用-genkeypair且-keyalg为"RSA")

1024 (使用-genkeypair且-keyalg为"DSA")

256 (使用-genkeypair且-keyalg为"EC")

56 (使用-genseckey且-keyalg为"DES")

168 (使用-genseckey且-keyalg为"DESede")

(6)-validity

指定有效期,单位为天,默认值为90

(7)-storetype

指定密钥库的存储类型,默认值为Java安全属性文件java.security中的"keystore.type"属性值(jks)

秘钥说明:

JKS:

KS是内置的默认密钥库实现类型,由Sun Microsystems提供。JKS类型将密钥库以文件形式实现,利用专有的密钥库类型。它对每个私钥使用其私有的密码进行保护,同时对整个密钥库使用一个密码(有可能不同)保护其完整性。密钥库类型名称不区分大小写。例如,“jks"被认为等同于"JKS”。

JCEKS:

"JCEKS"是另一种替代的专用密钥库格式,与"JKS"相比,"JCEKS"使用更健全的加密方式,使用基于口令的3DES加密。

Sun的"JCEKS"实现可以对"JKS"密钥库解析并转换为"JCEKS"格式。你可以将"JKS"类型的密钥库升级为"JCEKS"类型,通过修改密钥库中私钥条目的密码,需要指定"-storetype jceks"作为密钥库类型。

PKCS12:

"PKCS12"是另一种选项,这是一种跨平台的密钥库,基于RSA PKCS12个人信息交换标准。这个标准主要用于存储或传输用户的私钥、证书以及各种秘密。

DKS:
"dks"是域密钥库,它是密钥库的集合,表现为一个逻辑上单独的密钥库

PKCS11:

当密钥库的类型为pkcs11时,为支持PKCS#11令牌的密钥库。

JDK版本支持的秘钥库类型
1.5JKS,PKCS12
1.6JKS,PKCS12,JCEKS
1.7JKS,PKCS12,JCEKS
1.8JKS,PKCS12,JCEKS,DKS,PKCS11

4、生成密钥对命令

keytool –genkeypair –alias tomcat –keyalg "RSA" –keysize 2048 –sigalg SHA256withRSA –validity 3650 –keystore D:\tomcat.keystore –storetype pkcs12
# 秘钥库别名tomcat
# 使用的算法RSA
# 生成秘钥的长度 2048
# 签名算法SHA256withRSA
# 有限期3650天
# 秘钥库文件位置 d盘
# 秘钥库存储类型 pscs12(默认jks)

输入秘钥库口令:必须为至少6个字节

其他例如名字组织等,随便填写。

二、tomcat配置https访问

打开tomcat的conf目录,编辑配置文件server.xml,取消connector标签注释,添加如下配置,如需其他配置请自行添加:

SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
clientAuth="false"
sslProtocol="TLS"
keystoreFile="生成的证书文件地址"
keystorePass="密钥库口令"

此时运行tomcat服务后,可通过https及配置中的端口访问服务。

三、漏洞修复

1、远程服务接受使用 TLS 1.0 加密的连接

TLS 1.0 具有若干加密设计缺陷。现如今的 TLS 1.0 实施缓解了这些问题,不过应尽可能使用诸如 1.2 和 1.3 等较新的 TLS 版本,其专为应对这些缺陷而设计。
自 2020 年 3 月 31 日起,主流 Web 浏览器和供应商将无法再正常使用未启用 TLS 1.2 及更高版本的端点。

在tomcat的conf/server.xml配置中,修改配置:

sslEnabledProtocols="TLSv1.2"

 在jdk安装目录下jre/lib/security/java.security中修改以下配置:

jdk.tls.disabledAlgorithms=SSLv2Hello, SSLv3, TLSv1, TLSv1.1

2、无法信任该服务的 SSL 证书

访问显示证书错误或失效

点击查看证书

 默认下一步到此处,指定证书文件位置和名称

 

 

以管理员身份运行命令提示符窗口:

进入jdk下的bin目录,执行证书-导入命令:

keytool –import –v – trustcacerts –alias tomcat –keystore jre路径/lib/security/cacerts –file D:/tomcat.cer –storepass changeit

# 当指定了-trustcacerts选项时,cacerts文件中的证书也会作为受信任证书参与上述验证
# 库密钥storepass默认口令输:changeit

 window + R打开运行窗口,输入mmc

 文件 --》添加控制单元

 点击证书后,选择添加,默认下一步即可。

 

如图,在受信任的根证书颁发机构处下,右击证书选择导入,

 找到cer证书

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐