非对称算法之证书常用资料整理

一、公钥密码体制

网络安全中有两类非常重要的密码体制:对称密钥密码体制和公钥密码体制。对称密钥密码体制使用相同的加密密钥和解密密钥,公钥密码体制使用不同的加密密钥和解密密钥。

1. 对称密码的局限性

  • 密钥分发问题:必须保证传输密钥的信道足够安全

  • 密钥量问题:每两人都需要一对密钥,密钥量太大

  • 数字签名问题:接收方可以伪造签名,发送方可以否认发送过的消息

  • 无法解决陌生人之间的身份认证和交易信息认证问题

  • 由于以上种种,我们的主角公钥密码就要登场了!

 

2. 公钥密码体制

公钥密码体制使用不同的加密密钥与解密密钥。在公钥密码体制中,加密密钥PK(public key,即公钥)是向公众公开的,而解密密钥SK(secret key,即私钥或秘钥)则是需要保密的。加密算法E和解密算法D也都是公开的。

 

3. 公钥密码体制的应用

  • 加密、解密

  • 数字签名

  • 密钥交换:两方合作以便交换会话密钥

4. 公钥密码体制的特点

  • 密钥分发简单:公钥不需保密分发

  • 密钥量大大减少:n个用户只需n对密钥

  • 可以实现数字签名/身份认证

  • 可满足不相识的人之间的保密通信

5. 公钥与证书

公钥、密钥和数字证书 参考这篇

客户端与服务器通讯前,需要拿到公钥。 不管是提前从某地址下载,还是通讯开始前 服务器将公钥发给客户端,都会有一个问题。如何确认拿到的公钥是该服务器的,而不是中间人?如果是中间人,他将自己的公钥给客户,用自己的私钥跟客户交互, 拿服务器的公钥来跟服务器交互。 达到了窃听的目的。

为了解决这个问题,数字证书出现了,它可以解决我们上面的问题。数字证书是经过权威机构(CA)认证的公钥,通过查看数字证书,可以知道该证书是由那家权威机构签发的,证书使用人的信息,使用人的公钥。它有以下特点:

1、由专门的机构签发的数字证书才安全有效。

2、签发数字证书是收费的。

3、不会被冒充,安全可信。

4、数字证书有使用期限,过了使用期限,证书变为不可用。CA也可以在使用期内,对证书进行作废操作。

 

6. 数字证书与CA

  • 证书的发布机构

  • 证书的有效期

  • 公钥

  • 证书所有者(Subject)

  • 签名所使用的算法

  • 指纹以及指纹算法

数字证书是由CA机构签发的,CA,Catificate Authority,它的作用就是提供证书(即服务器证书,由域名、公司信息、序列号和签名信息组成)加强服务端和客户端之间信息交互的安全性,以及证书运维相关服务。任何个体/组织都可以扮演CA 的角色,只不过难以得到客户端的信任,能够受浏览器默认信任的 CA 大厂商有很多,其中 TOP5 是 Symantec、Comodo、Godaddy、GolbalSign 和 Digicert。

证书验证流程:

  1. 首先在本地找到该证书上的ca机构的根证书。如果没有,直接报错

  2. 使用ca机构根证书的公钥对服务器证书的指纹使用相应的指纹算法进行解密

  3. 使用指纹算法对服务器证书的摘要进行计算得到指纹

  4. 将计算出的指纹和从服务器证书中解密出的指纹对比看是否一样如果一样则通过认证。

在web应用中,浏览器会自动帮忙我们做验证。如果非浏览器业务,且使用自签证书,则让用户内置自己的根证书,按流程验证证书。

 

二、 公私钥生成与转换

1. 公私钥的生成与转换

PKCS1和PKCS8分析

https://blog.csdn.net/superwfei/article/details/83782678

  1. 生成私钥 默认为pkcs1格式

    openssl genrsa -out rsa_private_key.pem 2048

  2. pkcs1私钥转pkcs8私钥

    openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_8.pem

  3. pkcs8私钥转pkcs1私钥

    openssl rsa -in rsa_private_key_8.pem -out rsa_private_key_1.pem

  4. pkcs1私钥转pkcs1公钥

    openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

  5. pkcs8私钥转pkcs8公钥

    openssl rsa -in rsa_private_key_8.pem -pubout -out rsa_public_key_8.pem

    公钥的 pkcs1 和 pkcs8 格式内容应该是一模一样的。

  6. 查看私钥

    openssl rsa -in rsa_private_key_8.pem -noout -text

  7. 查看公钥

    openssl rsa -pubin -in rsa_public_key.pem -noout -text

  8. 查看modulus

    openssl rsa -in rsa_public_key.pem -noout -modulus

    openssl rsa -pubin -in rsa_public_key.pem -noout -modulus

 

  • pem和der编码操作

    -inform 指定输入编码

    -outform 指定输出编码

    例如 生成der编码的私钥 openssl rsa -in rsa_private_key_8.pem -outform der -out rsa_private_key_1.pem

  • 不进行加密

    -nocrypt 或者 -nodes

