关于对称和非对称的加密操作,我们已经学习完两篇文章的内容了,接下来,我们就继续学习关于证书的生成。
CSR 是用于生成证书的签名请求,在 CSR 中,我们需要一些 dn 信息。其实也就是当前这个证书的服务对象,包含公司名、邮箱之类的内容。
使用 openssl_csr_new() 通过私钥来生成 CSR 句柄,然后通过 openssl_csr_export() 抽取证书请求内容。可以看出,在 CSR 中是包含公钥信息的,因为我们可以通过 openssl_csr_get_public_key() 和 openssl_pkey_get_details() 来抽取公钥。
当然,我们也可以通过一个函数来获取 CSR 中的 dn 信息,这个函数也是可以获得外部下载的 CSR 中的信息的。
x509 是标准的公钥证书规范,并且只包含公钥信息。
通过 openssl_csr_sign() 这个函数,为 CSR 进行签名后获得的就是 x509 规范的一个证书内容。在这个证书中是可以提取出公钥信息的,我们可以将这个证书颁发给用户或者客户端,然后由客户端从证书中抽取公钥信息来进行数据加密。
当然,我们也可以验证当前的 x509 证书内容和我们的私钥是否匹配。下面的 openssl_x509_verify() 是 PHP7.4 以后才支持的函数。
最后,我们来看一下 pkcs 签名证书。pkcs 分为 pkcs7 和 pkcs12 两种,pkcs7 一般用于数字信封加密,可以往里面添加 x509 ,会生成 PEM 和 DER 两种编码方式,一般我们会使用 PEM ,它其实包含的就是公钥信息。
pkcs12 一般导出的就是 PFX 文件,pkcs12 还需要另外添加一个证书密码,所以 pkcs12 是可以包含私钥的。它一般用于消息交换与打包语法。
在这里的测试我们就是简单地通过 openssl_pkcs12_export() 来导出一个 pkcs12 证书,可以看到这个函数包含了 CSR 、私钥 和一个自定义的证书密码。导出的内容是二进制的内容,我们可以直接将这些内容保存为一个 PFX 文件。
通过 openssl_pkcs12_read() 就可以读取一个 PFX 文件内容,获得证书的 certs 信息,也就是 CSR 信息。可以看到我们用 openssl_x509_export(净化板) 导出后的结果中的私钥与我们最开始创建的是私钥是匹配的。