本地测试RSA非对称加密功能时,需要用到签名证书。本文记录作者使用openssl本地生成证书的步骤,并没有深入研究openssl,难免会有错误,欢迎指出!!!
生成证书标准流程:
1、生成私钥(.key)
2、用私钥生成证书请求(.csr)
3、将证书请求文件(.csr)提交给证书颁发机构(CA),CA会对提交的证书请求中的所有信息生成一个摘要,然后使用CA根证书对应的私钥进行加密,这就是所谓的“签名”操作,完成签名后就会得到真正的签发证书(.cer或.crt)
一、openssl生成证书
1、生成一个 2048 位的 RSA 私钥
openssl genrsa -out private.key 2048
2、使用私钥来生成新的证书签名请求(.csr)
openssl req -new -key private.key -out private.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
- -new 表示创建一个新的证书请求;
- -key 后面跟着的是私钥文件;
- -out 后面是输出的CSR文件;
- -subj 是请求中的主题信息。你将被要求提供一些信息,如你的国家、省份、城市、组织名称等。这些信息将包含在你的证书中。
-
- /C= 是证书的国家代码。
- /ST= 是州或省份名称。
- /L= 是城市名称。
- /O= 是组织名称。
- /OU= 是组织单位名称。
- /CN= 是通用名称,通常是域名。
- /emailAddress= 是电子邮件地址。
3、有了私钥和证书签名请求后,我们可以选择做3件事:
3.1 标准CA签发流程
- 将证书请求(.csr)提交给CA认证机构申请证书(.crt);
- CA机构会用他的根证书对应的私钥来签名(由CA机构操作);
3.2 生成自签名证书
可以看到标准CA签发流程是用CA机构的私钥去签名。而自签名证书是用自己的私钥签署自己的证书请求,生成自签名SSL证书。
注意:自签名证书不会被浏览器信任,只能用于内部或测试用途。如果你需要一个可被浏览器信任的证书,你需要从受信任的证书颁发机构(CA)获取签名证书。
openssl x509 -req -in private.csr -out private.crt -signkey private.key -days 365
- openssl x509 -req 表示签名请求,生成证书。
- -in private.csr 表示输入的CSR文件名。
- -out private.crt 表示输出的CRT文件名。
- -signkey private.key 表示用于签名的私钥文件名。
- -days 表示证书的有效期。
生成的证书格式默认是 PEM,即 Privacy Enhanced Mail,它是 Base64 编码的 ASCII 码文件,常用于存储证书和密钥。PEM 格式的证书通常以 -BEGIN CERTIFICATE- 开始,以 -END CERTIFICATE- 结束,如图:
3.3 私有CA签发证书
如果我们把3.2生成自签名证书(ca.crt)和私钥(ca.key)当作私有的CA机构,然后签署其他的证书签名请求,生成私有CA签名的证书,这个过程,可以理解为是私有CA签发证书。
CA签名证书命令:
- ca.key就是3.2的private.key;
- ca.crt就是3.2的private.crt;
- server.csr就是我们需要签名的证书请求
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365
- -req 表示要处理的输入文件是一个证书签名请求(CSR)。
- -in server.csr 表示要处理的CSR文件名为server.csr。
- -CA ca.crt 表示CA的证书文件名为ca.crt。
- -CAkey ca.key 表示CA的私钥文件名为ca.key。
- -CAcreateserial 表示如果CA的证书和私钥不存在,则创建它们。
- -out server.crt 表示生成的服务器证书输出文件名为server.crt。
二、命令简化
生成 私钥(.key) 和 证书签名请求(.csr) 可以用一条命令实现:
openssl req -new -newkey rsa:2048 -nodes -keyout my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
生成 私钥(.key) 和 证书签名请求(.csr) 再生成 签名证书(.crt)可以用一条命令实现:
openssl req -x509 -newkey rsa:2048 -nodes -keyout my.key -out my.crt -days 3650 -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"
三、其他命令
使用私钥生成对应的公钥:
openssl rsa -in private.key -pubout -out public.pub
从证书中提取公钥:
openssl x509 -pubkey -noout -in private.crt > public_key.pem