背景知识
数字证书(或简称证书)是在 Internet 上唯一地标识人员和资源的电子文件。证书使两个实体之间能够进行安全、保密的通信。
证书有很多种类型,例如个人证书(由个人使用)和服务器证书(用于通过安全套接字层 [SSL] 技术在服务器和客户机之间建立安全会话)。有关 SSL 的更多信息,请参见关于安全套接字层。
证书是基于公钥加密的,公钥加密使用数字密钥对(很长的数字)对信息进行加密或编码,从而使信息只能被目标收件人读取。然后,收件人对信息进行解密(解码)即可读取该信息。
一个密钥对包含一个公钥和一个私钥。拥有者对公钥进行分发并使任何人都可以使用该公钥。但是拥有者永远不会分发私钥;私钥始终是保密的。由于密钥与数学相关,因此使用了密钥对中的一个密钥进行加密的数据只能通过密钥对中的另一个密钥进行解密。
证书就好像一本护照:它可以标识持有者并提供其他重要信息。证书由称为证书授权机构 (Certification Authority, CA) 的可信赖第三方发布。CA 类似于护照申领办公室:它将验证证书持有者的身份并对证书进行签名,以使他人无法伪造或篡改证书。CA 对证书进行签名之后,持有者可以提供该证书作为身份证明并建立经过加密的保密通信。
最重要的是,证书会将拥有者的公钥绑定到拥有者的标识。与护照将照片绑定到其持有者的个人信息类似,证书将公钥绑定到有关其拥有者的信息。
除了公钥以外,证书通常还包括以下信息:
持有者的姓名和其他标识,例如使用证书的 Web 服务器的 URL 或个人的电子邮件地址。
发布证书的 CA 的名称。
失效日期。
数字证书受 X.509 格式的技术规范约束。要检验 certificate 领域中某个用户的身份,验证服务将使用 X.509 证书的通用名称字段作为主体名称来检验 X.509 证书。
实验原理
1. 哈希函数
哈希函数是一个具有以下输入和输出的数学函数 H(X)=Y
H:哈希函数,其输入参数为X,输出为Y。
X:哈希方法的输入,可以是任意长度的任意数据。
Y:哈希方法的输出,是一段固定长度的二进制数据,长度可以是 256,384,516...。
用于加密的哈希函数有下面的特征:
无法找到产生相同输出的输入。从数学理论上来说,我们可以找到有相同输出的输入,因为输入可以是任何数据,而输出则是固定长度的。但是对于一个好的哈希函数来说,希望的是即使使用地球上所有的计算机一起进行计算,也无法在可接受的时间范围内找出具有相同输出的输入。
无法通过输出反推出输入。当输入值的取值范围很大,就很难通过输出反推出输入。当输入值的取值范围是一个有限的集合时,很容易通过遍历尝试每一个输入值来推断。在这种情况下,我们可以为输入 X 加上一个随机值 R 来隐藏输入值,即 H(R|X)=Y。由于攻击者不知道 R 的值,因此无法再通过遍历尝试每个输入的方法推断出 Y 对应的输入。这种做法被称为“加盐”,例如我们在存储密码时就会通过“加盐”的方法来避免彩虹表攻击。
从哈希函数的特点可以看出,一段数据的哈希值就是该数据的一个固定长度的,独一无 二的“特征”,我们可以把哈希值看作该数据的“数字指纹”。
2. 数字签名
数字签名是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防 止被人进行伪造。它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名,主要是基于公钥密码体制的数字签名。
公钥密码算法采用公钥进行加密,私钥进行解密,数字签名则采用私钥进行加密,用公钥进行解密来验证数字签名。
秘钥拥有者(发送者)首先将原文通过特定的哈希函数得到摘要信息,然后采用私钥对摘要进行加密,就得到了签名。然后将签名附加在原文后一起传送给接收者,接收者拥有公钥,对签名进行解密后得到原文的摘要信息,然后用 HASH 函数对收到的原文提炼出一个摘要信息,与解密得到的摘要进行对比,可以判断接收到的信息是否被篡改,确定信息的完整性。由于私钥是不公开的,只有发送者才能采用私钥对数据加密,所以这种方式可以确定 消息的不可抵赖性。
在数字证书,区块链,比特币中就采用了数字签名来验证用户身份。下图展示了数字签名和验证的流程:
3. 数字证书
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在 Internet 上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构—— CA 机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份,它的基本任务是将一个公钥与安全个体(个人、公司等)的名字绑在一起。
最简单的证书包含密钥、名称以及证书授权中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。数字证书是一种权威性的电子文档,可以由权威公正的第三方机构,即 CA(例如中国各地方的 CA 公司)中心签发的证书,也可以由企业级 CA 系统进行签发。
从数字签名使用对象的角度分,目前的数字证书类型主要包括:个人身份证书、企业或机构身份证书、支付网关证书、服务器证书、安全电子邮件证书、个人代码签名证书,这些数字证书特点各有不同。
- 个人身份证书
符合 X.509 标准的数字安全证书,证书中包含个人身份信息和个人的公钥,用于标识证书持有人的个人身份。数字安全证书和对应的私钥存储于 E-key 中,用于个人在网上进行合同签定、定单、录入审核、操作权限、支付信息等活动中标明身份。
- 企业或机构身份证书
符合 X.509 标准的数字安全证书,证书中包含企业信息和企业的公钥,用于标识证书持有企业的身份。数字安全证书和对应的私钥存储于 E-key 或 IC 卡中,可以用于企业在电子商务方面的对外活动,如合同签定、网上证券交易、交易支付信息等方面。
- 支付网关证书
支付网关证书是证书签发中心针对支付网关签发的数字证书,是支付网关实现数据加解密的主要工具,用于数字签名和信息加密。支付网关证书仅用于支付网关提供的服务 (Internet 上各种安全协议与银行现有网络数据格式的转换)。支付网关证书只能在有效状态下使用。支付网关证书不可被申请者转让。
- 服务器证书
符合 X.509 标准的数字安全证书,证书中包含服务器信息和服务器的公钥,在网络通讯中用于标识和验证服务器的身份。数字安全证书和对应的私钥存储于 E-key 中。服务器软件利用证书机制保证与其他服务器或客户端通信时双方身份的真实性、安全性、可信任度 等。
- 企业或机构代码签名证书
代码签名证书是 CA 中心签发给软件提供商的数字证书,包含软件提供商的身份信息、 公钥及 CA 的签名。软件提供商使用代码签名证书对软件进行签名后放到 Internet 上,当用户在 Internet 上下载该软件时,将会得到提示,从而可以确信:软件的来源;软件自签名后到下载前,没有遭到修改或破坏。代码签名证书可以对 32-bit.exe 、.cab 、.ocx 、.class 等程序和文件进行签名。
- 安全电子邮件证书
符合 X.509 标准的数字安全证书,通过 IE 或 Netscape 申请,用 IE 申请的证书存储于 WINDOWS 的注册表中,用 NETSCAPE 申请的存储于个人用户目录下的文件中。用于安全电子邮件或向需要客户验证的 WEB 服务器(https 服务) 表明身份。
- 个人代码签名证书
个人代码签名证书是 CA 中心签发给软件提供人的数字证书,包含软件提供个人的身份信息、公钥及 CA 的签名。软件提供人使用代码签名证书对软件进行签名后放到 Internet 上,当用户在 Internet 上下载该软件时,将会得到提示,从而可以确信:软件的来源;软件自签名后到下载前,没有遭到修改或破坏。代码签名证书可以对 32-bit .exe、.cab、.ocx、.class 等程序和文件进行签名。
从数字证书的技术角度分,CA 中心发放的证书分为两类:SSL 证书和 SET 证书。一般地说,SSL 证书(安全套接层)是服务于银行对企业或企业对企业的电子商务活动的;而 SET(安全电子交易)证书则服务于持卡消费、网上购物。虽然它们都是用于识别身份和数字签名的证书,但它们的信任体系完全不同,而且所符合的标准也不一样。
4. 数字证书的格式
数字证书的格式普遍采用 RFC5280 定义的 X.509 标准。下表列出了 X.509 标准格式的证书中的主要字段。
证书主要的文件类型和协议有:PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、 CRT、CRL、OCSP、SCEP 等。Openssl 使用 PEM 格式存储证书。
数字证书的一个实例是 https 协议,用于网页加密。以下是百度网页的数字证书例子:
实验内容
利用openssl 生成公钥、私钥对,并生成自己的数字证书。密码算法不局限于 RSA,这里鼓励大家利用 openssl 生成其他公钥密码算法的密钥对。
实验所需工具:OpenSSL
openssl 是一个功能强大的工具包,它集成了众多密码算法及实用工具。我们可以利用它提供的命令台工具生成密钥、证书来加密解密文件,也可以在利用其提供的 API 接口在 代码中对传输信息进行加密。
以 RSA 为加密算法,生成数字证书为例:
根据私钥生成证书签名请求。
查看证书签名请求内容。
发送证书签名请求到 CA 进行签发,生成 X.509 证书。(这里我们先生成一个 CA 服务器)
生成 CA 私钥
根据 CA 私钥生成 CA 的自签名证书(与生成证书签名请求有区别)。
查看自签名的 CA 证书。
使用 CA 的私钥和证书对用户证书签名。
SSL证书申请流程
阿里云免费SSL证书是DigiCert品牌的DV单域名证书,每个阿里云账号一年内均可申请20个免费SSL证书,只要你的阿里云账号通过实名认证即可,无论是新用户还是老用户,个人用户还是企业用户,均可申请免费SSL证书。
阿里云SSL证书官方产品面:https://www.aliyun.com/product/cas
进入证书管理控制台
点击左侧栏的“SSL证书”–“免费证书”–“立即购买”,如下图:
产品选择“免费证书”,购买数量选择“20”,其他服务选择“不需要”,勾选同意协议,一共是0元,如下图:
如上图所示,点“立即购买”,支付0元即可。
每个实名主体个人/企业,一个自然年内可以领取一次数量为20的免费证书资源包。购买后在后台填写证书绑定域名、域名验证、联系人信息、密钥算法、CSR生成方式即可申请并下载SSL证书。
创建之后,列表出现一个带申请的证书,我们点击证书申请按钮,进行我们相关的网站配置
阿里云SSL证书申请信息填写
证书绑定域名:填写你的网站域名,如www.aliyunbaike.com
域名验证方式:如果你的域名是在当前的阿里云账号下申请的,就选“自动DNS验证”,如果不在当前账号下,就选“手工DNS验证”
联系人:没有联系人,就新建一个联系人,根据事情情况填写
所在地:根据实际情况填写
密钥算法:RSA
CSR生成方式:系统生成
域名DNS验证,如果当前申请SSL证书和域名在同一阿里云账号下,选择自动DNS验证,系统会自动帮你添加DNS验证。但是,如果域名不在当前阿里云账号下,就需要选择手工DNS验证,如下图:
将提供的解析地址及解析值,添加进域名服务商的域名解析中即可进行验证。
文件验证需要首先下载提供的验证文件,之后去服务器的 Tomcat 目录的 webapps 文件夹中打开 cmd 执行命令,创建多级文件夹,再进行如下验证:
域名验证,提交审核。回到刚刚的SSL证书申请页面,点击“验证”,如果域名验证成功,点击“提交审核”即可,提交审核后会提示:已经成功提交到CA公司,请您保持电话畅通,并及时查阅邮箱中来自CA公司的电子邮件。如下图:
一般等待几分钟即可下发SSL证书,然后下载证书即可。阿里云SSL证书支持多种服务器类型,如:Tomcat、Apache、Nginx、IIS、JKS、其他及根证书下载。如下图:
审核成功后选择下载适用于 Tomcat 的证书格式,将证书文件复制到服务器。(依照个人情况)
进入服务器 Tomcat 目录找到 conf/server.xml,若无以下内容就进行添加:
<Connector port="8078" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="conf/xxxxx.pfx"
keystorePass="xxxxxxx"
clientAuth="false" sslProtocol="TLS"/>
注:keystoreFile 写证书文件全名,keystorePass 写下载后随机生成的密码(打开 txt 文件,里面有写),其余的配置除了 port 端口号可以修改,其他的不需要修改。
至此结束,重启 Tomcat 即可使用 HTTPS 协议调用服务。