一、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.5 | DSA |
1.6 | DSA(-genkeypair) & DES(-genseckey) |
1.7 | DSA(-genkeypair) & DES(-genseckey) |
1.8 | DSA(-genkeypair) & DES(-genseckey) |
(3)-keystore
指定密钥库文件位置,默认值为用户目录(C:\Users\Administrator)的.keystore文件。
(4)-sigalg
sigalg选项指定对自签名证书或证书签名请求进行签名时使用的算法,sigalg对应的算法需要与keyalg对应的算法兼容。在生成公/私钥对时,sigalg选项对应的签名算法从底层私钥的算法衍生而来。
JRE版本 | sigalg选项默认值 |
---|---|
1.5 | SHA1withDSA(底层私钥为DSA类型),MD5withRSA(底层私钥为RSA类型) |
1.6 | SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型) |
1.7 | SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型),SHA256withECDSA (底层私钥为EC类型) |
1.8 | SHA1withDSA (底层私钥为DSA类型),SHA256withRSA (底层私钥为RSA类型),SHA256withECDSA (底层私钥为EC类型) |
(5)-keysize
指定生成的密钥长度,默认值如下:
JRE版本 | keysize默认值 |
---|---|
1.5 | 1024 |
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.5 | JKS,PKCS12 |
1.6 | JKS,PKCS12,JCEKS |
1.7 | JKS,PKCS12,JCEKS |
1.8 | JKS,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证书