各位好,鸽了好几天,正常的博客正在筹备,正好这次的 《密码学》 课程实验比较轻松简单,有一定趣味性,记一下这次有趣的经历。

目标!!


这次实验是关于 证书 的实验 : 证书生成及应用实验——利用证书进行安全邮件通信

首先你“扮演”CA 的工作人员,为客户 (现在就是你自己) 生成一个私钥和证书,然后你要通过安全的方式将私钥交给客户 特别要注意的是,你给客户需要需要生成公私钥信息的 PKCS#12 文件,在实验中使用。 利用支持公钥签名和加密的 email 客户端,给指导老师发一个加密的签名邮件。 注:生成证书时,序列号可以随机生成,也可以指定,根据前几届有些同学式样情况,发现有些同学使用的是同一个序列号,那么老师在导入证书时,会出现冲突,为了避免这样的情况发生,要求生成证书时,制定序列号,序列号是自己的学号,在指定序列号时,通常要求使用的是十六进制的数,所以需要将你的十进制学号转为十六进制数

以上一大串内容就是本次实验的要求了,我们秉承着工科思维,先干!之后再介绍相关要用到的知识 (实际我也在学啊)

让我们开始吧


Thunderbird 是老师推荐的实验用客户端,但是我们既然都在这里写博客,肯定是要有点 极客 精神的,至少不会乖乖听话。

这里的 Thunderbird 是 Mozilla 基金会 发的一款开源的邮件应用,你可能不知道 Mozilla ,但是你一定听说过 火狐(firefox)浏览器。没错,就是他们维护的,准确来说是广大开发者共同维护的开源应用,这次的 Thunderbird 也不例外。

他们仍有许多开源的服务,例如 MDN 就是一个学习 Web 开发的好去处,但这与我们本次实验无关,我们不在多提。

我这次用的是 Microsoft Outlook 邮件客户端 (经典版),这里不知道为什么新版的 Outlook 没有办法找到 S/MIME 的设置在何处 新版教程,只得回退版本。

我在这里的本意是 Outlook 已经安装了,就不用再去安装 Thunderbird ,可惜事与愿违,仍然折腾了一番。

配置证书


说了这么一大堆,我们的实验还没开始。

我们获得了: 1.收件人公钥证书 teacher.cer 2.CA 机构公钥证书 xxxcacert.cer 3.CA 的私钥文件 xxxcakey.pem

生成个人私钥


我们首先要使用 OpenSSL 生成 RSA 非对称密钥,这里的 git Bash 自带了 openssl ,我们也可以自行配置环境。

运行

openssl genrsa -out Name.key 2048

//也可以用下面的写法
//上面的是PKCS1,可以使用pkey转成PKCS8
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out Name.key

生成证书请求文件


我们要通过我们上边生成的私钥来生成一份证书申请 .csr (Certificate Signing Request)

运行

openssl req -new -key Name.key -out Name.csr

//这里可以在new后加 -utf8 支持中文,这里没加后面有乱码
//也可能是git bash的openssl版本问题

这里我们要填写申请信息

Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Beijing
Locality Name (eg, city) []:Beijing
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XXX
Organizational Unit Name (eg, section) []:SecLab
Common Name (e.g. server FQDN or YOUR name) []:XXX
Email Address []:XXXXXX@outlook.com

Please enter the following 'extra' attributes
to be sent with your certificate request

//这里为空
A challenge password []:
An optional company name []:


//示例如上,Email地址要与你发邮件的地址一样,其他随意
//若真实环境则按要求填写

在这里我们需要把我们的 申请(.csr)去给到 CA 帮我们签发证书 很显然,我们就是CA

配置SAN


SAN,Subject Alternative Name,主题备用名称

IETF 的 RFC5750 明确规定:SAN 扩展(rfc822Name 类型)是 S/MIME 证书中传递邮箱地址的首选方式,没有 SAN 的证书会被多数现代客户端拒绝用于签名 / 加密。

为了避免麻烦,我们这里还是简单配置一下,也是很简单。

创建:san.ext文件 填写以下内容

basicConstraints = CA:FALSE
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = emailProtection
subjectAltName=email:XXXX@outlook.com

//邮箱要和发件邮箱一致噢

签发证书


终于到这里了,我们现在是非常 专业 的CA,给我们自己签发一张证书吧! 命令如下:

openssl x509 -req
-in Name.csr #导入证书申请 
-CA XXXcacert.cer #CA机构公钥证书 
-CAkey XXXcakey.pem #CA公章私钥 
-passin pass:P@ssw0rd #CA私钥解密密码
-set_serial 0xHEX #证书序列号
-days 365 # 证书有效期
-extfile san.ext #载入SAN
-out Name.cer #输出证书

//根据实验要求更改序列号为学号十六进制
//密码要根据提供填写

执行完后我们就有了一张证书!这和我随身携带一支笔,等待着随时给别人签名很像啊。

将私钥和证书打包


现在 专业 的CA机构给我们签发了一张证书,我们需要把给我们签发的证书和我们自己的私钥打包在一起,生成PKCS#12 加密打包文件

因为包含了私钥,所以这个不需要提交,这里显而易见的.key的私钥也不要提交上去。

openssl pkcs12 -export -in Name.cer -inkey Name.key -out Name.p12
//输入证书.cer 你的私钥.key 将他们打包 输出.p12

//在下面输入你设置的密码
Enter Export Password:
Verifying - Enter Export Password:

安装证书


我们生成了一堆证书,给我们安装起来用吧!

安装 .p12 ->输入密码安装使用,默认 安装 XXXcacert.cer ->指定证书存储位置->浏览-> 受信任的根证书颁发机构

Outlook 邮件

打开客户端->左上角文件->左下角选项->最下面一栏信任中心-> 信任中心设置 ->电子邮件安全性->按D(给待发邮件添加电子签名)

之后我们先导入电子签名(数字标识) ->导入导出->导入已有文件->浏览(找到我们生成的.p12文件)->输入密码后导入

最后我们设置/配置 加密电子邮件(S/MIME) ->设置(默认设置)->导入签名证书/加密证书->调整算法(随便) ->保存

这里会遇到证书是乱码的问题,不过我们通过浏览->更多选项,通过查看颁发者可以分辨出来哪个是我们的.cer证书; 如果你有很多相同颁发者,我们可以往上滑查看证书属性,详细信息有序列号(就是我们之前设置那个,如果你不设置是随机的),选择我们的证书即可。

这里一定要安装自己的证书而不是目标邮箱的证书…….

全都配置好后,全部确认点回去发邮件!

导入目标证书 发送邮件!


左上角的新建电子邮件 旁边 的小三角,点击添加联系人。把给我们的电子邮箱 xxxx@xxxxx填进去,之后点击中间栏的 证书 ,右侧导入目标老师的证书。

保存更改后我们就可以发邮件了,让我们结束这次实验吧!

依旧选择新建电子邮件,在上方的工具栏选择 选项 ,将 加密,签署 这两个全都点上 按照要求发送对应要求的邮件。

点击发送。

发送完成后,我们可以查看已发送邮件,正文右上角会有一个小锁和一个勋章,这代表着我们成功完成了加密和签名。这次的实验到这里也就结束了

相关知识


待补充…