码迷,mamicode.com
首页 > 其他好文 > 详细

加密解密以及私有CA的实现

时间:2015-04-23 00:21:21      阅读:451      评论:0      收藏:0      [点我收藏+]

标签:linux ssl openssl 证书 ca 私有ca

一、加密和解密

   什么是加密:加密之前为明文,加密后是密文,将明文转换为密文的过程就是加密。


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 []:cadmin@magedu.com # 邮件

    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 []:webadmin@magedu.com
 
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              = webadmin@magedu.com
        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


加密解密以及私有CA的实现

标签:linux ssl openssl 证书 ca 私有ca

原文地址:http://10042224.blog.51cto.com/10032224/1637286

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!