参考文献:

  1. https://blog.csdn.net/gengxiaoming7/article/details/78505107
  2. https://blog.csdn.net/liuchunming033/article/details/48470575
  3. https://www.cnblogs.com/guogangj/p/4118605.html

概念

SSL与OpenSSL

Secure Socket Layer, 安全套接字层,是一种加密规范。现在应该叫TLS。

OpenSSL是SSL的一个开源实现,包含了绝大多数的加密算法、加密协议和库。

PKCS(公钥密码学标准)

是一个由RSA信息安全公司所设计与发布的标准。

OpenSSL默认使用PKCS#1标准,同时也支持PKCS7、PKCS#8、PKCS12标准。

以下内容来自维基百科中文词条公钥密码学标准

PKCS#1:RSA密码编译标准(RSA Cryptography Standard)。定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。PKCS#7:密码消息语法标准(Cryptographic Message Syntax Standard)。参见RFC 2315。规范了以公开密钥基础设施(PKI)所产生之签名/密文之格式。其目的一样是为了拓展数字证书的应用。其中,包含了S/MIMECMS。PKCS#8:私钥消息表示标准(Private-Key Information Syntax Standard)。Apache读取证书私钥的标准。PKCS#12:个人消息交换标准(Personal Information Exchange Syntax Standard)。定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。

X.509证书链

X.509是一种证书标准,主要定义了证书中应该包含哪些内容。

编码格式

X.509有两种编码格式:PEMDER

PEM:Privacy Enhanced Mail,文本格式,以“---BEGIN...”开头,以"...END---"结尾,内容是base64编码。

DER:Distinguished Encoding Rules,二进制格式,不可读。Java和Windows服务器偏向于使用此种编码格式。

相关文件的扩展名

.crt:crt是certificate的三个字母,是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证,常见于*NIX系统,编码可能是PEM或DER,大多数为PEM。

.cer:在Windows上与crt同义,编码可能是PEM或DER,大多数为DER。

.csr:Certificate Signing Request,证书签名请求文件,用于申请证书(但本身并不是证书,而是向权威证书颁发机构获得签名证书的申请)。其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。例如iOS APP开发者向苹果申请开发者证书。

.key:公钥或私钥文件(注意:key是密钥而不是证书),编码可能是PEM或DER,通常是RSA算法。

.PFX/.P12:predecessor of PKCS#12,不同于*NIX的服务器将crt和key分开存放,Windows的IIS服务器将公钥和私钥同时放在一个文件中(事实上应当是个证书密钥库)。

.crl:证书吊销列表,Certificate Revocation List的缩写

.pem:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

.jks:Java Key Storage,Java的密钥容器,通过keytool工具管理。

思路

首先要有一个CA根证书,然后用CA根证书来签发用户证书。

用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。

特别说明:

  1. 自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同.
  2. 根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。任何安装CA根证书的服务器都意味着对这个CA认证中心是信任的。

数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。

RSA密钥操作

默认情况下,OpenSSL输出格式为PKCS#1-PEM

生成RSA私钥

# 生成RSA私钥(无加密)
openssl genrsa -out rsa_private.key 2048
# 生成RSA私钥(使用AES-256加密)
openssl genrsa -aes256 -passout pass:123456 -out rsa_aes_private.key 2048

命令解释:

openssl:openssl主程序

genrsa:openssl的子命令,generate RSA的缩写,生成RSA私钥

-out <file name>:输出文件(生成的RSA私钥)

2048:RSA密钥长度为2048位(不建议采用1024位)

-aes256:使用AES-256算法对私钥进行加密

-passout pass:<your password>:代替shell进行密码输入,否则会提示输入密码

私钥生成公钥

# 生成RSA公钥(无加密)
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
# 生成RSA公钥(私钥为AES-256加密)
openssl rsa -in rsa_aes_private.key -passin pass:123456 -pubout -out rsa_public.key

命令解释:

rsa:openssl的子命令

-in <file name>:输入文件(RSA私钥)

-passin pass:<your password>:代替shell进行密码输入,否则会提示输入密码

(注意:-passin-in <file name>的密码,-passout-out <file name>的密码)

-pubout:输出公钥

私钥用AES加密保护

# 非加密私钥转换为加密私钥
openssl rsa -in rsa_private.key -aes256 -passout pass:123456 -out rsa_aes_private.key
# 加密私钥转换为非加密私钥
openssl rsa -in rsa_aes_private.key -passin pass:123456 -out rsa_private.key

私钥格式转换

# PEM格式转DER格式
openssl rsa -in rsa_private.key -inform pem -outform der -out rsa_private.der
# DER格式转PEM格式
openssl rsa -in rsa_private.der -inform der -outform pem -out rsa_private.key

命令解释:

-inform <format>:输入文件的格式

-outform <format>:输出文件的格式

(注意:-inform <format>-in <file name>的格式,-outform <format>-out <file name>的格式)

