创建自签名证书

Last Modified: 2022/12/06

概述

本文将会介绍如何使用开源工具 openssl 创建自签名证书,具体分为以下 3 步:

  • 生成私钥;
  • 生成 CSR;
  • 生成自签名证书。

本篇中的命令均在 openssl 版本 1.1.1 上验证过,查看 openssl 版本可以使用下面的命令:

openssl version

openssl 帮助命令:

openssl help
# 查看某个子命令的帮助, 例如查看 req 的帮助信息
openssl help req

一步创建自签名证书

openssl req -x509 -newkey rsa:2048 -keyout pri.key -out cert.crt -sha256 -days 365

如果你觉得太简单,也可以折腾下自己,继续看下面一节“创建自签名证书详解”,用复杂的方式创建自签名证书以磨炼自己的意志 ...

创建自签名证书详解

生成私钥

# 生成的私钥将会存储在 pri.key 文件中,私钥长度为 2048
openssl genrsa -des3 -out pri.key 2048

注:使用了 -des3 选项后,会要求输入密码, 这个密码是 des3 加密算法的秘钥,用来加密生成的私钥。这是为了安全,如果私钥丢了,没有秘钥便无法解密私钥。如果不希望加密私钥,直接省略 -des3 选项即可。2048 表示私钥的长度,2048 长度的私钥据说到 2030 年是安全的。

2048-bit keys are projected to be safe until 2030, see more here.

生成 CSR

证书是一个包含公钥以及一些其它信息(例如:网站域名,国家、组织等信息)并经过签名的一段信息,因此要生成证书,要先填写一些证书基本信息,这些信息即是所谓的 CSR(certificate signing request)。

openssl req -key pri.key -new -out cert.csr

运行以上命令会要求填写一些 CSR 的基本信息,填写完毕后便可生成 cert.csr。其中有一个信息叫 “A challenge password”,这个信息非必填,Stack Overflow 上有人提到这个信息是过时的,没必要填写。

Enter pass phrase for pri.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:HeNan
Locality Name (eg, city) []:kaifeng
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Vv Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:verytools.net
Email Address []:veytools@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

我们可以用一个命令同时完成私钥和 CSR 的生成:

openssl req -newkey rsa:2048 -keyout pri.key -out cert.csr

如果我们不希望加密私钥,可以使用下面的命令:

openssl req -newkey rsa:2048 -nodes -keyout pri.key -out cert.csr

注:-nodes 不能翻译成节点,-nodes 表示 NO DES,表示我们不希望使用 DES3 加密私钥。运行以上两条命令都会通过交互式方式向用户收集 CSR 的基本信息,我们可以更进一步,通过非交互式方式直接在命令中提供这些信息:

openssl req -newkey rsa:2048 -nodes -keyout pri.key -out cert.csr -subj /C=CN/ST=HeNan/L=KaiFeng/O="Your Company Name"/CN="verytools.net"

生成自签名证书

自签名证书就是使用自己私钥签名签名的证书。它和 CA 签名的证书一样也可以用来加密数据,但是该证书不是权威机构颁发的,证书的使用者会被提醒该证书不受信任。有了 CSR 和私钥之后,我们可以用以下命令生成证书:

openssl x509 -signkey pri.key -in cert.csr -req -days 365 -out cert.crt

注:注意,上面的命令中 x509 前面没有 -

我们不一定要事先生成 CSR,直接使用私钥就可以生成证书,这种情况下会生成一个临时的 CSR,仍然是通过交互的方式收集 CSR 信息,以下命令一步生成了私钥和自签名证书:

openssl req -x509 -newkey rsa:2048 -keyout pri.key -out cert.crt -sha256 -days 365

注:用这种方式生成的 cert.crt 是根证书,为了验证我们可以使用以下命令查看证书信息:

openssl x509 -text -noout -in cert.crt

该命令会在控制台输出证书的信息,注意看输出信息中 Subject 和 Issuer 的信息相同,表明是自签名证书。

Certificate:
Data:
    Version: 3 (0x2)
    Serial Number:
        6f:da:13:35:2b:54:de:86:76:b1:3e:0e:1c:ab:22:6d:97:53:21:a3
    Signature Algorithm: sha256WithRSAEncryption
    Issuer: C = CN, ST = HeNan, L = Kaifeng, O = Vv Ltd, CN = verytools.net
    Validity
        ...
    Subject: C = CN, ST = HeNan, L = Kaifeng, O = Vv Ltd, CN = verytools.net
    Subject Public Key Info:
        ...
    X509v3 extensions:
        ...
        X509v3 Basic Constraints: critical
            CA:TRUE
Signature Algorithm: sha256WithRSAEncryption
     ...

注:由于篇幅关系以上输出信息经过大量删减!

利用自签名证书签名网站的 CSR

前面生成自签名证书是根证书,我们可以用这个根证书生成网站的证书。在此之前我们生成网站证书的私钥和 CSR:

openssl genrsa -out MyPrivate.key 2048
openssl req -key MyPrivate.key -new -out MyRequest.csr

然后创建一个配置文件,假设配置文件名为 openssl.ss.cnf,并在该配置文件中存入以下内容:

basicConstraints=CA:FALSE
subjectAltName=DNS:*.verytools.net
extendedKeyUsage=serverAuth

注:subjectAltName 也可以指定多个主机名:

subjectAltName=DNS:verytools.net,DNS:music.verytools.net

最后我们使用根证书签名网站 CSR,生成网站证书 MyCert.crt:

openssl x509 -req -in MyRequest.csr -CA cert.crt -CAkey pri.key -CAcreateserial -extfile openssl.ss.cnf -out MyCert.crt -days 3650 -sha256
有问题吗?点此反馈!

温馨提示:反馈需要登录