三、 证书生成

完整示例: https://github.com/chaoliangwu/openssl_ca

1. 根证书的生成

  1. 新建目录root,并进入

  2. 生成根密钥

    openssl genrsa -out rootca.key 2048

    如需加密可使用:openssl genrsa -aes256 -out rootca.key 2048

  3. 创建自签名的根CA证书

    openssl req -sha256 -new -x509 -days 1826 -key rootca.key -out rootca.crt

    如有设置密码,需要输入rootca.key私钥保护口令。

    根据提示输入:国家、省份、组织名、邮箱、等信息。

    最后生成 rootca.crt 根证书文件。

  4. 新建ca配置文件

    用于签发证书使用的一些配置,可以参考文章附件。

     

    最终目录结构

                     

2. 使用根证书签发二级根证书

  1. 回到上层目录,新建目录secondary,并进入

  2. 生成密钥

    openssl genrsa -out secondaryCA.key 2048

    如需加密可使用:openssl genrsa -aes256 -out secondaryCA.key 2048

  3. 生成证书请求

    openssl req -new -sha256 -key secondaryCA.key -out secondaryCA.csr

    如有设置密码,需要输入secondaryCA.key私钥保护口令。

    根据提示输入:国家、省份、组织名、邮箱、等信息。

    最后生成secondaryCA.csr证书请求文件。

  4. 签发证书

    openssl ca -batch -config ../root/ca.conf -notext -in secondaryCA.csr -out secondaryCA.crt

    最后生成证书 secondaryCA.crt

  5. 新建二级ca配置文件

    用于签发证书使用的一些配置,可以参考文章附件。

     

    最终目录结构

                           

 

3. 使用二级根证书签发用户证书

  1. 回到上层目录,新建目录user,并进入

  2. 生成密钥

    openssl genrsa -out user.key 2048

    如需加密可使用:openssl genrsa -aes256 -out user.key 2048

  3. 生成证书请求

    openssl req -new -sha256 -key user.key -out user.csr

    如有设置密码,需要输入user.key私钥保护口令。

    根据提示输入:国家、省份、组织名、邮箱、等信息。

    最后生成user.csr证书请求文件。

  4. 签发证书

    openssl ca -batch -config ../secondary/ca.conf -notext -in user.csr -out user.crt

    最后生成证书 user.crt

     

    最终目录结构

                            

 

四、 证书和密钥的转换

1. pkcsk12 系列

可参考 https://blog.csdn.net/as3luyuan123/article/details/16105475

#pkcs12 额外参数
-noout  不输出其他信息,只校验mac
-nomacver  不校验mac
-nocerts  不输出证书
-clcerts 只输出证书
-cacerts 只输出CA证书
-nokeys 不输出 私钥
-nodes  不加密私钥
-name xx 设置别名
-caname xx 设置ca别名
​
#查看p12证书内容
openssl pkcs12 -in .\user.p12
​
#合成pkcs12证书
openssl pkcs12 -export -inkey user.key  -in user.crt -out user.p12
​
#合成pkcs12证书带CA  验证失败待后续补充
openssl pkcs12 -export -inkey user.key  -in user.crt -CAfile ..\secondary\secondaryCA.crt -out user.p12 
​
#将pkcs12信息输出到文件
openssl pkcs12 -in user.p12 -out test.pem
​
#从pkcs12中获取证书
openssl pkcs12 -in user.p12 -clcerts -out test.crt -nodes
##证书不需要加密,但默认会提示输入密码,故加上-nodes
​
​
#从pkcs12中获取私钥
openssl pkcs12 -in user.p12 -nocerts -out test.pem -nodes

 

2. req系列

#额外参数
-text 可查看详细内容
​
#查看证书请求信息
openssl  req  -in .\user.csr -text 
​
#创建自签署CA证书
openssl req -sha256 -new -x509 -days 1826 -key rootca.key -out rootca.crt
​
#生成证书请求
openssl req -new -sha256 -key secondaryCA.key -out secondaryCA.csr
​

 

3. X509系列

#额外参数
-inform DER   指定输入编码:DER or PEM
-outform PEM  指定输出编码:DER or PEM
-text 可查看详细内容
​
#查看证书信息
openssl x509 -in  .\user.crt 
​
#从证书获取公钥
openssl x509 -in user.crt -pubkey -out pub.key

 

附录1. 证书常用编码

1. PEM

Privacy Enhanced Mail

