数字证书、数字签名的实现使用以及keytool工具生成私钥公钥

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 数字证书、数字签名的实现使用以及keytool工具生成私钥公钥,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

数字证书、数字签名的实现使用以及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 -genkeypair

keytool -genkeypair -alias mykey(为证书指定别名,否则采用默认的名称为mykey)
D:\>keytool -genkeypair -alias mykey
输入密钥库口令:
密钥库口令太短 - 至少必须为 6 个字符
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
  [Unknown]:  CJ
您的组织单位名称是什么?
  [Unknown]:  ZD
您的组织名称是什么?
  [Unknown]:  ZD
您所在的城市或区域名称是什么?
  [Unknown]:  CD
您所在的省//自治区名称是什么?
  [Unknown]:  SC
该单位的双字母国家/地区代码是什么?
  [Unknown]:  CN
CN=CJ, OU=ZD, O=ZD, L=CD, ST=SC, C=CN是否正确?
  []:  是

输入 <mykey> 的密钥口令
        (如果和密钥库口令相同, 按回车):

查看keystore密钥库文件中有哪些项目

keytool -list
keytool -list -v

keytool -exportcert -alias lisi -file lisi.cer
D:\>keytool -list
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

mykey, 2022-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 2022, 失效时间: Fri Aug 26 19:28:45 CST 2022
证书指纹:
         SHA1: 06:E7:F6:D7:C8:7D:AC:8B:CD:6D:A2:B1:84:3C:83:18:96:88:A5:16
         SHA256: 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=false
SubjectKeyIdentifier [
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]:  CN
CN=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, 2022-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:http://slproweb.com/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/XbA
B3Bb/P8Zh/dkuQiTpIWaTlN1Fpksd9R6N3p3df+qVJUlMDEEbgrP7L8wXiCyH+UR
UvjI1H1U3BUZoiztqptWL1zzG6P8ef2XlUJJ6MEUO9JMY2UMx6kwMHs52RwPAJBj
cBJvYb4o6aneT2DLZV6D3IobJYN7VdxByeqeoaPBvDKSh5HYyvhj6P354WJV/d86
FAQnR3I8QDxf0azaYzOIgtd0LECvwhTwpkwGHbnex5zSvCmcnIjIGVMoqCEMPvUc
BxrBY32qGWc2yMPZI+PFTpUdAMARrHfXrwbtyM5JvsiMxzBGZAVZRSFhl9D/bOLr
WwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE-----
MIIDOzCCAiOgAwIBAgIEdxFWfTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJD
TjELMAkGA1UECBMCU0MxCzAJBgNVBAcTAkNEMQswCQYDVQQKEwJaRDELMAkGA1UE
CxMCWkQxCzAJBgNVBAMTAkNKMB4XDTIyMDUyODExNDc1OFoXDTIyMDgyNjExNDc1
OFowTjELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAlNDMQswCQYDVQQHEwJDRDELMAkG
A1UEChMCWkQxCzAJBgNVBAsTAlpEMQswCQYDVQQDEwJDSjCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAIN1LAOiql7KwMJ4BP12wAdwW/z/GYf3ZLkIk6SF
mk5TdRaZLHfUejd6d3X/qlSVJTAxBG4Kz+y/MF4gsh/lEVL4yNR9VNwVGaIs7aqb
Vi9c8xuj/Hn9l5VCSejBFDvSTGNlDMepMDB7OdkcDwCQY3ASb2G+KOmp3k9gy2Ve
g9yKGyWDe1XcQcnqnqGjwbwykoeR2Mr4Y+j9+eFiVf3fOhQEJ0dyPEA8X9Gs2mMz
iILXdCxAr8IU8KZMBh253sec0rwpnJyIyBlTKKghDD71HAcawWN9qhlnNsjD2SPj
xU6VHQDAEax3168G7cjOSb7IjMcwRmQFWUUhYZfQ/2zi61sCAwEAAaMhMB8wHQYD
VR0OBBYEFD6Z+Gpw6WCw1ZH9KC4+AxOY+4QzMA0GCSqGSIb3DQEBCwUAA4IBAQAV
HxX9unkXUcJaFUI/dfjooD+L4nolnD1qn7Ir7V7ZVgzIs8pBySc4C3AFIDL3G7Ny
uy8gePU5Lc33AICvJRcxpXckpgKzGdWd7draJ2wGzvFru3sRGILxc6wCsBB6IfUV
TOS4meVo0FrJggMlCHjUi9Uu6FDS4fEW6o+dEIvdisSz9g2J2XIOafxQHSHY/jCr
mE2HDs8MOgq6RkZ98IDT8nS3QUhUs2Ayg1thweRp5Xo6XWSeB8TTxXTEzgDEJuOa
VM77Jp5zCgBoiUpfqbpjxWRM+V5yzO+7Qf21CIOqcSwEe2iB59ExvZpMrM5cgRQj
K3zR4YcKD5iiimKVmAux
-----END CERTIFICATE-----

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136959.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!