OpenSSL自签用于PDF的V3证书 作者: Hogwarts 发布于: 2025-01-27 更新于: 2025-04-04 分类: 默认分类 #一、Windows10系统 ##1.1 用CA证书直接使用 生成 CA 私钥key–>生成 CA 证书请求csr–>自签名得到根证书crt(CA 给自已颁发的证书) ###1.1.1 生成CA私钥 openssl genrsa -aes128 -out ca.key 4096 ###1.1.2 生成CA请求文件 openssl req -new -days 3650 -key ca.key -out ca.csr 注意“通用名称CN”,它既是“颁发者”又是“颁发给”项的名称。 ###1.1.3 用生成的CA私钥和CA请求文件申请CA证书 openssl x509 -in ca.csr -out ca.crt -req -signkey ca.key -days 3650 ###1.1.4 转换PDF可以使用的证书格式 openssl pkcs12 -export -out ca.pfx -inkey ca.key -in ca.crt ###1.1.5 存在的问题 - “组织名称”不能输入中文。不想细究了。 - 生成的证书“颁发者”和“颁发给”的名称一致,相当于自己给自己颁奖。 ##1.2 用CA证书签发证书 ###1.2.1生成用户私钥 openssl genrsa -aes128 -out user.key 4096 ###1.1.2生成用户CSR请求文件 有互动、命令行和配置文件三种方式来生成,本例已互动式为例。注意“通用名称CN”,它是“颁发给”项。“颁发者”项为CA证书中的CN项。 openssl req -new -key user.key -out user.csr -days 3650 ###1.2.3 由根证书CA签发用户证书 openssl x509 -req -in user.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out user.crt -days 3650 -sha256 x509证书可以用它来加密,签名,但是,用于PDF签名的证书需要是 PKCS#12 格式的。 ###1.2.4 转换PDF可以使用的用户证书格式 openssl pkcs12 -export -out user.pfx -inkey user.key -in user.crt ###1.2.5 优缺点 - 生成的证书“颁发者”和“颁发给”的名称不一致,不再是自己给自己颁奖了。 - 能力有限,在Windows10下“组织名称”不能使用中文。 #二、Debian11下操作 在Debian11下默认生成V1证书且不能使用中文。心情是拔凉拔凉的。通过搜索终于搞定了V3证书和中文。具体测试过程和在Windows下差不多就不再多述。 ##2.1 生成CA证书 ###2.1.1 生成CA私钥 openssl genrsa -aes128 -out ca.key 4096 ###2.1.2 学习生成CA证书命令 命令格式如下,先不要运行,待配置完成后运行。 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -config ./openssl.cnf -extensions v3_req -utf8 -out ca.crt ####2.1.2.1 -utf8说明 -utf8 为生成`中文CSR证书`的编码格式 ####2.1.2.2 openssl.cnf说明 openssl.cnf 配置文件网上大多都不是很正确,大多认为此文件在/etc/pki/tls/目录下。又通过网络搜索看到说CentOS的在/etc/pki/tls/openssl.cnf,Debian/Ubutnu的在/etc/openssl/openssl.cnf,我在Debian11默认状态下未发现。后来通过查看配置文件命令找到的。命令如下 **查看版本** openssl version OpenSSL 1.1.1w 11 Sep 2023 **查看配置文件目录** openssl version -a OPENSSLDIR: "/usr/lib/ssl" 在`/usr/lib/ssl`发现了`openssl.cnf`,将此文件复制到和CA私钥同一目录下。 cp /usr/lib/ssl/openssl.cnf ./ ####2.1.2.3 修改openssl.cnf 文件 #####2.1.2.3.1 找到下面这两项,将其取消注释 copy_extensions = copy req_extensions = v3_req #####2.1.2.3.2 修改[ v3_req ]代码块 新增一行 subjectAltName = @alt_names #####2.1.2.3.3 新增一个代码块[ alt_names ] DNS.1 = localhost ###2.1.3 运行生成CA证书命令 openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -config ./openssl.cnf -extensions v3_req -utf8 -out ca.crt 注意:在交互过程中,输入中文的地方需进行**复制粘贴**操作(在txt文件上先将要输入的中文事先准备好),不能直接输入。 本例将生成请求文件和生成证书命令合二为一了。 ##2.2 用CA证书生成用户证书 ###2.2.1 生成用户私钥 openssl genrsa -aes128 -out user.key 4096 ###2.2.2 生成用户CSR请求文件 openssl req -new -key user.key -out user.csr -config ./openssl.cnf -extensions v3_req -utf8 - 在交互过程中,输入中文的地方需进行**复制粘贴**操作。 - \xE4\xB8\x8A\xE6\xB5\xB7\xE5\xB8\x82是十六进制编码的中文字符形式。 ###2.2.3 由根证书CA签发用户证书 openssl x509 -req -in user.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out user.crt -days 3650 -sha256 -extfile ./openssl.cnf -extensions v3_req  ###2.2.4 转换PDF可以使用的用户证书格式 openssl pkcs12 -export -out user.pfx -inkey user.key -in user.crt #三、建议 将 -sha256 改为 -sha384 SHA384是SHA系列中的另一种算法,它产生的哈希值为96个字符长度的十六进制数字。与SHA256相比,SHA384具有更强的安全性。由于其输出长度更长,因此在实际应用中适用于更高的安全需求。然而,值得注意的是,由于SHA384的输出长度较长,它在某些场景下可能会增加计算的负担。 [哈希算法详解:SHA1、SHA256、SHA384与SHA512的比较与选择](https://cloud.baidu.com/article/2989566) #四、参考 参考的太多了,都是抄的。 [在命令行中使用自签名证书对PDF进行签名](https://pengs.top/pdf-sign/ "在命令行中使用自签名证书对PDF进行签名") [使用openssl自签CA多域名泛域名证书的方法](https://haoduck.com/715.html) [自建CA并生成自签名SSL证书](https://www.008ct.top/blog/2023/11/30/%E8%87%AA%E5%BB%BACA%E5%B9%B6%E7%94%9F%E6%88%90%E8%87%AA%E7%AD%BE%E5%90%8DSSL%E8%AF%81%E4%B9%A6/) [openssl 生成X509 V3的根证书及签名证书](https://blog.csdn.net/xiangguiwang/article/details/80333728) [使用 openssl 创建自签名证书](https://www.markjour.com/article/20201217-openssl-generate-x509.html) [CA & OpenSSL自签名证书](https://foreverzmyer.hashnode.dev/cert) [使用 OpenSSL 生成私钥和签名并自己做 CA 签名](https://breezetemple.github.io/2019/04/08/setup-your-own-CA-with-OpenSSL/) [生成中文CSR证书请求文件](https://www.infinisign.com/faq/creat-chinese-csr) [创建ca证书, 然后用自己ca证书给域名颁发证书](https://blog.wenxk.top/page/5) #五、拓展推广 [GPG入门教程](https://github.com/madobet/webooru/issues/229)  [Kleopatra](https://www.openpgp.org/software/kleopatra/) 是 GnuPG 的证书管理器和 GUI。下载安装[Gpg4win](https://www.gpg4win.org/download.html)即可得到Kleopatra。  标签: openssl