常用子命令

  • 生成私钥:genrsa
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

常用选项:
-out filename:将生成的私钥保存至指定的文件中
-des|-des3|-idea:私钥的加密算法,可以不设置
numbits:指定生成私钥的大小,默认是2048

openssl genrsa -out server-key.pem 1024 
openssl genrsa -des3 -out server-key.pem 1024
  • 生成公钥:rsa
openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]

常用选项
-in filename:指明私钥文件的存放路径;
-out filename:指明将公钥的保存路径;
-pubout:设置此选项后,保存公钥值到输出文件中,默认的是保存私钥值到输出文件中。
如:

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
  • 生成证书:req
openssl req [-help] [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file…] [-writerand file] [-newkey rsa:bits] [-newkey alg:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-digest] [-config filename] [-multivalue-rdn] [-x509] [-days n] [-set_serial n] [-newhdr] [-addext ext] [-extensions section] [-reqexts section] [-precert] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-sigopt nm:v] [-batch] [-verbose] [-engine id]

常用选项
-new:表示生成一个新的证书签署请求;
-x509:用于生成CA自签证书;
-key:指定生成证书用到的私钥文件;
-out filename:指定生成的证书的保存路径;
-days:指定证书的有效期限,单位为day,默认是30天,与 -x509 选项一起使用;
-subj:申请人信息,格式是 /C=CN/O=Corp/…/CN=www.ez.com,可以使用 \ 转义,不会跳过空格.(可选,不设置进入交互输入流程)
-config 设置证书生成配置文件(可选,不设置进入交互输入流程)

openssl req -new -x509 -key server-key.pem -out server-cert.pem -days 365 -subj "/C=CN/ST=Zhejiang/L=Ningbo/O=yyyy/OU=IT Dept/CN=xxxx.com"
openssl req -new -x509 -key server-key.pem -out server-cert.pem -days 365 -config ssl.cnf

配置文件ssl.cnf

[ req ]
distinguished_name     = req_distinguished_name
prompt                 = no
[ req_distinguished_name ]
C                      = CN(国家)
ST                     = Zhejiang(省)
L                      = Ningbo(市)
O                      = yyyy(公司名称)
OU                     = IT Dept(部门)
CN                     = xxxx.com(域名)

扩展
生成私钥同时生成证书

openssl req -x509 -newkey rsa:2048 -nodes -keyout server-key.pem -out server-cert.pem -days 3650 -config ssl.cnf

-newkey rsa:2048 生成一个新的证书申请,同时生成一个 2048 位的 RSA 私钥
-nodes 不对新私钥加密

  • 查看证书内容:x509
openssl x509 -in server-cert.pem -noout -serial -dates -subject

常用选项
-noout:不输出加密的证书内容;
-serial:输出证书序列号;
-dates:显示证书有效期的开始和终止时间;
-subject:输出证书的subject;

标准的CA签发流程

1 创建私钥(.key)

openssl genrsa -out my.key 2048

2 基于私钥(.key)创建证书签名请求(.csr)

openssl req -new -key my.key -out my.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1"

3.将证书申请请求(.csr)提交给CA认证机构申请证书(.crt)
CA会对提交的证书请求中的所有信息生成一个摘要,然后使用CA根证书对应的私钥进行加密,这就是所谓的“签名”操作,完成签名后就会得到真正的签发证书(.cer或.crt)
4.CA机构生成CA证书链
绝大多书情况下,CA机构返还不是一个单一的证书,而一个证书链。

自签名证书生成

openssl 私钥加密 公钥解密 逻辑 openssl生成证书和公私钥_服务器

前两步同标准的CA签发流程,区别在要自己生成私有的CA私钥与CA根证书
1 创建私钥(.key)

openssl genrsa -out server.key 2048

2 基于私钥(.key)创建证书签名请求(.csr)

openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1"

3.生成CA私钥(ca.key)和CA自签名证书(ca.crt)

openssl req -x509 -newkey rsa:2048 -nodes -keyout ca.key -out ca.crt -days 3650  -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain2"

4.使用CA证书(ca.crt)与密钥(ca.key)签署服务器的证书签名请求(server.csr),生成私有CA签名的服务器证书(server.crt)

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650

5.验证证书

openssl verify -CAfile ca.crt server.crt

6.验证常见问题

error 18 at 0 depth lookup:self signed certificate

原因:CA自签名证书和服务器证书CN字段不能相同

证书在线生成与校验网站

https://myssl.com/cert_decode.htmlhttps://www.ssleye.com/ssltool/self_sign.html

服务器私钥加密保存

openssl rsa -des -in server.key -out encrypt.key

解密方法

openssl rsa -in encrypt.key -out nopassword.key

认证流程

SSL/TLS的单向认证和双向认证详解