密钥、证书原理与创建

一、公私钥

公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),将其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

二、证书和密钥关系

证书用于管理公钥。(公钥要公开。如何避免公钥被替换或损毁,引入了证书。)

私钥在服务器端,公钥一般在证书中(证书可以简单理解就是    比较安全防篡改的私钥)

比方

证书好比身份证(公钥+姓名+数字签名)。

证书机构(CA)好比公安局,负责管理和分发身份证。

证书内容

证书实际上是对于非对称加密算法来说的,一般证书包括公钥、姓名、数字签名三个部分。

CA登记 HASH(公钥+姓名) 标识唯一性,也就是证书里的数字签名。

甲方 发送数据给 乙方,去CA查找乙方的身份证书,上面有乙方的信息,可以保证公钥就是乙方的。然后把要加密的信息进行加密 给乙方。

三、生成证书的步骤与原理

生成证书的标准流程:

1.生成自己的私钥文件(.key)

2.基于私钥生成证书请求文件(.csr)

3.将证书请求文件(.csr)提交给证书颁发机构(CA),CA会对提交的证书请求中的所有信息生成一个摘要,然后使用CA根证书对应的私钥进行加密,这就是所谓的“签名”操作,完成签名后就会得到真正的签发证书(.cer或.crt)

4.用户拿到签发后的证书,可能需要导入到自己的密钥库中,如Java的keystore,或根据需要再进行各种格式转换(.pem .p12 .jks等等)

四、生成自签名证书

步骤:

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/CN=domain2"

参数:

/C= Country 国家

/ST= State or Province 省

/L= Location or City 城市

/O= Organization 组织或企业

/OU= Organization Unit 部门

/CN= Common Name 域名或IP

3. 使用自己的私钥(.key)签署自己的证书签名请求(.csr),生成自签名证书(.crt)

openssl x509 -req -in my.csr -out my.crt -signkey my.key -days 3650

对于这条命令,要注意以下几点:

这个命令是openssl x509,-req是参数,和前面生成证书签名请求的openssl req命令不同。

-signkey my.key配置清晰地表明使用自己的私钥进行签名。

注:1-2步可以用一条命令生成

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"

1-3步也可以用一条命令生成

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"

五、生成私有CA签名证书

与生成自签名证书不同地方在于,生成自签名证书场景下只有一个参与方,请求证书和签发证书都是自己,而生成私有CA证书的场景里两个角色:

签发证书的一方:CA(主要牵涉的是CA私钥和根证书)

请求签发证书的一方:如服务器

为了变于区别,我们把它相关的文件分别用ca和server加以区别

步骤:

  1. 生成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=domain1/CN=domain2" 

(此步骤和生成自签名中简化1-3步的命令一致)

注:私有CA证书其实就是一个普通的自签名证书

  1. 生成Server端私钥(server.key)和证书签名请求(server.csr)
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=domain1/CN=domain2"

(此步骤和生成自签名中简化1-2步的命令一致)

  1. 使用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
  1. 验证证书是否创建无误
openssl verify -CAfile ca.crt server.crt

注:证书生成的文件如果直接vim查看是乱码,可以输入命令查看证书内容

openssl x509 -in ca.crt -noout -text

openssl x509 -in server.crt -noout -text

Published by

风君子

独自遨游何稽首 揭天掀地慰生平