OpenSSL 编程 二:搭建 CA
作者:互联网
一、证书
证书 – 为公钥加上数字签名
二、证书标准规范X.509
证书是由认证机构颁发的,使用者需要对证书进行验证,因此如果证书的格式千奇百怪那就不方便了。于是,人们制定了证书的标准规范,其中使用最广泛的是由ITU(International TelecommumcationUnion,国际电信联盟)和ISO(IntemationalOrganizationforStandardization, 国际标准化组织)制定的X.509规范。很多应用程序都支持x.509并将其作为证书生成和交换的标准规范。
X.509是一种非常通用的证书格式。所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用。X.509证书的结构是用ASN1(Abstract Syntax Notation One)进行描述数据结构,并使用ASN.1语法进行编码。
1、证书规范
使用最广泛的标准为 ITU 和 ISO 联合制定的 X.509 的 v3版本规范 (RFC5280), 其中定义了如下证书信息域:
- 版本号(Version Number):规范的版本号,目前为版本3,值为0x2; 序列号(Serial Number):由CA维护的为它所发的每个证书分配的一的列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书,最大不能过20个字节; 序列号(Serial Number):由CA维护的为它所发的每个证书分配的一的列号,用来追踪和撤销证书。只要拥有签发者信息和序列号,就可以唯一标识一个证书,最大不能过20个字节; sha256-with-RSA-Encryption; ccdsa-with-SHA2S6; 颁发者(Issuer):发证书单位的标识信息,如 ” C=CN,ST=Beijing, L=Beijing, O=org.example.com,CN=ca.org。example.com ”; 有效期(Validity): 证书的有效期很,包括起止时间; 主体(Subject): 证书拥有者的标识信息(Distinguished Name),如:" C=CN,ST=Beijing, L=Beijing, CN=person.org.example.com”; 主体的公钥信息(SubJect Public Key Info):所保护的公钥相关的信息: 公钥算法 (Public Key Algorithm)公钥采用的算法; 主体公钥(Subject Unique Identifier):公钥的内容。 颁发者唯一号(Issuer Unique Identifier):代表颁发者的唯一信息,仅2、3版本支持,可选; 主体唯一号(Subject Unique Identifier):代表拥有证书实体的唯一信息,仅2,3版本支持,可选: 扩展(Extensions,可选): 可选的一些扩展。中可能包括: Subject Key Identifier:实体的秘钥标识符,区分实体的多对秘钥; Basic Constraints:一指明是否属于 CA; Authority Key Identifier:证书颁发者的公钥标识符; CRL Distribution Points: 撤销文件的颁发地址; Key Usage:证书的用途或功能信息。
此外,证书的颁发者还需要对证书内容利用自己的私钥添加签名, 以防止别人对证书的内容进行篡改。
2、证书格式
X.509 规范中一般推荐使用PEM(Privacy Enhanced Mail)格式来存储证书相关的文件。证书文件的文件名后缀一般为 .crt 或 .cer 。对应私钥文件的文件名后缀一般为 .key。证书请求文件的文件名后綴为 .csr 。有时候也统一用pem作为文件名后缀。
PEM格式采用文本方式进行存储。一般包括首尾标记和内容块,内容块采用 Base64 进行编码。
编码格式总结:
- X.509 DER(Distinguished Encoding Rules)编码,后缀为:.der .cer .crt。 X.509 BASE64 编码(PEM格式),后缀为:.pem .cer .crt。
3、CA
证书是用来证明某某东西确实是某某东西的东西。通俗地说,证书就好比上文里面的公章。通过公章,可以证明对应的证件的真实性。
CA是Certificate Authority的缩写,也叫“证书授权中心”。它是负责管理和签发证书的第三方机构, 好比一个可信任的中介公司。一般来说,CA必须是所有行业和所有公众都信任的、认可的。因此它必须具有足够的权威性。就好比A、B两公司都必须信任C公司,才会找 C 公司作为公章的中介。
4、CA证书
CA 证书,顾名思义,就是CA颁发的证书。
5、证书信任链
证书直接是可以有信任关系的, 通过一个证书可以证明另一个证书也是真实可信的. 实际上,证书之间的信任关系,是可以嵌套的。比如,C 信任 A1,A1 信任 A2,A2 信任 A3…这个叫做证书的信任链。只要你信任链上的头一个证书,那后续的证书,都是可以信任滴。
处于最顶上的树根位置的那个证书,就是“根证书”。除了根证书,其它证书都要依靠上一级的证书,来证明自己。那谁来证明“根证书”可靠捏?实际上,根证书自己证明自己是可靠滴(或者换句话说,根证书是不需要被证明滴)。
根证书是整个证书体系安全的根本。所以,如果某个证书体系中,根证书出了问题(不再可信了),那么所有被根证书所信任的其它证书,也就不再可信了。
三、公钥基础设施(PKI)
仅制定证书的规范还不足以支持公钥的实际运用,我们还需要很多其他的规范,例如证书应该由谁来颁发,如何颁发,私钥泄露时应该如何作废证书,计算机之间的数据交换应采用怎样的格式等。这一节我们将介绍能够使公钥的运用更加有效的公钥基础设施。
1、公钥基础设施
公钥基础设施(Public-Key infrastructure)是为了能够更有效地运用公钥而制定的一系列规范和规格的总称。公钥基础设施一般根据其英语缩写而简称为PKI。
PKI只是一个总称,而并非指某一个单独的规范或规格。例如,RSA公司所制定的PKCS(Public-Key Cryptography Standards,公钥密码标准)系列规范也是PKI的一种,而互联网规格RFC(Requestfor Comments)中也有很多与PKI相关的文档。此外,X.509这样的规范也是PKI的一种。在开发PKI程序时所使用的由各个公司编写的API(Application Programming Interface, 应用程序编程接口)和规格设计书也可以算是PKI的相关规格。
2、PKI的组成要素
PKI 的组成要素主要有以下三个:
- 用户 — 使用PKI的人 认证机构 — 颁发证书的人 仓库 — 保存证书的数据库
1、用户
用户包括两种:一种是希望使用PKI注册自己的公钥的人,另一种是希望使用已注册的公钥的人。我们来具体看一下这两种用户所要进行的操作。
注册公钥的用户所进行的操作:
- 生成密钥对(也可以由认证机构生成) 在认证机构注册公钥 向认证机构申请证书 根据需要申请作废已注册的公钥 解密接收到的密文 对消息进行数字签名
使用已注册公钥的用户所进行的操作:
- 将消息加密后发送给接收者 验证数字签名
2、认证机构(CA)
认证机构(Certification Authority,CA)是对证书进行管理的人。认证机构具体所进行的操作如下:
- 生成密钥对 (也可以由用户生成) 在注册公钥时对本人身份进行认证, 生成并颁发证书 作废证书
3、仓库
仓库(repository)是一个保存证书的数据库,PKI用户在需要的时候可以从中获取证书.它的作用有点像打电话时用的电话本。仓库也叫作证书目录。
3、各种各样的PKI
公钥基础设施(PKI)这个名字总会引起一些误解,比如说“面向公众的权威认证机构只有一个",或者“全世界的公钥最终都是由一个根CA来认证的",其实这些都是不正确的。认证机构只要对公钥进行数字签名就可以了,因此任何人都可以成为认证机构,实际上世界上已经有无数个认证机构了。
国家、地方政府、医院、图书馆等公共组织和团体可以成立认证机构来实现PKI,公司也可以出于业务需要在内部实现PKI,甚至你和你的朋友也可以以实验为目的来构建PKI。
四、openssl生成CA证书
openssl中有如下后缀名的文件:
- .key格式:私有的密钥; .csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写; .crt格式:证书文件,certificate的缩写; .crl格式:证书吊销列表,Certificate Revocation List的缩写; .pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式; .p12 "或者 “.pfx” : 用于实现存储许多加密对象在一个单独的文件中。通常用它来打包一个私钥及有关的 X.509 证书,或者打包信任链的全部项目。
1、CA根证书的生成步骤
生成CA私钥(.key)–>生成CA证书请求(.csr)–>自签名得到根证书(.crt)(CA给自已颁发的证书)。
1、制作 ca.key 私钥
openssl genrsa -aes256 -out ca.key 2048
说明:
- genrsa:生成RSA密钥; -aes256:密钥加密模式; -out ca.key:指定输出文件名; 2048:密钥长度;
onlylove@ubuntu:~/my/openssl/ca$ ls -al total 8 drwxrwxr-x 2 onlylove onlylove 4096 Jun 19 17:55 . drwxrwxr-x 3 onlylove onlylove 4096 Jun 19 17:49 .. onlylove@ubuntu:~/my/openssl/ca$ openssl genrsa -aes256 -out ca.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ..............+++++ .......................+++++ e is 65537 (0x010001) # 输入密钥加密密码(需要记住此密码,使用时需要) Enter pass phrase for ca.key: Verifying - Enter pass phrase for ca.key: onlylove@ubuntu:~/my/openssl/ca$ ls -al total 12 drwxrwxr-x 2 onlylove onlylove 4096 Jun 19 18:05 . drwxrwxr-x 3 onlylove onlylove 4096 Jun 19 17:49 .. -rw------- 1 onlylove onlylove 1766 Jun 19 18:06 ca.key onlylove@ubuntu:~/my/openssl/ca$
onlylove@ubuntu:~/my/openssl/ca$ cat ca.key -----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,406EDBD323422C282952DF2CC600F9D6 iFmy7svke6O9sqRkAm2lzMb8IuIRHXwLNSfg4oJErG3/hIqMfOqI/nFQWltaIJtI cQFfn4+MoxINJnN2Ob8r4t1BwY7MipapTVBrSuwFl6TeG+ZYYAltOG6Ph7T2kjLA FhtWtcWOktA093D4gyn71gyo0wabQm5U/QxAxj3Z8q+5SahtzSLvrJCHaymVpuQ9 P2jdOL4QhijvgCqlfE+bxSZrq4J5Xdgbrib9Z5GdrOVGkf8TavaC9yjPH1/mxjmU t2+mURSHv2zSHbpY3OaZ1PEt3tkkCKHT5vOwFltMxEuyagfjVbyOkQGqrb0mymn3 /bLBkXaPbA10ZF+LfgBRjDsiVDCVWBPHOty9NaglmjELXBvFhUCYvtmLVcYYkd98 hS4cA8thtUMOrM0uCgWD3Z5ELXqQpyXQ/UcG4iYTedEx8TE0zVs3qnuC3U3VvZXU dj1knbKcWF2/eohg8z/Hf6VEZ5eJ0WK7lcjEWfJsSL4piT0gRxcgTuBEl7g/vruc jWQg0tVcAn+UBjP6ZCLJf6SUDntbOBn5e9eZbHP3/zVHwth+UPBtxdFr5HQVVYpH MBC5PNW7N90749k0MPOMQ/NI3BkJeOOLmOxIK5FGSCj03BIQgRnB2H2JezakLcc8 k0Yg5SOFQNvtk2HNMit/LOIg8ZFECaetEqS7bhGTvbAbFvlH1CwCCHaJYh9861Ib 3HqJtWgLrXptOlGsJCW7dgcO4U0PqRhuL/lI4YcMJyyKMvOPyI3Z5So+MqOrdFdL 1tUSvS55toXEaZleut4OXq6aFn9aCdIJ1tLz3whyNPc/SJvlmocRhdCITVQTYr/A i4NrdpPRVRmZ/MwsbZ16QqSzkgdTjGcPEq+nWfqmd7qINRfWaDquEBDkM9wUf5Rb Y9DPCgtF6IbZLu2lXlK8Gdk0rVlBT0EHR/srflUnUinCs3Y6wTBeVsnctQTIXVlf DDVYRqLVhvfCzmy1K+OFFAsCZofwiyO09C0ZqNp1KNDmMxNjn1o9SJtfudDv6k/m nTB1yDINwUHvw90QrLYiLaMi8OjrWO8l62z2lvWNfbPoRwL7sVEu4W7BXANb/u99 /GSl8IdVpFFZ6LqgnfeYgsIapHZi8F6RCTj4i6gYA9qBDB6/6vcjlyEuW/JiFxMZ 0mGxw9ciJTdtcgNKknzJbKxizl3102b0rZ/A6wHZaCafsacu2XWjWR7vH9uTRbPF bSP6bO+lF2DDnWkDwa2SQxvd0Ked+qREoErY6VdoSrZ+CJo5Qstnfyuw3WtPVeAn blSEjuNK7Bygc/1mP+4g40nsse+aKgDRrD+U6ioaV83c1AM229Ri3sXPiWR9cOaz +lYIb4WX7wxXz3Yb/FFZUz+mM01dNqmHSxo38ihxG0W4V3Qs38gfjZIRsCG0XhlM I86xxbnIU/VYY/NJJZ4p90Uwq+yRYqgmpQeHt6JBI/0IZaxKqxDHdy05K/k8F5cp zyeMFIR0/73dMzQI131x/GGQVMCFUBgWKK22wubK3Kbu8X8W93ZDcptevOmP8Bzg aShWWBH5l8joPScyjDhfZ3KyqnC56Wwzxw0dMcrS8b9I8enp4IZHHHF0SBphrWow -----END RSA PRIVATE KEY----- onlylove@ubuntu:~/my/openssl/ca$
2、请求证书