【开发笔记】支付项目:1、证书加解密、签名验签
发布日期:2021-06-24 15:29:03 浏览次数:3 分类:技术文章

本文共 3021 字,大约阅读时间需要 10 分钟。

最近做到了支付系统,由于对接第三方系统,涉及到证书签名的问题,就抽时间了解了证书、私钥、公钥、签名、验签等概念!

一、应用场景

首先需要了解HTTP和HTTP

     

http就是网络的一种协议,服务器与服务器之间的数据交互,就用http协议

在数据交互的时候,涉及到隐私的东西,就要将协议建立在SSL服务器之上,那么就用加密的http协议https

 

二、应用过程

这里涉及到三个对象,我(客户端)和你(浏览器)和CA

浏览器保存了一个常用的 CA 证书列表(不懂得就谷歌‘浏览器证书’),在验证证书链的有效性时,直接使用保存的证书里的公钥进行校验,如果在证书列表中没有找到或者找到了但是校验不通过,那么浏览器会警告用户,由用户决定是否继续。与此类似的,操作系统也一样保存有一份可信的证书列表,譬如在 Windows 系统下,你可以运行 certmgr.msc 打开证书管理器查看,这些证书实际上是存储在 Windows 的注册表中,一般情况下位于:\SOFTWARE\Microsoft\SystemCertificates\ 路径下。那么在 Java 程序中是如何验证证书的呢?

 

证书常常被存储在 KeyStore 文件中,上面说的 cacerts 文件就是一个 KeyStore 文件,KeyStore 不仅可以存储数字证

书,还可以存储密钥,存储在 KeyStore 文件中的对象有三种类型:Certificate、PrivateKey 和 SecretKey 。Certificate 就是

证书,PrivateKey 是非对称加密中的私钥,SecretKey 用于对称加密,是对称加密中的密钥。KeyStore 文件根据用途,也有

很多种不同的格式:JKS、JCEKS、PKCS12、DKS 等等,了解就行!【摘抄的】

 

如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,

并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。如果一个用户想鉴别另一个证书

的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。通过这种方式,黑客

就不能简单的修改证书中的公钥了,因为现在公钥有了 CA 的数字签名,由 CA 来证明公钥的有效性,不能轻易被篡改,

而黑客自己的公钥是很难被 CA 认可的,所以我们无需担心证书被篡改的问题了。【摘抄的】

 

 

 

 

通常证书的格式有.pfx、.p12、.cer等等很多,这里暂时将前面列出来的三种

 

首先证书基本都是二进制文件!

 

1.PFX是带有私钥的证书(包含公钥和私钥) 

由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,

以pfx作为证书文件后缀名(文件的扩展名可以为pfx或p12)。 

2.CER二进制编码的证书(只包含公钥) 

证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。 

3.Base64编码的证书(只包含公钥) 

证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。

由定义可以看出,只有pfx格式的数字证书是包含有私钥的,cer格式的数字证书里面只有公钥没有私钥。

在pfx证书的导入过程中有一项是“标志此密钥是可导出的。这将您在稍候备份或传输密钥”。一般是不选中的,如果选中,别人就有机会备份你的密钥了。如果是不选中,其实密钥也导入了,只是不能再次被导出。这就保证了密钥的安全。

如果导入过程中没有选中这一项,做证书备份时“导出私钥”这一项是灰色的,不能选。只能导出cer格式的公钥。如果导入时选中该项,则在导出时“导出私钥”这一项就是可选的。

如果要导出私钥(pfx),是需要输入密码的,这个密码就是对私钥再次加密,这样就保证了私钥的安全,别人即使拿到了你的证书备份(pfx),不知道加密私钥的密码,也是无法导入证书的。相反,如果只是导入导出cer格式的证书,是不会提示你输入密码的。因为公钥一般来说是对外公开的,不用加密

 

很简单的一句话:证书有一对--公钥(.cer)和私钥(.pfx或.p12),公钥加密就用私钥验签,私钥加密就用公钥验签,

数字证书就是摘要,所谓摘要就是公钥或者私钥加密后的加密串,验签的时候用公钥或者私钥对加密串进行解密,加密

保证了数据的完整性,摘要保证了数据的真实性!

 

三、代码引导

======================================

从pfx导出公、私钥(linux)

======================================

从pfx提取密钥信息,并转换为key格式(pfx使用pkcs12模式补足)

1、提取密钥对(如果pfx证书已加密,会提示输入密码。)

       openssl pkcs12 -in 1.pfx -nocerts -nodes -out 1.key

2、从密钥对提取私钥

       openssl rsa -in  1.key -out 1_pri.key

3、从密钥对提取公钥

       openssl rsa -in 1.key -pubout -out 1_pub.key

4、因为RSA算法使用的是pkcs8模式补足,需要对提取的私钥进一步处理(可选)

      openssl pkcs8 -in 1_pri.key -out 1_pri.p8 -outform der-nocrypt -topk8

================================

将pfx成一个cer

================================

opensslpkcs12 -in certificate.pfx -out certificate.cer -nodes

 

=====================================================

java获取公私钥

=====================================================

获取私钥

KeyStore keyStore = KeyStore.getInstance("PKCS12");
InputStream inputStream = Entity.class.getResourceAsStream("证书路径+文件名");
char pass[] = "证书密码".toCharArray();
keyStore.load(inputStream, pass);
PrivateKey privateKey = (PrivateKey) keyStore.getKey(key, pass); 
获取公钥
X509Certificate x509 = (X509Certificate)CertificateFactory.getInstance("X.509").generateCertificate(in);

PublicKey publicKey = x509.getPublicKey();

 

 

获得公私钥之后可以对任何一种形式的数据交换进行签名验签,只需要在传递过程中将签名摘要传递过去就行了

 

 

 

转载地址:https://blog.csdn.net/weixin_33602978/article/details/71599672 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【读书笔记】WEB应用:1、日志配置
下一篇:【茶余饭后】开发微信小程序准备工作

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月13日 23时09分36秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章