github:https://github.com/openssl/openssl
文档:https://www.openssl.org/docs/manmaster/man1/
证书相关概念
CA根证书
首先要有一个CA根证书,然后用CA根证书来签发用户证书。
用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的CA根证书来签发证书。
特别说明:
- (1)自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同.
- (2)根证书:根证书是CA认证中心给自己颁发的证书,是信任链的起始点。任何安装CA根证书的服务器都意味着对这个CA认证中心是信任的。
数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案。
PKCS的15个标准
PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准。
PKCS#1:RSA加密标准。PKCS#1定义了RSA公钥函数的基本格式标准,特别是数字签名。它定义了数字签名如何计算,包括待签名数据和签名本身的格式;它也定义了PSA公/私钥的语法。
PKCS#2:涉及了RSA的消息摘要加密,这已被并入PKCS#1中。
PKCS#3:Diffie-Hellman密钥协议标准。PKCS#3描述了一种实现Diffie- Hellman密钥协议的方法。
PKCS#4:最初是规定RSA密钥语法的,现已经被包含进PKCS#1中。
PKCS#5:基于口令的加密标准。PKCS#5描述了使用由口令生成的密钥来加密8位位组串并产生一个加密的8位位组串的方法。PKCS#5可以用于加密私钥,以便于密钥的安全传输(这在PKCS#8中描述)。
PKCS#6:扩展证书语法标准。PKCS#6定义了提供附加实体信息的X.509证书属性扩展的语法(当PKCS#6第一次发布时,X.509还不支持扩展。这些扩展因此被包括在X.509中)。
PKCS#7:密码消息语法标准。PKCS#7为使用密码算法的数据规定了通用语法,比如数字签名和数字信封。PKCS#7提供了许多格式选项,包括未加密或签名的格式化消息、已封装(加密)消息、已签名消息和既经过签名又经过加密的消息。
PKCS#8:私钥信息语法标准。PKCS#8定义了私钥信息语法和加密私钥语法,其中私钥加密使用了PKCS#5标准。
PKCS#9:可选属性类型。PKCS#9定义了PKCS#6扩展证书、PKCS#7数字签名消息、PKCS#8私钥信息和PKCS#10证书签名请求中要用到的可选属性类型。已定义的证书属性包括E-mail地址、无格式姓名、内容类型、消息摘要、签名时间、签名副本(counter signature)、质询口令字和扩展证书属性。
PKCS#10:证书请求语法标准。PKCS#10定义了证书请求的语法。证书请求包含了一个唯一识别名、公钥和可选的一组属性,它们一起被请求证书的实体签名(证书管理协议中的PKIX证书请求消息就是一个PKCS#10)。
PKCS#11:密码令牌接口标准。PKCS#11或“Cryptoki”为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。智能卡就是实现Cryptoki的典型设备。注意:Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。而且Cryptoki只说明了密码接口,并未定义对设备来说可能有用的其他接口,如访问设备的文件系统接口。
PKCS#12:个人信息交换语法标准。PKCS#12定义了个人身份信息(包括私钥、证书、各种秘密和扩展字段)的格式。PKCS#12有助于传输证书及对应的私钥,于是用户可以在不同设备间移动他们的个人身份信息。
PDCS#13:椭圆曲线密码标准。PKCS#13标准当前正在完善之中。它包括椭圆曲线参数的生成和验证、密钥生成和验证、数字签名和公钥加密,还有密钥协定,以及参数、密钥和方案标识的ASN.1语法。
PKCS#14:伪随机数产生标准。PKCS#14标准当前正在完善之中。为什么随机数生成也需要建立自己的标准呢?PKI中用到的许多基本的密码学函数,如密钥生成和Diffie-Hellman共享密钥协商,都需要使用随机数。然而,如果“随机数”不是随机的,而是取自一个可预测的取值集合,那么密码学函数就不再是绝对安全了,因为它的取值被限于一个缩小了的值域中。因此,安全伪随机数的生成对于PKI的安全极为关键。
PKCS#15:密码令牌信息语法标准。PKCS#15通过定义令牌上存储的密码对象的通用格式来增进密码令牌的互操作性。在实现PKCS#15的设备上存储的数据对于使用该设备的所有应用程序来说都是一样的,尽管实际上在内部实现时可能所用的格式不同。PKCS#15的实现扮演了翻译家的角色,它在卡的内部格式与应用程序支持的数据格式间进行转换。
注意 net,ios中rsa加解密使用的是pkcs1
,而java使用的是pkcs8
。
以上参考:PKCS 发布的15 个标准
x509证书
介绍
X.509 是密码学里公钥证书的格式标准。 X.509 证书己应用在包括TLS/SSL(WWW万维网安全浏览的基石)在内的众多 Intenet协议里.同时它也用在很多非在线应用场景里,比如电子签名服务。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。对于一份经由可信的证书签发机构签名或者可以通过其它方式验证的证书,证书的拥有者就可以用证书及相应的私钥来创建安全的通信,对文档进行数字签名.X.509还附带了证书吊销列表和用于从最终对证书进行签名的证书签发机构直到最终可信点为止的证书合法性验证算法。
当前使用的版本是X.509 V3,它加入了扩展字段支持,这极大地增进了证书的灵活性。X.509 V3证书包括一组按预定义顺序排列的强制字段,还有可选扩展字段,即使在强制字段中,X.509证书也允许很大的灵活性,因为它为大多数字段提供了多种编码方案.
x509证书一般会用到三类文件,key,csr,crt。
Key是私用密钥,openssl格式,通常是rsa算法。
csr是证书请求文件,用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。
crt是CA认证后的证书文件(windows下面的csr,其实是crt),签署人用自己的key给你签署的凭证。
编码格式(也用作扩展)
.PEM- PEM扩展名用于不同类型的X.509v3文件,全称Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是ASCII(BASE64)编码.
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和Nginx服务器偏向于使用这种编码格式..DER - DER扩展用于二进制DER编码证书,全称Distinguished Encoding Rules,打开看是二进制格式,不可读,这些文件也可能带有CER或CRT扩展名.
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.
例如:
密钥pem格式:
1 | -----BEGIN RSA PRIVATE KEY----- |
证书pem格式:
1 | -----BEGIN CERTIFICATE----- |
文件扩展名
.key格式:通常用来存放一个公钥或者私钥,默认PKCS#1,并非X.509证书,可能是PEM,也可能是DER
.csr/.p10格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写,PKCS#10标准定义
.crt格式:证书文件,certificate的缩写,CRT扩展名用于证书,只有公钥没有私钥。证书可以编码为二进制DER或ASCII PEM。CER和CRT扩展几乎是同义词
.cert .cer .crt:文件通常包含单个证书,单独且没有任何包装(没有私钥,没有密码保护,只有证书)
.cer格式:证书文件,常见于Windows系统,certificate缩写,只有公钥没有私钥,可能是PEM编码,也可能是DER编码,大多数应该是DER编码,crt文件和cer文件只有在使用相同编码的时候才可以安全地相互替代。
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,用于不同类型的X.509v3文件,有证书开头,结尾的格式
.p7b/.p7r格式: 以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥,PKCS#7标准定义
.p7c/.p7m/.p7s格式:PKCS#7证书格式,仅仅包含证书和CRL列表信息,没有私钥。
.pfx/p12格式:由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。PFX(也称为PKCS#12)支持证书,私钥和证书路径中的所有证书的安全存储。PKCS#12格式是唯一可用于导出证书及其私钥的文件格式。
证书生成
openssl基本命令
公钥负责加密,私钥负责解密
私钥负责签名,公钥负责验证
修改openssl.cnf配置文件
首先需要定位openssl.cnf文件:
1 | locate openssl.cnf |
结果:
1 | /etc/pki/tls/openssl.cnf |
修改配置文件,修改其中的dir变量,重新设置SSL的工作目录
1 | vim /etc/pki/tls/openssl.cnf |
生成私钥
命令:openssl genrsa
查看帮助:openssl genrsa -h
1 | -des 生成的私钥采用DES算法加密 |
生成一个私钥:
默认长度512,PKCS1格式
1 | openssl genrsa -out ca.key 2048 |
查看:
1 | cat ca.key |
生成公钥
命令:openssl rsa
查看帮助:openssl rsa -h
1 | -inform arg 输入文件编码格式,只有pem和der两种 |
使用刚刚生成的私钥,以生成公钥:
1 | openssl rsa -in ca.key -pubout -out ca_pub.key |
1 | ## 为RSA密钥增加口令保护 |
加解密/签名验证
命令:openssl rsautl
注意:无论是使用公钥加密还是私钥加密,RSA每次能够加密的数据长度不能超过RSA密钥长度,并且根据具体的补齐方式不同输入的加密数据最大长度也不一样,而输出长度则总是跟RSA密钥长度相等。
1 | openssl rsautl -h |
加密和解密
1 | ##生成RSA密钥 |
签名与验证
1 | ##使用RSA密钥进行签名,实际上使用私钥进行签名 |
CA证书生成
生成CA私钥(.key)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt)(CA给自已颁发的证书)。
1 | # Generate CA private key |
数字证书主题含义:
1 | DC=domainComponent # 域名 |
用户证书
生成私钥(.key)–>生成证书请求(.csr)–>用CA根证书签名得到证书(.crt)
服务器端证书
1 | openssl genrsa -passout pass:1111 -des3 -out server.key 2048 |
客户端证书
如果需要做双向验证的,也就是服务端要验证客户端证书的情况。那么需要在同一个根证书下再生成一个客户端证书。
需要在客户端设置根证书,并信任根证书。因为服务端的证书是自签的证书,公共的CA是无法认证自签的证书的。所以需要在客户端添加并信任自己的根证书后才能通过https访问服务端。如果服务器上部署的是公共CA签发的证书,则不需要设置,因为系统中已经内置了大部分公共CA的证书
1 | openssl genrsa -passout pass:1111 -des3 -out client.key 2048 |
PKCS#12(.pfx .p12)证书生成
1 | ##将PEM证书文件和私钥转换为PKCS#12(.pfx .p12) |
生成pem格式证书
有时需要用到pem格式的证书,可以用以下方式合并证书文件(crt)和私钥文件(key)来生成
1 | $cat client.crt client.key> client.pem |
tee:定向输出到server.pem
证书转换
可以使用以下命令:
1 | openssl x509 ## 必须为证书文件, .key文件非证书文件 |
依赖命令中参数:
1 | -inform pem|der : 输入文件格式 |
例如:
1 | ## crt转换为pem |
pkcs1与pkcs8格式RSA私钥互相转换
1 | openssl pkcs8 -topk8 -inform PEM -in server.key -outform pem -nocrypt -out pkcs8.pem |
参考:
那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)
http://www.cnblogs.com/yaozhenfa/p/gRpc_with_ssl.html
https://vimsky.com/article/3608.html
https://stackoverflow.com/questions/13732826/convert-pem-to-crt-and-key?answertab=votes