私钥PKCS#1转PKCS#8

# PKCS#8格式的密钥默认采用des3加密
openssl pkcs8 -topk8 -in rsa_private.key -passout pass:123456 -out pkcs8_private.key
# 使用-nocrypt参数可以输出无加密的pkcs8密钥
openssl pkcs8 -topk8 -in rsa_private.key -nocrypt -out pkcs8_private.key

命令解释:

pkcs8:openssl子命令,使用PKCS#8格式,默认采用DES3加密

-topk8:输出PKCS#8格式的私钥

-nocrypt:输出无加密的私钥

查看明细

# 私钥查看明细(PEM格式)
openssl rsa -in rsa_private.key -noout -text
# 私钥查看明细(DER格式)
openssl rsa -in rsa_private.key -inform der -noout -text
# 公钥查看明细(PEM格式)
openssl rsa -in rsa_public.key -pubin -noout -text

命令解释:

-noout:不在控制台打印密钥

-text:在控制台输出信息

-inform der:指出密钥为DER格式

-pubin:输入的是公钥

证书

证书包含的信息

  • C:country name (2 letter code),国名,两个字母。中国填CN
  • S:State or Province Name (full name),州或省名,填写全称。四川省填Sichuan
  • L:Locality Name (eg, city),城市名。成都市填Chengdu
  • O:Organization Name (eg, company),组织名称
  • OU:Organizational Unit Name (eg, section),部门名称
  • CN:Common Name (e.g. server FQDN or YOUR name),通常填服务器域名或IP地址,必填
  • E:Email Address,电子邮件地址

生成CA根证书

方法一:按步骤生成CA私钥、CA证书请求、CA自签名根证书

# 生成CA私钥
openssl genrsa -out ca.key 2048
# 生成CA证书请求
openssl req -new -key ca.key -out ca.csr
# 自己给自己签名,生成自签名证书(CA根证书)
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

方法二:用一条命令同时生成CA私钥和自签名根证书(代替上述情况)

openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/ST=SC/L=CD/O=bufBrane.com/OU=dev/CN=bufBrane/emailAddress=bufbrane@bufbrane.com"

方法三:先生成CA私钥,再使用私钥生成自签名证书:

# 生成CA私钥
openssl genrsa -out ca.key 2048
# 生成自签名证书
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

命令解释:

req:openssl子命令,用于生成签名请求

-new:new request,指生成证书请求

-x509:req的选项,表示直接输出证书

-newkey <type:bits>:产生私钥,type一般为rsa等,bits一般为2048位

-keyout <file name>:输出私钥的文件名

-nodes:输出不加密的私钥,可用于替换-passout <your password>选项

-subj <val>:自动输入证书拥有者信息


x509:openssl子命令,表示输出X.509格式标准的证书

-req:x509的选项,输入一个证书请求,对其签名并输出

-key <key file>:指定私钥文件

-days <digits>:证书有效期(天)

-signkey:CA自己的私钥,对签名请求(.csr文件)进行签名

生成PEM格式证书

# 将证书和私钥连接即可
cat ca.crt ca.key > ca.pem

生成PFX/P12证书

# 将PEM证书和私钥转换为PKCS#12证书
openssl pkcs12 -export -in ca.crt -inkey ca.key -passin pass:123456 -password pass:123456 -out ca.p12 -certfile ca.crt

命令解释:

pkcs12:openssl的子命令

-inkey:导入私钥

-export:导出PKCS#12证书

-certfile:导入CA证书(如果有的话)

PCKS#12提取PEM文件

# 提取PEM文件
openssl pkcs12 -in ca.p12 -password pass:123456 -passout pass:123456 -out ca.pem
# 仅提取私钥
openssl pkcs12 -in ca.p12 -password pass:123456 -passout pass:123456 -nocerts -out ca_private.pem
# 仅提取证书(所有证书)
openssl pkcs12 -in ca.p12 -password pass:123456 -nokeys -out ca_certs.pem
# 仅提取证书(CA证书)
openssl pkcs12 -in ca.p12 -password pass:123456 -nokeys -cacerts -out ca_cert.pem 
# 仅提取证书(自身证书)
openssl pkcs12 -in ca.p12 -password pass:123456 -nokeys -clcerts -out cert.pem 

证书编码转换

# PEM转为DER:
openssl x509 -in ca.crt -outform der -out ca.der
# DER转为PEM:
openssl x509 -in ca.crt -inform der -outform pem -out ca.pem

查看证书信息

# 查看PEM格式证书的信息
openssl x509 -in ca.crt -noout -text
# 查看DER格式证书的信息
openssl x509 -in ca.der -inform der -noout -text
# 查看PFX/P12证书的信息
openssl pkcs12 -in ca.p12 -passin pass:123456 -out ca.pem -nodes && openssl x509 -in ca.pem -noout -text