它是 openssl 默认采用的信息存放方式。 PEM 文件一般包含如下信息: 内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。 使用PEM格式存储的证书:

-----BEGIN CERTIFICATE-----
MIIF6TCCBNGgAwIBAgIQSSOR8EYFvAGtG16qv0lZ4DANBgkqhkiG9w0BAQsFADBC
MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMS
UmFwaWRTU0wgU0hBMjU2IENBMB4XDTE3MDQyNDAwMDAwMFoXDTE5MDQyNDIzNTk1
OVowITEfMB0GA1UEAwwWc2VjdXJpdHkucHVqaW53YW5nLmNvbTCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBANrPWriCfyigreL9cVAyEPesYScRd176xhH0
.............
-----END CERTIFICATE-----

2. DER

Distinguished Encoding Rules 打开看是二进制格式,不可读。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。 PFX 或 P12 – 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件。转换时需要输入PFX文件的加密密码。 Java和Windows服务器偏向于使用这种编码格式

附录2. 证书常见格式

1. 按标准分类

PKCS#7 常用的后缀是: .P7B .P7C .SPC PKCS#10 常用的后缀有: .CSR PKCS#12 常用的后缀有: .P12 .PFX Java KeyStore 常用的后缀有: .JKS X.509 DER 编码(ASCII)的后缀是: .DER .CER .CRT X.509 PEM 编码(Base64)的后缀是: .PEM .CER .CRT

2. 按后缀分类

.cer/.crt是用于存放证书,可以是DER或PEM编码存放的,不含私钥。 .pem跟crt/cer的区别是它以Ascii来表示。 pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式 jks是Java密钥库(KeyStore)比较常见的一种格式,是JAVA的keytools证书工具支持的证书私钥格式 p10是证书请求 p7r是CA对证书请求的回复,只用于导入 p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。

附录3. 两个关键的标准

1. PKCS

PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准。

(1)PKCS#1:RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名。它定义了数字签名如何计算,包括待签名数据和签名本身的格式;它也定义了PSA公/私钥的语法。

(2)PKCS#2:涉及了RSA的消息摘要加密,这已被并入PKCS#1中。

(3)PKCS#3:Diffie-Hellman密钥协议标准。PKCS#3描述了一种实现Diffie- Hellman密钥协议的方法。

(4)PKCS#4:最初是规定RSA密钥语法的,现已经被包含进PKCS#1中。

(5)PKCS#5:基于口令的加密标准。PKCS#5描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。PKCS#5可以用于加密私钥,以便于密钥的安全传输(这在PKCS#8中描述)。

(6)PKCS#6:扩展证书语法标准。PKCS#6定义了提供附加实体信息的X.509证书属性扩展的语法(当PKCS#6第一次发布时,X.509还不支持扩展。这些扩展因此被包括在X.509中)。

(7)PKCS#7:密码消息语法标准。PKCS#7为使用密码算法的数据规定了通用语法,比如数字签名和数字信封。PKCS#7提供了许多格式选项,包括未加密或签名的格式化消息、已封装(加密)消息、已签名消息和既经过签名又经过加密的消息。

(8)PKCS#8:私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。

(9)PKCS#9:可选属性类型。PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter signature)、质询口令字和扩展证书属性。

(10)PKCS#10:证书请求语法标准。PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。

(11)PKCS#11:密码令牌接口标准。PKCS#11或“Cryptoki”为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。智能卡就是实现Cryptoki的典型设备。注意:Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。而且Cryptoki只说明了密码接口,并未定义对设备来说可能有用的其他接口,如访问设备的文件系统接口。

(12)PKCS#12:个人信息交换语法标准。PKCS#12定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。

(13)PKCS#13:椭圆曲线密码标准。PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密,还有密钥协定,以及参数、密钥和方案标识的ASN.1语法。

(14)PKCS#14:伪随机数产生标准。PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢?PKI中用到的许多基本的密码学函数,如密钥生成和Diffie-Hellman共享密钥协商,都需要使用随机数。然而,如果“随机数”不是随机的,而是取自一个可预测的取值集合,那么密码学函数就不再是绝对安全了,因为它的取值被限于一个缩小了的值域中。因此,安全伪随机数的生成对于PKI的安全极为关键。

(15)PKCS#15:密码令牌信息语法标准。PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的,尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了翻译家的角色,它在卡的内部格式与应用程序支持的数据格式间进行转换。

2. X509

X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。X.509是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)的证书格式标准。作为ITU-ISO目录服务系列标准的一部分,X.509是定义了公钥证书结构的基本标准。1988年首次发布,1993年和1996年两次修订。当前使用的版本是X.509 V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509 V3证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段,即使在强制字段中,X.509证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案.

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值