我们知道,摘要算法用来确保数据没有被篡改,非对称加密算法可以对数据进行加解密,签名算法可以确保数据完整性和抗否认性,把这些算法集合到一起,并搞一套完善的标准,这就是数字证书。

因此,数字证书就是集合了多种密码学算法,用于实现数据加解密、身份认证、签名等多种功能的一种安全标准。

数字证书可以防止中间人攻击,因为它采用链式签名认证,即通过根证书(Root CA)去签名下一级证书,这样层层签名,直到最终的用户证书。而Root CA证书内置于操作系统中,所以,任何经过CA认证的数字证书都可以对其本身进行校验,确保证书本身不是伪造的。

我们在上网时常用的HTTPS协议就是数字证书的应用。浏览器会自动验证证书的有效性:

要使用数字证书,首先需要创建证书。正常情况下,一个合法的数字证书需要经过CA签名,这需要认证域名并支付一定的费用。开发的时候,我们可以使用自签名的证书,这种证书可以正常开发调试,但不能对外作为服务使用,因为其他客户端并不认可未经CA签名的证书。

在Java程序中,数字证书存储在一种Java专用的key store文件中,JDK提供了一系列命令来创建和管理key store。我们用下面的命令创建一个key store,并设定口令123456:

keytool -storepass 123456 -genkeypair -keyalg RSA -keysize 1024 -sigalg SHA1withRSA -validity 3650 -alias mycert -keystore my.keystore -dname "CN=www.sample.com, OU=sample, O=sample, L=BJ, ST=BJ, C=CN"

几个主要的参数是:

  • keyalg:指定RSA加密算法;
  • sigalg:指定SHA1withRSA签名算法;
  • validity:指定证书有效期3650天;
  • alias:指定证书在程序中引用的名称;
  • dname:最重要的CN=www.sample.com指定了Common Name,如果证书用在HTTPS中,这个名称必须与域名完全一致。

执行上述命令,JDK会在当前目录创建一个my.keystore文件,并存储创建成功的一个私钥和一个证书,它的别名是mycert。

有了key store存储的证书,我们就可以通过数字证书进行加解密和签名:

