keytool命令详解以及数字签名,信息摘要等概念解释

加密算法

公钥加密算法又称为非对称加密算法,包含一个 公钥-私钥对,称为密钥对 key pair

公钥加密的只能私钥解密, 私钥加密的只能用公钥解密

常用的非对称加密算法有: RSA , DSA

信息摘要

对任意长度的输入内容进行Hash运算,得到一个固定长度的数据。 输出数据称为消息摘要。(Digest)

常用的消息摘要算法(Hash算法): MD5, SHA-1

数字签名

用 私钥对信息摘要进行加密,就得到了数字签名。(Signature)

然后别人可以用 公钥 对数字签名进行解密,然后将内容进行同样的Hash运算,得到新的 信息摘要。对比新生成的信息摘要和收到的 数字签名解密出来的信息摘要。 就能判断 消息内容是否被修改过。

存在一个问题,我们无法确认 用来解密的公钥是否是合法的, 这时候需要 证书中心-CA(certificate authority)来为公钥认证。CA用自己的私钥,对我们发出的公钥和一些相关的信息一起加密,生成数字证书。(Digital Certificate)

这样,我们再用自己的私钥进行数字签名的时候,再带上该数字证书即可。 收件者收到信息之后,用CA的公钥解开数字证书,数字证书里面就可以得到我们自己的公钥,然后就能证明该数字签名就是我们的了。

Https例子说明

  1. 客户端向服务器发出加密请求
  2. 服务器用自己的私钥对网页内容进行加密,然后连同本身的数字证书一起发给客户端。
  3. 客户端(浏览器)会根据 受信任的根证书颁发机构 列表来判断 解开数字证书的公钥是否在信任列表中。
  4. 如果数字证书记载的网址和我们正在浏览的网址不一致的话,就说明这张证书可能被盗用。浏览器会发出红色警告。
  5. 如果数字证书是可信任的,客户端就会使用证书中的公钥进行信息加密和服务器进行加密信息的交换。

keytool 命令的使用

生成证书库

1
keytool -genkey -v -alias server -keyalg RSA -keysize 1024 -keypass yourKeyPWD -dname "cn=webinglin,ou=00,o=00,l=xm,st=fj,c=CN" -keystore server.jks -storepass yourStorePWD -validity 3650

导出证书申请书

1
keytool -certreq -v -alias server -sigalg MD5withRSA -file server.csr -keypass yourKeyPWD -keystore server.jks -storepass yourStorePWD

img

// todo 将CSR提交给CA,再将CA的根证书,二级证书以及签发后的服务器证书一起导入keystore

导入根证书

1
keytool -import -alias root -trustcacerts -file root.cer -keystore server.jks -storepass yourStorePWD

导入 签名之后的 服务器证书

1
keytool -import -v -trustcacerts -keypass yourKeyPWD -alias server -file server.cer -keysotre server.jks -storepass yourStorePWD

注意:这里的别名需要和证书库的别名保持一致,因为 server.cer 是由 server.jks 导出的证书申请书给CA签名之后的数字证书。

将证书导出到证书文件

1
keytool -export -alias server -file server.cer -keystore server.jks

将证书库 server.jks中别名为server的证书导出到server.cer证书文件中。证书文件包含了证书主题的信息以及证书的公钥,不包含私钥,是可以公开的。

通过证书文件查看证书的信息

1
keytool -printcert -file server.cer

显示指定别名的具体的证书

1
keytool -list -v -alias server -keystore server.jks

显示整个证书库里面的所有证书

1
keytool -list -keystore server.jks

删除密钥库中的条目

1
keytool -delete -alias server -keystore server.jks

修改密钥口令

1
2
3
4
5
6
7
8
# 证书条目口令修改
keytool -keypasswd -alias server -keystore server.jks
# 证书条目口令的修改
keytool -keypasswd -alias youAlias(需要修改密码的别名) -keypass origpwd(原始密码) -new newpwd(新密码) -keystore server.jks -storepass storepwd
# keystore口令修改
keytool -storepasswd -keystore server.jks -storepass origPwd -new newPwd

查看证书信息

1
keytool -list -v -keystore youKS.jks -storepass yourStorePWD

客户端证书模拟

我们可以模拟客户端数字证书,比如插入U-KEY的时候,会读取相应的数字证书和服务器进行通讯。如果我们没有U-KEY,那我们可以自己生成一个证书来模拟

创建客户端密钥

1
keytool -genkey -v -alias clientKey -dname "CN=SomeOne" -keyalg RSA -keypass 888888 -keystore client.p12 -storepass 888888 -storetype PKCS12

将客户端密钥导出为证书文件

1
keytool -export -alias clientKey -file client.cer -keystore client.p12 -storepass 888888 -storetype PKCS12

将上述的客户端证书导入到服务器证书库,设置为信任证书

1
keytool -import -v -alias clientKey -file client.cer -keystore server.jks -storepass 888888

导入的时候选择 y 。允许导入即可

然后,我们可以通过安装client.p12来模拟证书验证

签发Jar包

对jar包的数字签名和认证过程和数字签名原理是一致的。jar包就是待发送的消息,经过签名之后,jar包内置了数字签名和公钥,验证就是对这两项数据进行验证。

当然加上CA的证书签发,那么这个jar包才能确保可信任。不然依旧会有警告jar包的发布者不受信任这样的情况。

经过签名之后,jar包内包含了如下内容:

  1. 原jar包内编译过的class和resource文件
  2. 签名文件 META-INF/*.SF: 这是文本文件,包含了原jar包内的class和resource文件的Hash
  3. META-INF/*.DSA:这是一个数据文件,包含了签名者的certificate和数字签名。其中certificate包含了签名者的有关信息和公钥,如果由CA签发,就是数字证书了(包含了签名者的基本信息和公钥);数字签名是对 .SF文件内的Hash值使用私钥加密得到的。

keytool支持的算法:

  1. RSA算法采用MD5进行Hash的
  2. DSA采用 SHA-1进行Hash的。
1
2
3
4
5
# jarsigner读取keystore为jar包进行数字签名
jarsigner -keystore yourKS.jks -signedjar tools_signed.jar tools.jar yourKS
# 验证
jarsigner -verify tools_signed.jar

Tomcat配置

server.xml配置

1
2
3
4
5
<Connector port="9443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="300" acceptCount="800" scheme="https" secure="true"
keystoreFile="store/server.ks" keystorePass="888888"
truststoreFile="store/server.ks" truststorePass="888888"
clientAuth="true" sslProtocol="TLS" sslEnabledProtocols="TLSv1.1" />

注意: 需要配置 sslEnabledProtocols=”TLSV1.1” 对于windowsXP的系统使用的是TLSv1.1的协议和服务器进行握手的,所以必须允许该协议。

强制浏览器使用https协议访问(web.xml)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<login-config>
<auth-method>CLIENT-CERT</auth-method>
<realm-name>Client Cert Users-only Area</realm-name>
</login-config>
<security-constraint>
<web-resource-collection >
<web-resource-name >SSL</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

如果在web.xml中加入这段配置,那么即使浏览器用 8080端口访问应用程序,也会自动切换成 8443端口来访问的。强制使用https协议。

<<< 捐赠 >>>

转载请注明出处! 原文地址: http://webinglin.github.io

Reference:

http://www.cnblogs.com/jackofhearts/p/jar_signing.html

留言

2017-05-24