一、加密和解密
什么是加密:加密之前为明文,加密后是密文,将明文转换为密文的过程就是加密。
1. 对称加密
提供算法本身,加密和解密使用的是同一个密钥,用以保证数据的机密性。但安全性依赖于密钥,而非算法。
对称加密的优点是运算特别快;缺点是安全几乎全部依赖于密钥(算法基本上是公开的),当通信对象很多的时候,很难对密钥进行有效管理。
- 常见算法:
DES(Data Encrption Standard):早期的算法,公开可以使用的,56bit密码长度,惨遭淘汰。
3DES:DES后DES再DES
AES:128bit密码长度
AES192:
AES256:
AES512:
Blowfish:
Twofish:
IDEA:
RC6:
CAST5:
- 特性:
1、加密、解密使用同一秘钥
2、将明文分割成固定大小的块,逐个进行加密
2. 单向加密
提取数据特征码,用以保证数据的完整性。每个用户密码加密之前会加点字符进去。如:QWERTY会加点123QWERTY。验证时,会加同样的随机数在算一遍进行验证。通常用来验证数据完整性。
- 优点:
输入输出相同:输入一样,输出必然一样
雪崩效应:输入的微小改变,将会引起结果的巨大改变,防止暴力破解
定长输出:无论原始数据多大,特征码大小都相同
不可逆:无法根据特征码还原原来的数据
无论是数据还是特征码不一样,一律不接收
- 缺点:
无法防范中间人将明文提取出来自己修改后加入特征码发给目标(无法验证身份)
- 杜绝缺点:
1、将特征码加密:
2、密钥交换(IKE:Internet Key Exchange):协商生成密码,让其他人看不懂。密钥交换依赖于互联网Diffie-Hellman协议。
- 算法:
MD4:
MD5(message digest):128bit输出长度
SHA1(secure hash algorithm):160bit输出长度。还有SHA192, SHA256, SHA384,SHA512(centos6和7使用的就是512)
CRC-32:校验码机制,不属于算法
3. 非对称加密(公钥加密)
用于加密/签名
- 密钥对:公钥是从私钥之中提取出来的
公钥:public key,公开的
私钥:secret key,私人的
发送方用自己的私钥加密数据,别人可以用他的公钥解密,就可以实现验证身份
发送方用对方的公钥加密数据,可以保证数据机密性
公钥加密算法很少用来加密数据,因为速度太慢。公钥加密比对称加密慢了3个数量级(1000倍)
公钥加密通常用来验证身份
- 算法:
RSA:加密和签名(认证),部分公开,同时也是公司名
DSA:签名,公开使用,通常只做身份验证
ElGamal:商业算法
- 特性:
1、密钥长度较大,例如最短的512bits,2048,4096
2、加密解密分别使用密钥对相对进行
3、常用于数据签名和密钥交换
4. Diffie-Hellman算法:
A发给B两个数:
p,g(大素数,生成数)
此时:
A知道x但不知道y
B知道y但不知道x
然后:
A将g^x%p的结果发给B
B将g^y%p的结果发给A
此时网上的其他人可以看到4个数:
g,p, g^x%p, g^y%p
最后:
A可以通过(g^y%p)^x=g^yx%p算出y
B可以通过(g^x%p)^y=g^xy%p算出x
通过这种方式不需要再记密码了,但无法验证双方的身份
5. 一次加密通信过程
发送者:
1、使用单向加密算法提取生成数据的特征码
2、使用自己的私钥加密特征码附加在数据后面
3、生成用于对称加密的临时密钥
4、用此临时密钥加密数据和已经使用私钥加密后的特征码
5、使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方
接收方:
1、使用自己的私钥解密加密的临时密钥;从而获得对称密钥
2、使用对称密钥解密对称加密的 数据和私钥加密的特征码密文;从而获得数据和特征码密文
3、使用发送方的公钥解密特征码密文,从而获得从计算生成的特征码
4、使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的进行比较
二、证书和openssl命令
1. ssl
由于tcp/ip协议是明文传输的,无法保证数据的机密性。于是网景公司在应用层和传输层之间增加了半层ssl(安全套接字层)。正因为只有半层,所以ssl是个可选层。协议如果不经过该层,不会有任何变化;但如果经过该层,就会对数据传输进行加密,并且协议也会产生根本性的变化。如http-->https. 但ssl只是提供了加密的功能,我们必须通过软件将其得以实现。
两个用户通信间需要验证证书、证书的吊销列表、对方的数据、特征码等等,这些通过手动完成的话就会很麻烦,如何能够自动完成呢?
1.2 ssl通信的建立
ssl基本上是在TCP中完成的,ssl建立通信步骤会更多。三次握手后,就要建立ssl回话:客户端会向服务器端请求证书,可能在三次握手时,请求已经发过去了。服务器端将证书发给客户端;客户端需要进行验证:根据本地存的根证书,查看证书是由哪个CA所颁发。查看本地是否存在此证书,如果有,说明信任此证书。然后验证此证书的签名,能解密得到特征码就表示证书确实是CA所颁发。比较特征码,如果没问题,就证明证书没有被篡改。接着查看证书中的主机名是否与当前访问的主机名相同、证书的有效期、证书是否在吊销列表中等等信息,都没问题的话,提取证书中的公钥,验证通过。接着双发开始协商通过哪种单项加密算法、哪种公钥加密算法和对称加密算法。而后客户端生成一个临时对称加密密钥,并使用对方的公钥加密后,发给服务器端。服务器端把用户请求的页面数据通过客户端对称密钥加密后,发给客户端。客户端解密后显示。
1.3 协议的版本
ssl协议目前有三个版本:sslv1,sslv2,sslv3,v1和v2已不再安全,主流版本是v3
国际标准化组织基于ssl研发了另一种协议:TLS(transport layer security),TLS只有v1版,但相当与sslv3
2. 证书和CA
想要安全的获取对方的公钥,就需要依赖数字证书。数字证书是由CA机构(签证机构)所颁发,并且由用户或CA放入目录服务器中,供其他用户检索的、数字格式的用户私有信息。数字证书的主要功能是让通信的双方都能安全可靠的,获得自己的身份认证标识,并且能够被通信的对方所认可。CA的功用是保证公钥信息的安全分发。
- x.509 v3版的数字证书的格式、包含的内容(x.509:数字证书标准规范):
1、版本号(version)
2、序列号(serial number):CA用于惟一标识此证书
3、签名算法标志(Signature algorithm identifier):让用户验证此证书是可靠的
4、发行者的名称:即CA自己的名称
5、有效期:两个日期,起始日期和终止日期
6、证书主体名称:证书拥有者自己的名字
7、证书主体公钥信息:证书拥有者自己的公钥
8、发行商的唯一标识:v2版本新增
9、证书主体的唯一标识:v2版本新增
10、扩展信息:v3版本新增
11、签名:CA对此证书的数字签名。让收到此证书的用户验证,证书就是他所认可的机构所颁发。
所有的证书颁发机构,必须获得根证书机构的许可。所有获得许可的证书颁发机构就能够实现:证书的交叉信任。
- 证书的验证过程
A和B通信时,会将彼此的证书发给对方。双方便开始验证对方的证书:CA每颁发一个证书,会将该证书的特征码提取出来,并用CA自己的私钥将特征码加密后,附加在证书的后面,这就是CA的签名。如果用该CA的公钥可以解密此签名,那就证明证书就是该CA所颁发。然后再提取该证书的特征码与解密得到的特征码作比较,如果一样就证明该证书没有被篡改。那如何安全获得CA公钥呢?没有太好的办法,不过微软将很多CA证书做进了windows,可以在本地进行认证。
对个人来讲,有没有证书影响并不是很大。但对于一些网站来讲,就必须要有了。对于允许任何人访问的站点来讲,无需验证身份;但如果是对访问者有限制的站点,要想访问就必须向站点提供自己的证书。但这个证书可以是对方提供,仅对此站点生效的。比如U盾之类的。这就是私有CA
证书通常有两类用途:用户证书和主机证书。用户就是个人,主机通常是一个组织的域名
- 证书撤销:
证书中保存了公钥信息,但是如果用户的私钥泄露了,就要申请吊销证书。就像自己的有效证件丢失后,申请作废是一样的。所谓的撤销证书,就是CA维护的一个列表,将需要吊销的证书的信息放入其中。
PKI(Public Key Infrastructure):公钥基础设施。一个PKI由以下四部分组成:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库:证书丢了,在此再要一份
CA只是PKI的一部分。A如果想获得证书,只需向RA申请,CA颁发,A只需在证书存取库中拿就行了。如果A将自己的私钥给丢了,将要向CA提出吊销证书,CA通过后就会将A的证书信息放在吊销列表中。
- 证书撤销列表中的格式:
1、证书撤销列表的算法
2、CA的名称
3、本次更新日期
4、下次更新日期
5、用户证书序列号以及吊销日期:这是一个撤销的证书,此后是所有撤销的证书
...
$、证书撤销列表的签名:最后一条
3. openssl
ssl只是协议,要想协议的功能得以实现:各种加密以及密钥交换。就需要一个工具来提供,至少需要提供加密解密需要用到的库。openssl就是这样一个工具。
- openssl的组成部分:
libcrypto:加密、解密库文件,用以协议调用
libssl:ssl协议实现,谁要用ssl协议,就来直接调用
openssl:多用途命令行工具,每种功能都使用专用的子命令来实现
- linux上另一款用于加密解密的工具
gpg:GNU Privarcy Guard,是pgp规范的实现,linux上另一款用于加密解密的工具。pgp规范实现的项目也叫做pgp,是一款商业软件。由于早期pgp设置的实在太过出色,导致越来越多的人使用它来实现加密解密的功能。后来几乎成为了一种通用的功能,于是pgp软件虽然还是商业的,但pgp规范得以公开。因此,GNU组织基于这种规范制作出了gpg这款软件。
3.1 openssl命令
1. openssl命令分类:
1、标准命令
2、消息摘要命令,说白了就是单项加密算法
3、加密、解密相关的命令
2. 对称加密:
工具:openssl enc,gpg 可以man enc查看enc的帮助信息
算法:des, 3des, aes, blowfish, twofish, idea, cast5
- 加密:
# openssl enc -e -CIPHERNAME -a -salt -in /PATH/FROM/SOMEFILE -out /PATH/TO/SOMECIPHERFILE
- 解密:
# openssl enc -d -CIPHERNAME -a -salt -in /PATH/FROM/SOMECIPHERFILE -out /PATH/TO/SOMEFILE
- 开始加密:
[root tmp]# openssl enc -e -des3 -a -salt -in fstab -out fstab.des3 enter des-ede3-cbc encryption password: Verifying - enter des-ede3-cbc encryption password: # -e:加密 # -a -salt:指明使用ascii输出内容
- 查看加密后的文件:
[root tmp]# cat fstab.des3 U2FsdGVkX1/cJFqk626mXtKh0LE1qfMIjVpLiCbFutbgzt55uo/jaL9cOt3Vn5nh 330w2+uQOGNdvy98LSwPf6W3p06EyhO3Rb19Bm6tOsO6Acuc1D4cdr0JQ7k13H+e JHvOuyJlS+ZEsX7DwQ1w5QqaFkm7VVo4erj8HAM5E7FVRnX6h+m9FWGYAtu2J9ah syjfzxgAkJqLzdG9gyLCW2n6d4ONDo7j4rcfJlVqWKhDW0NZ4sqVRWRmLIBU6pU6 9MnT0Fjeqc4nz54Yac9a8Cm4LaQs64Gd0UauufJwrAYDPVoKYvwz1GjA7GhCs4PO VLPNscVAxsUaNynkpeDBiBYJZNXfM/McsDLgDANHteSK/0kznvpDA+kcDnOA1HKT JPU4Iq31bQhrHne+JlIFY4guxRULmWc+ndgyP9VZyL35P6TwoDcgYBhTiT4OxFX9 c3nGMqx5Wel3OTsjd62OerRa9AeBo76bijQGwyQ7TZWbeLvgBhhD68JMkCYsaGE6 KU9P9kBrQf6/DTmp8Svjf8R6K+eVJGNJPbXLBVHCx0BnnXzLlRMRIJZ5JKYVJjOw cdJe8lEjFQyfRCrWsvCk5fyKzN72mTGECgQF0VeXWy7V/JJ7IJH9whpz3VFs/i6c OX2coKusAdTJ9ruiBnJR5n5NB/vLX35BqSXsX2VZ3kmwk5QTmfuYnaqfR4mGSDbx asViHF2C7fUED+FUCTHr7c7k1ObABOejZCcVXtj2E9TjQXqx4GY+eTfuQlNlBrM0 j2h1wtUjs0oPN/lrDUbZ86AG6OISLp39KG4aITGA5jzs5OBWzKrtPp/BPRicvtVd kKiKzwJIM+wN/8Gj/dhmwLwOO0z6rWeLiZGJD9ExIgEDKIOgF/nh9XwDYIAqiP4t yH+zCd90v/E7xqB1pxcifM0VmaYx6S6uRx7qpPk2BwPJTXtJxRhbZQGZBxHQqNF8 UkPS74kKb1vf9HrF9DDzvFvZSl6GHaEdn0wHVwxmnLHTMluDYg4QV4Z09hlG/hLZ 2lW0ze0C3pUzzcZOhx6glCQ6C3Dvhdj3SytoNI1zpqupiGIwCoJM/djPrkSe6/bb MZWZ2k77NKemYVct08ZalGN54vDCDLB8OYk6SViDF68Y3IXwCCWYrkFzeykJycRU PFjHm3suFyKk9nKkDvhWRfHV/4vAZ8nB6a7rieznrnPzZe+EmOZjmhkSee3CBQf6 Cxepyhk6OCRUTiMv4d0+T0WlSk7E3CuBwkfE3OA2gt8=
- 开始解密:
[root tmp]# openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab enter des-ede3-cbc decryption password: # -d:解密
3. 单项加密(获取特征码):
工具:openssl dgst, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum
算法:md5,sha1
MAC:消息认证码。单项加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性
MAC常用的机制:CBC-MAC和HMAC. HMAC:使用md5或sha1算法
- 用法:
# openssl dgst -CIPHER /PATH/TO/SOMEFILE...
- 获取特征码:
[root tmp]# openssl dgst -md5 fstab MD5(fstab)= 748821c966629952c46900d67320c12b
- 文件只要一样,使用md5获得的特征码必然一样:
[root tmp]# md5sum fstab 748821c966629952c46900d67320c12b fstab
- 单项加密生成用户密码:
# openssl passwd -1 -salt 8bits随机数
- 生成密码:
[root tmp]# openssl passwd -1 -salt 12345678 Password: $1$12345678$f8QoJuo0DpBRfQSD0vglc1 # -salt:添加的杂质,避免密码相同产生的结果相同
- salt一样密码一样,结果必然一样:
[root tmp]# openssl passwd -1 -salt 12345678 Password: $1$12345678$f8QoJuo0DpBRfQSD0vglc1
- 生成随机数:
# openssl rand -hex|-base64 NUM
- 生成16进制字符随机数:
[root tmp]# openssl rand -hex 4 36f29ca0 # 16进制字符取值范围只有0-F # 4:位数
- 生成base64编码格式的字符随机数:
[root tmp]# openssl rand -base64 4 UlES4g== # base64数字、字母、特殊符号都有
- 使用随机数作为salt生成密码:
[root tmp]# openssl passwd -1 -salt $(openssl rand -hex 4) Password: $1$6f5da565$LJVvPuNKop67L8vP3gn9.1
4. 公钥加密:
工具:gpg, openssl rsautl
公钥加密不会用来加密数据,通常用于身份验证和密钥交换。实现密钥交换的算法:公钥加密、DH
- 实现数字签名的算法:RSA, DSA, ELGamal
DSA:Digital Signature Algorithm,数字签名算法。它还有另一种称呼:DSS(Digital Signature Standard)
- 生成密钥对:操作过程是生成私钥,从私钥中提取公钥。由于DSA只能实现签名,所以限制了它的使用范围。一般使用的生成公钥的算法是RSA
# openssl genrsa -out /PATH/TO/PRIVATE_KEYFILE NUM_BITS
- 生成不加密的私钥:
[root tmp]# openssl genrsa -out testkey 2048 Generating RSA private key, 2048 bit long modulus ........+++ ......................................+++ e is 65537 (0x10001)
- 查看私钥文件:
[root tmp]# cat testkey -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAuJA+7h3mkiQO/eVXNog8vUiz7rBPt1mAiMkpDjU7pxm9uGhc UYcymmuq4H9VB0XpOaMiPJR3Qp1nFOfuRC7vOOE2jMk7hFpEpv6QXavaX/vU5LzJ mI/JYthGOW4Gr3lRJgOH1biD6MJjLG12funlQi1tpfM6Q4bl9RidjhniYtlLb0rm 39XcWWw2BnTSkqnO6EyLZegduh1O85sYfUD4MPun1x3ufgoRXeqXSp4k0VfKsR71 1UDe9XM0Hje8/V2/c4HTFRD742wpxpF6oDMZLYaJqTWabrC3z7GtLtUk+U0RnsFQ CI8Ymr35ZuCvT5WhEJIDjlfxtzXF1L7uo8U5UQIDAQABAoIBAHdF+PVHa4eMOAgK 22bJen9U6btaQ9oYxEEhxx+AdXGS6BGxl9+0QJac+AwnHdsaahOugmSmCcCKGmDf VhLIRh77JJatQYJSF8XYA5IVioW3KKk9/AZU/e+cFx3sJfPmsfOgGnuax9x3K0I9 53MzUs6GrzKs0j1rg1b2tnNr9Oqtqs4Dh1p/ZyrSRZbyGFnIBEXqNpGoMpF+bgJs c7twaK+LfnmFVcmi8/PEYEwry2Gb6geqidpvnLMfJHmfBrCiJphNtlr6vNs922c7 nL6mdNBxM0lUNfZ8h61/t0tfwEaV/1pg8eM0z0QGCavSJ4DSJgzZtz5JMntWTI U+g+bAECgYEA7YD8euUGdp7NfORUjVLCHReD1Sg0lfi1HPKlMq43UcmyNN8MQ3g6 HwgBW8w8aeQ0OCsgiAAHouhaGmgOmSmVv94RHv4+nhrMsobNatgjH+Soe8gq67d/ CJOwdoPA7w2BOXFgHWzCqsdwHDR7hHZUGzZ9LNFrZMlXWLTpltir3MECgYEAxu/P M8vpr8i4EjDSbbAKCetv4s6z4rOywBpw603FQaezjZILzyNs8PWK6iT0KldKID5p hvpYft4zQdR1W8CgnIfkjyphh6Ei53tMI+I6QHVfW8IoXvkiyj8uhh2lGQ6OYQJJ fu/ThwQlKKgOM5yhDrzVL1kOCVj5e+A3pT5JMJECgYBqavI2SqqDuhIO1OxByoQp ruCmQPaXADJ+vwZgWAl3fy13XT3MeXFpeBfLvw6Oz+7KACD6bzD8wKmmzVtFK4nq x6DaR0ddZlqz34zpQ+ExKC6KEB2TMswb1rkp0U1Aj8eIKpHLfXEYPnawXJ+/sZlr /BVIYKmDJmgZ2i4UJg+TwQKBgB8EQMAIqPS5TMm5RvXHHqmRRa6NH8rWzaXZ+YUW aQzlgr8t6B1xnoirH++Ft3PqjCoe0QE0gxu0tTUsVOfrTp9ZKK+Rogctfm2s8aAe o5pxQmLiEL1OBriVxUEv2g/gDx7c5myeI9LHOKvwF9bAMvRDSNHLBr86WhuQR9zB q1OhAoGBAOAhYJlrKgaSfxDqVw/yS5RlZQnnUFyh7hm0D4Q6UhaeYUGDatKPS0zV FQLwRLV2H3ON6G2eAFE6OWAUO+vHwegp9awEcSb19h30DtVWaSV9Gcq8hkC0Gbyz 8pvPUG/OStajVUnxjvpoSxEVYYHK4arJTCc5xoLL9v3/1Foyngni -----END RSA PRIVATE KEY-----
- 事实上私钥文件只能属主可读:
[root tmp]# (umask 077;openssl genrsa -out testkey 2048) Generating RSA private key, 2048 bit long modulus ...+++ ..+++ e is 65537 (0x10001) # 创建的文件的权限就是600了
注意:在bash命令行上放在小括号中执行的命令,其实是通过打开一个子shell进程进行的。命令执行完毕后,子shell进程也随之终止。
- 提取公钥:一般而言进程在使用公钥的时候会自动从私钥文件中提取,而不用手动进行。
# openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE -pubout
- 提取开始:
[root tmp]# openssl rsa -in testkey -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt7Pieel0Pgl5+8urop2T JQNc3ecS2fxdyppRJ6bJRADKboCc6CV1tjT8TDKqd5JWAMYn+j+zXyxoLQjSW3xa 30xx4H8xckXM+CwX8yJLTH1paTYa5bsZybifMfXsB/RZT2awHsch6MC5HGN6f8BV WEvu0t6DrLKe9ZD4wdBSSx/RCB238nBraaugxNmAONT1OfedGaf3XRSaA53qlXQv JlyJCH156kyWzwo+N4DWXSMlBELp+5gkS/DcvpJn+i27KuDWjZRjm8ti40Onppy6 fHn59DToVtn+IdUEpGAdY53rCYWwpbA++9qhIn/9vaCY3nbZqDGN0C1jg5ATIGif pQIDAQAB -----END PUBLIC KEY----- # 还可以使用-text输出文本格式的信息
三、openssl实现私有CA
获得证书的方法:向RA注册申请以及建立私有CA. 建立私有CA的工具有两个OpenSSL和OpenCA. 主要是因为openssl建立私有CA的功能十分有限,导致了openCA的出现。
1. 配置文件
/etc/pki/tls/openssl.cnf 此文件中定义了openca的工作目录
查看配置文件:
[root CA]# vim /etc/pki/tls/openssl.cnf ... [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = /etc/pki/CA # CA工作目录 certs = $dir/certs # 以颁发证书的存放位置 crl_dir = $dir/crl # 吊销列表位置 database = $dir/index.txt # 索引文件位置,证书的信息 #unique_subject = no # Set to ‘no‘ to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # 刚刚签署的证书存放的位置 certificate = $dir/cacert.pem # CA自己证书的位置 serial = $dir/serial # 从此文件中获取接下来一个证书的序列号,每签署一个证书,里面的数字就会加1 crlnumber = $dir/crlnumber # 吊销证书的编号 # must be commented out to leave a V1 CRL crl = $dir/crl.pem # 所有吊销证书的信息 private_key = $dir/private/cakey.pem # 证书私钥文件 RANDFILE = $dir/private/.rand # 随机数获取位置 x509_extensions = usr_cert # 用户证书 default_days = 365 # 证书默认有效期 default_crl_days= 30 # 每个证书吊销列表被单独存放多长时间
2. 工作目录:/etc/pki/CA/
查看工作目录:
[root CA]# ll /etc/pki/CA total 16 drwxr-xr-x. 2 root root 4096 Oct 15 2014 certs # 证书文件存放位置 drwxr-xr-x. 2 root root 4096 Oct 15 2014 crl # 证书吊销列表的存放位置 drwxr-xr-x. 2 root root 4096 Oct 15 2014 newcerts # 新创建证书的存放位置 drwx------. 2 root root 4096 Oct 15 2014 private # 私钥存放位置
3. 构建私有CA只需两步:
1、生成私钥
2、生成自签署证书
为什么要给自己发证呢?因为证书里面存放了CA的公钥,它需要客户端将其导入到受信任的证书颁发机构里面去,才能使用CA的公钥验证此后CA颁发的证书。CA会用自己的生成的私钥,给每个证书做签名。
3.1 创建私钥
[root CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ................................................................................................................+++ .............+++ e is 65537 (0x10001)
3.2 生成自签证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days # req:创建证书签署请求,而不是生成证书。作为客户端来讲,如果要用到证书时,需要先生成一个私钥。从私钥中提取公钥,并构建出一个证书签署请求,然后让CA签署即可。req用在此处的目的是自请自签。 # -new:生成新的证书签署请求 # -x509:直接输出自签署的证书文件,通常只有构建CA时才这么用。如果不加表示证书签署请求 # -key:私钥文件路径,用于提取公钥 # -out:输出文件保存位置 # -day N:证书有效天数
开始创建:
[root CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.‘, the field will be left blank. ----- Country Name (2 letter code) [XX]:CN # 国家名 State or Province Name (full name) []:HA # 省/州 Locality Name (eg, city) [Default City]:ZZ # 市 Organization Name (eg, company) [Default Company Ltd]:MageEdu # 公司 Organizational Unit Name (eg, section) []:Ops # 部门 Common Name (eg, your name or your server‘s hostname) []:ca.magedu.com # 这个名字至关重要,通过这个名字和其他人通信,证书中的名字和通信时的名字必须保持一致。否则证书验证无法通过。 Email Address []:[email protected] # 邮件
CA创建完成,但创建的目的是为了给客户端发证书的。所以此时的客户端就能向该机申请证书了。
3.3 提供必要的辅助文件
# touch /etc/pki/CA/index.txt # echo 01 > /etc/pki/CA/serial
四、给用户发证书
1. 用户要发出申请,需在证书申请的主机上进行3个步骤
1、生成私钥,该私钥用于加密解密以及密钥交换之类用的。
[root ssl]# (umask 077;openssl genrsa -out http.key 1024) # 生成密钥文件 Generating RSA private key, 1024 bit long modulus ...++++++ .++++++ e is 65537 (0x10001)
2、生成证书签署请求
[root ssl]# openssl req -new -key http.key -out http.csr # 生成签署请求文件 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.‘, the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:HA Locality Name (eg, city) [Default City]:ZZ Organization Name (eg, company) [Default Company Ltd]:MageEdu Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server‘s hostname) []:www.magedu.com Email Address []:[email protected] Please enter the following ‘extra‘ attributes to be sent with your certificate request A challenge password []: # 为请求加个密码,有密码的好处是,就算别人获得了此请求也看不到里面的信息。公司内部使用就不需要加密了。 An optional company name []: # 生成请求不能加-x509 # http.csr:证书签署请求,固定为csr后缀 # 生成请求时,由于在同一个公司使用。所以输入的信息必须和自签证书保持一致。但是主机名不能相同。
3、把请求文件发给CA
2. CA签发证书,在服务器端也要进行三个步骤
1、验证请求者信息
2、签署证书
# openssl ca -in /PATH/FROM/CSR_FILE -out /PATH/TO/CRT_FILE -days N
[root ssl]# openssl ca -in /etc/httpd/ssl/http.csr -out /etc/httpd/ssl/http.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Apr 21 13:47:09 2015 GMT Not After : Apr 18 13:47:09 2025 GMT Subject: countryName = CN stateOrProvinceName = HA organizationName = MageEdu organizationalUnitName = Ops commonName = www.magedu.com emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 16:4F:6C:A6:EF:48:9F:AE:27:16:37:E8:91:F5:41:F8:CC:7E:94:87 X509v3 Authority Key Identifier: keyid:0B:D4:79:D2:27:84:7F:16:9E:39:96:6B:9F:7C:7B:C2:85:3D:F3:49 Certificate is to be certified until Apr 18 13:47:09 2025 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated # 提示index.txt更新了
3、把签署好的证书发给请求者
五、吊销证书
1. 获取吊销证书的序列号
# openssl x509 -in /PATH/FROM/CRT_FILE -noout -serial -subject # -noout:不输出证书本身的信息 # -serial:仅输出序列号 # -subject:输出主题
2. 实现证书吊销
1、确认输出的主题和index.txt中的内容保持一致
2、吊销证书:
# openssl ca -revoke /PATH/FROM/CRT_FILE
3、生成吊销证书的编号:
# echo 01 > /etc/pkie/CA/crlnumber
4、更新证书吊销列表:
# openssl crl -gencrl -out THISCA.crl