一、公私钥
公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),将其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。
二、证书和密钥关系
证书用于管理公钥。(公钥要公开。如何避免公钥被替换或损毁,引入了证书。)
私钥在服务器端,公钥一般在证书中(证书可以简单理解就是 比较安全防篡改的私钥)
比方
证书好比身份证(公钥+姓名+数字签名)。
证书机构(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加以区别
步骤:
- 生成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证书其实就是一个普通的自签名证书
- 生成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步的命令一致)
- 使用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
- 验证证书是否创建无误
openssl verify -CAfile ca.crt server.crt
注:证书生成的文件如果直接vim查看是乱码,可以输入命令查看证书内容
openssl x509 -in ca.crt -noout -text
openssl x509 -in server.crt -noout -text