数字证书、数字签名的实现使用以及keytool工具生成私钥公钥
数字签名数字证书数字签名的实现keytool工具基本命令生成私钥公钥导出公钥数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。
数字签名简单的说就是在网络中传输数据时候,给数据添加一个数字签名,表示是谁发的数据,而且还能证明数据没有被篡改。
数字签名的主要作用就是保证数据的有效性(验证是谁发的)和完整性(证明信息没有被篡改)。
基本原理
使用一定的HASH算法将数据报文算出一个固定位数的摘要信息,如此就完成了数字签名。然后使用私钥将摘要加密,并附在数据报文上一起发送给接收者。
接收者通过公钥解密数据报文,得到数字签名中的摘若。再对数据报文本身使用Hash函数算出报文摘要,如果两个摘要一致,说明数据未被篡改,说明数据是完整的。
数字证书
当对签名进行验证时,需要用到公钥,如果公钥是伪造的,那就无法验证数字签名,也就根本不可能从数字签名确定数据的合法性,于是就出现了数字证书。
数字证书是指在互联网通讯中标志通讯各方身份信息的一个数字认证,人们可以在网上用它来识别对方的身份。因此数字证书又称为数字标识。数字证书对网络用户在计算机网络交流中的信息和数据等以加密或解密的形式保证了信息和数据的完整性和安全性。
简而言之: 数字证书是互联网通讯中标志通讯各方身份信息一串数字。提供了一种在Internet上验证通信实体身份的方式。它是由CA颁发给网站的一种身份的方式。它里面包含了该网站的公钥、有效时间、网站的地址、及 CA的数字签名等。
作用
使用CA的私钥将网站的公钥等信息进行签名,当客户端请求服务器端的时候,网站会把证书发给客户端,客户端先通过CA的数字签名校验CA的身份,来证明证书的真实完整性。
数字签名的实现
public static void main(String[] args) throws Exception {// 加密算法String algorithm = "RSA";// 创建密钥对生成器对象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私钥PrivateKey privateKey = keyPair.getPrivate();// 生成公钥PublicKey publicKey = keyPair.getPublic();// 加密算法String algorithm2 = "sha256withrsa";String input = "Hello World";// 生成签名String signaturedData = getSignature(input, algorithm2, privateKey);// 校验签名boolean verifySignature = verifySignature(input, algorithm2, publicKey, signaturedData);System.out.println("签名校验是否成功:" + verifySignature);}/*** 生成签名** @param input原文* @param algorithm 算法* @param privateKey 私钥* @return : 签名*/private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception {// 获取签名对象Signature signature = Signature.getInstance(algorithm);// 初始化签名signature.initSign(privateKey);// 传入原文signature.update(input.getBytes());// 开始签名byte[] sign = signature.sign();// 对签名数据进行Base64编码return Base64.encode(sign);}/*** 校验签名** @param input原文* @param algorithm算法* @param publicKey公钥* @param signaturedData 签名* @return : 数据是否被篡改*/private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData) throws Exception {// 获取签名对象Signature signature = Signature.getInstance(algorithm);// 初始化签名signature.initVerify(publicKey);// 传入原文signature.update(input.getBytes());// 校验数据return signature.verify(Base64.decode(signaturedData));}
keytool工具
Keytool 是一个java提供的证书管理工具
keytool工具路径:*\Java\jdk1.8\bin\
C:\Users\Administrator>keytool密钥和证书管理工具命令:-certreq 生成证书请求-changealias 更改条目的别名-delete 删除条目-exportcert 导出证书-genkeypair 生成密钥对-genseckey生成密钥-gencert 根据证书请求生成证书-importcert 导入证书或证书链-importpass 导入口令-importkeystore从其他密钥库导入一个或所有条目-keypasswd更改条目的密钥口令-list列出密钥库中的条目-printcert打印证书内容-printcertreq 打印证书请求的内容-printcrl 打印 CRL 文件的内容-storepasswd 更改密钥库的存储口令使用 "keytool -command_name -help" 获取 command_name 的用法
基本命令
生成keypair
keytool -genkeypairkeytool -genkeypair -alias mykey(为证书指定别名,否则采用默认的名称为mykey)
D:\>keytool -genkeypair -alias mykey输入密钥库口令:密钥库口令太短 - 至少必须为 6 个字符输入密钥库口令:再次输入新口令:您的名字与姓氏是什么?[Unknown]: CJ您的组织单位名称是什么?[Unknown]: ZD您的组织名称是什么?[Unknown]: ZD您所在的城市或区域名称是什么?[Unknown]: CD您所在的省/市/自治区名称是什么?[Unknown]: SC该单位的双字母国家/地区代码是什么?[Unknown]: CNCN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN是否正确?[否]: 是输入 <mykey> 的密钥口令(如果和密钥库口令相同, 按回车):
查看keystore密钥库文件中有哪些项目
keytool -listkeytool -list -vkeytool -exportcert -alias lisi -file lisi.cer
D:\>keytool -list输入密钥库口令:密钥库类型: jks密钥库提供方: SUN您的密钥库包含 1 个条目mykey, -5-28, PrivateKeyEntry,证书指纹 (SHA-256): BC:61:59:12:E9:86:9B:A0:58:D1:B9:F5:CE:79:A1:F9:9A:C3:F6:95:A6:60:61:CD:F1:35:FC:F9:95:29:08:D2
生成可打印的证书
keytool -exportcert -alias mykey -file mykey.cer -rfc
D:\>keytool -exportcert -alias mykey -file mykey.cer -rfc输入密钥库口令:存储在文件 <mykey.cer> 中的证书
显示数字证书文件中的证书信息
keytool -printcert -file mykey.cer
所有者: CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN发布者: CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN序列号: 1b2429fe生效时间: Sat May 28 19:28:45 CST , 失效时间: Fri Aug 26 19:28:45 CST 证书指纹:SHA1: 06:E7:F6:D7:C8:7D:AC:8B:CD:6D:A2:B1:84:3C:83:18:96:88:A5:16SHA256: BC:61:59:12:E9:86:9B:A0:58:D1:B9:F5:CE:79:A1:F9:9A:C3:F6:95:A6:60:61:CD:F1:35:FC:F9:95:29:08:D2签名算法名称: SHA256withDSA主体公共密钥算法: 2048 位 DSA 密钥版本: 3扩展:#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: 1A E5 9E D1 3A 6F 82 76 5B C9 02 CB 7E 63 E1 BC ....:o.v[....c..0010: C7 6C 13 04.l..]]
双击mykey.cer即可打开
生成私钥公钥
生成密钥证书,采用RSA 算法,每个证书包含公钥和私钥
1.1根据命令提示生成
keytool -genkeypair -alias mykey -keyalg RSA -keypass 123456 -keystore mykeystore.jks -storepass 123456
-alias:密钥的别名 -keyalg:使用的hash算法 -keypass:密钥的访问密码 -keystore:密钥库文件名,xc.keystore保存了生成的证书 -storepass:密钥库的访问密码
您的名字与姓氏是什么?[Unknown]: CJ您的组织单位名称是什么?[Unknown]: ZD您的组织名称是什么?[Unknown]: ZD您所在的城市或区域名称是什么?[Unknown]: CD您所在的省/市/自治区名称是什么?[Unknown]: SC该单位的双字母国家/地区代码是什么?[Unknown]: CNCN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN是否正确?[否]: 是
1.2.直接使用命令生成
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ./tls.key -x509 -out ./tls.crt -subj /C=CN/ST=SC/L=SC/O=nginx/CN=CJ -days 365
req 产生证书签发申请命令-newkey 生成新私钥rsa:4096 生成秘钥位数-nodes 表示私钥不加密-sha256 使用SHA-2哈希算法-keyout 将新创建的私钥写入的文件名-x509 签发X.509格式证书命令。X.509是最通用的一种签名证书格式。-out 指定要写入的输出文件名-subj 指定用户信息-days 有效期
2.查询证书信息
keytool -list -keystore mykeystore.jks
keytool -list -keystore mykeystore.jks输入密钥库口令:密钥库类型: jks密钥库提供方: SUN您的密钥库包含 1 个条目mykey, -5-28, PrivateKeyEntry,证书指纹 (SHA-256): 82:0D:FB:A0:DD:B8:EC:E3:7D:27:40:93:76:CF:8C:44:F1:5F:DD:4C:2F:F7:EA:E2:05:BB:3E:31:C0:11:A4:BA
3.删除别名
keytool -delete -alias mykey -keystore mykeystore.jsk
导出公钥
openssl是一个加解密工具包,使用openssl来导出公钥信息。
安装 openssl:/products/Win32OpenSSL.html
,并配置openssl的path环境变量
执行
keytool -list -rfc --keystore mykeystore.jks | openssl x509 -inform pem -pubkey
命令后得到公钥,将其拷贝到文本public.key文件合并为一行,然后就可以在认证授权项目中使用了。
D:\>keytool -list -rfc --keystore mykeystore.jks | openssl x509 -inform pem -pubkey输入密钥库口令: 123456-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg3UsA6KqXsrAwngE/XbAB3Bb/P8Zh/dkuQiTpIWaTlN1Fpksd9R6N3p3df+qVJUlMDEEbgrP7L8wXiCyH+URUvjI1H1U3BUZoiztqptWL1zzG6P8ef2XlUJJ6MEUO9JMY2UMx6kwMHs52RwPAJBjcBJvYb4o6aneT2DLZV6D3IobJYN7VdxByeqeoaPBvDKSh5HYyvhj6P354WJV/d86FAQnR3I8QDxf0azaYzOIgtd0LECvwhTwpkwGHbnex5zSvCmcnIjIGVMoqCEMPvUcBxrBY32qGWc2yMPZI+PFTpUdAMARrHfXrwbtyM5JvsiMxzBGZAVZRSFhl9D/bOLrWwIDAQAB-----END PUBLIC KEY----------BEGIN CERTIFICATE-----MIIDOzCCAiOgAwIBAgIEdxFWfTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJDTjELMAkGA1UECBMCU0MxCzAJBgNVBAcTAkNEMQswCQYDVQQKEwJaRDELMAkGA1UECxMCWkQxCzAJBgNVBAMTAkNKMB4XDTIyMDUyODExNDc1OFoXDTIyMDgyNjExNDc1OFowTjELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlNDMQswCQYDVQQHEwJDRDELMAkGA1UEChMCWkQxCzAJBgNVBAsTAlpEMQswCQYDVQQDEwJDSjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIN1LAOiql7KwMJ4BP12wAdwW/z/GYf3ZLkIk6SFmk5TdRaZLHfUejd6d3X/qlSVJTAxBG4Kz+y/MF4gsh/lEVL4yNR9VNwVGaIs7aqbVi9c8xuj/Hn9l5VCSejBFDvSTGNlDMepMDB7OdkcDwCQY3ASb2G+KOmp3k9gy2Veg9yKGyWDe1XcQcnqnqGjwbwykoeR2Mr4Y+j9+eFiVf3fOhQEJ0dyPEA8X9Gs2mMziILXdCxAr8IU8KZMBh253sec0rwpnJyIyBlTKKghDD71HAcawWN9qhlnNsjD2SPjxU6VHQDAEax3168G7cjOSb7IjMcwRmQFWUUhYZfQ/2zi61sCAwEAAaMhMB8wHQYDVR0OBBYEFD6Z+Gpw6WCw1ZH9KC4+AxOY+4QzMA0GCSqGSIb3DQEBCwUAA4IBAQAVHxX9unkXUcJaFUI/dfjooD+L4nolnD1qn7Ir7V7ZVgzIs8pBySc4C3AFIDL3G7Nyuy8gePU5Lc33AICvJRcxpXckpgKzGdWd7draJ2wGzvFru3sRGILxc6wCsBB6IfUVTOS4meVo0FrJggMlCHjUi9Uu6FDS4fEW6o+dEIvdisSz9g2J2XIOafxQHSHY/jCrmE2HDs8MOgq6RkZ98IDT8nS3QUhUs2Ayg1thweRp5Xo6XWSeB8TTxXTEzgDEJuOaVM77Jp5zCgBoiUpfqbpjxWRM+V5yzO+7Qf21CIOqcSwEe2iB59ExvZpMrM5cgRQjK3zR4YcKD5iiimKVmAux-----END CERTIFICATE-----