import java.io.InputStream;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.*;
import javax.crypto.Cipher;public class Main {public static void main(String[] args) throws Exception {byte[] message = "Hello, use X.509 cert!".getBytes("UTF-8");// 读取KeyStore:KeyStore ks = loadKeyStore("/my.keystore", "123456");// 读取私钥:PrivateKey privateKey = (PrivateKey) ks.getKey("mycert", "123456".toCharArray());// 读取证书:X509Certificate certificate = (X509Certificate) ks.getCertificate("mycert");// 加密:byte[] encrypted = encrypt(certificate, message);System.out.println(String.format("encrypted: %x", new BigInteger(1, encrypted)));// 解密:byte[] decrypted = decrypt(privateKey, encrypted);System.out.println("decrypted: " + new String(decrypted, "UTF-8"));// 签名:byte[] sign = sign(privateKey, certificate, message);System.out.println(String.format("signature: %x", new BigInteger(1, sign)));// 验证签名:boolean verified = verify(certificate, message, sign);System.out.println("verify: " + verified);}static KeyStore loadKeyStore(String keyStoreFile, String password) {try (InputStream input = Main.class.getResourceAsStream(keyStoreFile)) {if (input == null) {throw new RuntimeException("file not found in classpath: " + keyStoreFile);}KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());ks.load(input, password.toCharArray());return ks;} catch (Exception e) {throw new RuntimeException(e);}}static byte[] encrypt(X509Certificate certificate, byte[] message) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance(certificate.getPublicKey().getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, certificate.getPublicKey());return cipher.doFinal(message);}static byte[] decrypt(PrivateKey privateKey, byte[] data) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(data);}static byte[] sign(PrivateKey privateKey, X509Certificate certificate, byte[] message)throws GeneralSecurityException {Signature signature = Signature.getInstance(certificate.getSigAlgName());signature.initSign(privateKey);signature.update(message);return signature.sign();}static boolean verify(X509Certificate certificate, byte[] message, byte[] sig) throws GeneralSecurityException {Signature signature = Signature.getInstance(certificate.getSigAlgName());signature.initVerify(certificate);signature.update(message);return signature.verify(sig);}
}

在上述代码中,我们从key store直接读取了私钥-公钥对,私钥以PrivateKey实例表示,公钥以X509Certificate表示,实际上数字证书只包含公钥,因此,读取证书并不需要口令,只有读取私钥才需要。如果部署到Web服务器上,例如Nginx,需要把私钥导出为Private Key格式,把证书导出为X509Certificate格式。

以HTTPS协议为例,浏览器和服务器建立安全连接的步骤如下:

浏览器向服务器发起请求,服务器向浏览器发送自己的数字证书;
浏览器用操作系统内置的Root CA来验证服务器的证书是否有效,如果有效,就使用该证书加密一个随机的AES口令并发送给服务器;
服务器用自己的私钥解密获得AES口令,并在后续通讯中使用AES加密。
上述流程只是一种最常见的单向验证。如果服务器还要验证客户端,那么客户端也需要把自己的证书发送给服务器验证,这种场景常见于网银等。

注意:数字证书存储的是公钥,以及相关的证书链和算法信息。私钥必须严格保密,如果数字证书对应的私钥泄漏,就会造成严重的安全威胁。如果CA证书的私钥泄漏,那么该CA证书签发的所有证书将不可信。数字证书服务商DigiNotar就发生过私钥泄漏导致公司破产的事故。

小结

数字证书就是集合了多种密码学算法,用于实现数据加解密、身份认证、签名等多种功能的一种安全标准。

数字证书采用链式签名管理,顶级的Root CA证书已内置在操作系统中。

数字证书存储的是公钥,可以安全公开,而私钥必须严格保密。

加密与安全——数字证书相关推荐

  1. 安全加密之---CA数字证书

    文章目录 前言 一.什么是中间人攻击 二.CA是什么? 三.数字证书原理 前言 前面简单讲了安全加密体系,安全加密体系链接 在结合了对称加密,非对称加密,定向散列这三种加密算法后,通信效率的提高了,通 ...

  2. java加密解密与数字证书的操作

    2019独角兽企业重金招聘Python工程师标准>>> 1 Java程序实现密钥库的维护 1.1 Java程序列出密钥库所有条目 import java.util.*;   impo ...

  3. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)...

    2019独角兽企业重金招聘Python工程师标准>>> 数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊-- ...

  4. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  5. 数字证书原理,公钥私钥加密原理

    文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...

  6. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  7. 数字证书原理-HTTPS通信如何保证通信安全?只用对称和非对称加密就可以了吗?为什么需要数字证书?

    文中首先解释了加密解密的一些基础知识和概念,然后通过一个加密通信过程的例子说明了加密算法的作用,以及数字证书的出现所起的作用.接着对数字证书做一个详细的解释,并讨论一下windows中数字证书的管理, ...

  8. 加密与安全:图解非对称加密算法 RSA 数字签名与数字证书

    RSA 加密过程是公钥加密.私钥解密,而数字签名.数字证书都是私钥签名(可以理解为加密),公钥签名验证(可以理解为解密).公钥和私钥都可以用来加密或解密,只要能保证用 A 加密,就用 B 解密即可,至 ...

  9. 【IoT】加密与安全:图解非对称加密算法 RSA 数字签名与数字证书

    RSA 加密过程是公钥加密.私钥解密,而数字签名.数字证书都是私钥签名(可以理解为加密),公钥签名验证(可以理解为解密).公钥和私钥都可以用来加密或解密,只要能保证用 A 加密,就用 B 解密即可,至 ...

最新文章

  1. mpvue开发小程序所遇问题及h5转化方案
  2. asp.net 获取插入记录的ID
  3. JMeter脚本获取变量名、检验字符串值
  4. 搭建web服务器,发布站点
  5. 架构师速成-架构目标之可用性
  6. mysql主从复制、redis基础、持久化和主从复制
  7. PyTorch 读取图像图片数据
  8. android 多屏幕 设计翻译,android Supporting multiple screen翻译一
  9. boost::hana::basic_tuple用法的测试程序
  10. 有关机器人的会议和论文投稿时间
  11. zeppelin的安装与使用
  12. bootstrap.yml与application.properties区别?
  13. python读取sqlserver的数据_Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例...
  14. 运用Links方法安装插件
  15. 【ACM】kuangbin基础数论专题
  16. 关于Java三目运算符类型的困惑
  17. 丁真人设崩塌?吸烟事件后,又爆深夜热聊女网红丨国仁网络
  18. 病毒及攻击防御手册之四
  19. 苹果手机点击输入框页面自动放大
  20. 华为云,助力企业快速省心过等保

热门文章

  1. 2022年11大最佳缺陷管理工具盘点
  2. 2022金属非金属矿山(小型露天采石场)安全管理人员考试练习题及模拟考试
  3. 101121 ~ 101127
  4. oracle委外加工工单,外协管理Oracle解决方案1
  5. FlashFXP如何保持FTP连接不中断?
  6. 3320g虚拟服务器,PowerEdge R750 机架式服务器
  7. cef支持.net6.0
  8. 绝美梦幻荧光水母图片你也可以拥有
  9. Google 地图 API for Android
  10. 途志:想要提高直播间销量 ,产品出场顺序很重要