公钥加密与 PKI 实验
数字证书认证机构(英语:Certificate Authority,缩写为 CA),也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。CA 机构的数字签名使得攻击者不能伪造和篡改证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。
想要从商业 CA 获取数字证书需要向其支付一定的金钱,不过我们不用那么破费,可以自己成为 root CA,为自己发布证书。
在本实验中,我们将成为 root CA,并为该 CA 生成证书。不像其他 CA 需要被另外的 CA 认证, root CA 的证书是自己为自己认证的,一般 Root CA 的证书都已事先加载在大多数操作系统,浏览器或者依赖 PKI 的软件之中了。Root CA 的证书是被无条件信任的。
配置文件:openssl.conf
为了使用 openssl 生成证书,我们首先需要进行配置,配置文件扩展名为.cnf。openssl 的 ca, req, x509 命令常常会用到这份配置文件。你可以从 /usr/lib/ssl/openssl.cnf
获得一份拷贝。将文件拷贝到工作目录后,创建以下在配置文件中指定的子文件夹(详情查看配置文件[CA default]处)
在工作目录下我们需要创建如下这些文件夹和文件,这里给出文件目录树:
.
|-- demoCA
| |-- certs
| |-- crl
| |-- index.txt
| |-- newcerts
| `-- serial
`-- openssl.cnf
index.txt
只要创建空文件就行,至于 serial
文件,内容必须是字符串格式的数字(比如 1000)
$ sudo cp /usr/lib/ssl/openssl.cnf .
$ mkdir demoCA
$ cd demoCA
$ mkdir certs crl newcerts
$ touch index.txt
$ echo '1000' > serial
$ cd ..
数字证书认证机构(CA)
我们需要为自己的 CA 生成自签名证书。这意味着该机构是被信任的,而它的证书会作为 root 证书。你可以运行以下命令为 CA 生成自签名证书:
openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
命令的输出存储在两个文件中:ca.key 与 ca.crt 中。文件 ca.key 包括 CA 的私钥,而 ca.crt 包含了公钥证书。
为 PKILabServer.com 生成证书
现在,我们是 root CA 了,我们已经准备好为我们的客户签数字证书,我们的第一个客户是叫作 PKILabServer.com 的公司,这家公司从 CA 获取数字证书需要 3 个步骤:
- Step 1:生成公开/私有密钥对
我们运行以下命令来生成 RSA 密钥对。密钥会被保存在 server.key 文件中。
openssl genrsa -des3 -out server.key 1024
- Step 2: 生成证书签名请求
CSR 将被发送给 CA,CA 会为该请求生成证书(通常在确认 CSR 中的身份信息匹配后)。请将 PKILabServer.com 作为证书请求的通用名,并且请记住自己都输了些啥。
openssl req -new -key server.key -out server.csr -config openssl.cnf
- Step 3: 生成证书
生成证书。CSR 文件需要拥有 CA 的签名来构成证书。在现实世界中,CSR 文件常常被发送给可信任的 CA 签名。本实验中,我们将使用我们自己的 CA 来生成证书:
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf
# 如果 OpenSSL 拒绝生成证书,那很可能是因为你请求中的名字与 CA 所持有的不匹配。
# 修改配置文件
policy = policy_match #改成 policy = policy_anything
在网站中使用 PKI
编辑 /etc/hosts 文件,添加
127.0.0.1 PKILabServer.com
让我们启动一个拥有我们之前生成的证书的简单的 web 服务器:
$ cp server.key server.pem
$ cat server.crt >> server.pem
$ openssl s_server -cert server.pem -www
通过 https://PKILabServer.com:4433/ 访问服务器
火狐不信任我们的CA,会有报错信息。手动导入CA证书后可以访问。
创建数字签名
步骤如下:
- 对 example.txt 产生的数字摘要使用 sha256 进行签名;输出文件 example.sha256。
- 验证 example.sha256 的数字签名。
- 稍稍修改 example.txt 再一次验证数字签名
# 产生密钥对
openssl genrsa -des3 -out myrsaCA.pem 1024
# 提取公钥文件
openssl rsa -in myrsaCA.pem -pubout -out myrsapubkey.pem
# 使用 sha256 进行签名
openssl dgst -sha256 -out example.sha256 -sign myrsaCA.pem example.txt
# 验证签名
openssl dgst -sha256 -signature example.sha256 -verify myrsapubkey.pem example.txt
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)