首先需要了解HTTP和HTTPS
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();
获得公私钥之后可以对任何一种形式的数据交换进行签名验签,只需要在传递过程中将签名摘要传递过去就行了