加密解密以及私有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 []:[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
时间: 2024-10-12 21:26:47

加密解密以及私有CA的实现的相关文章

openssl加密解密与创建CA

前言 目前网络上比较流行的服务类协议如http,ftp,smtp,pop3等本身是不具备加密解密功能的都明文传输的,在早期网络设计的初期由于服务器的数量非常少,当然网络的安全也是不会被重视的.但随着互联网的不断发展,安全方面也成为人们比较关心的问题之一,后来网警公司先为http研发了一种可被调用的公共功能的库,这个库就被放在了TCP/IP模型的传输层与应用层之间,是一个半层的库,任何不具备加解密的程序在研发时可调用这个库也可以不用调这个库,用与不用都可以实现传输功能,这个库就叫做SSL;正如我们

openssl 加密 解密 应用及CA的实现

一 现在的加密/解密技术主要有三种:对称加密,公钥加密,和单向加密 对称加密:指的是加密方和解密方使用的是同一个密钥 特性: 1 加密.解密使用同一个秘钥: 2 将原始数据分割成固定大小的块,逐个进行加密 算法:DES  3DES  AES 公钥加密:秘钥是成对出现 公钥:公开给所有人: pubkey 私钥:自己留存,必须保证去私密性:secret key 特点:用公钥加密的数据只能用与之配对的私钥解密,反之亦然: 特性: 数字签名:用于接收方确认发送方的身份 秘钥交换:发送方用对方的公钥加密一

使用加密解密技术和CA认证解决网络传输中的安全隐患

服务端:xuegod63.cn   IP:192.168.1.63 客户端:xuegod64.cn   IP:192.168.1.64   网络安全: 网络传输中的安全隐患-.   中间人攻击 全隐患:        解决方法 1.窃听-- >  加密 2.篡改 ->  哈西算法:MD5,sha1 (检查数据完整性) 3.伪装(钩鱼网站,伪装WIFI)  ->  身份认证(用户名/密码.数字证书) 4.网络中断 (内网冒冲网关,DDOS )  –>绑定静态arp地址: 加大服务器和

linux加密解密基础、PKI及SSL、创建私有CA

1.加密解密基础:          数据在网络中传输过程中要保证三个要点: (1)数据的完整性:防止数据在传输过程中遭到未授权用户的破坏或篡改.          (2)数据的机密性:防止文件数据泄漏给未授权用户从而让其利用          (3)数据的可用性:保证授权用户能按需访问存取文件数据 2.常见的加密技术: 对称加密  公钥加密  单向加密          (1)对称加密:加密解密使用同一个密钥,将原始数据分割成固定大小的块,逐个进行加密 加密算法:               

加密和解密技术基础、PKI及创建私有CA

一.数据加密和解密概述 数据加密和解密是一门历史悠久的技术,从古代就已经出现了,一直发展到当代.其中,数据加密的目的有很多,可以是为了保证本地数据存取的安全性,可以是为了保证数据流在网络传输过程中的保密性,也可以是为了验证数据的完整性,还可以通过数据加密来实现密钥的交换等. 数据加密依赖于某种加密算法和加密密钥,而数据解密则依赖于某种解密算法和解密密钥.而在当代加密解密技术中,加密密钥既可以与解密密钥相同,也可以和解密密钥不同,这取决于使用什么方法进行加解密. 二.安全的目标 就信息传输过程来说

加密/解密&利用OpenSSL构建私有CA

在互联网安全及个人隐私状况日益严峻的今天,加密技术变得尤为重要并且不可或缺.在密码雪中,加密是指将明文信息隐匿起来,使之在缺少特殊信息时不可读.本文所讲的主要是在互联网传输数据时所用的加密方式.我们都知道OSI&TCP/IP网络参考模型,通常我们会把这两个模型分为通信子网和资源子网两部分,但是在构建网络的初期,信息从发送端送达到接受端都非常困难所以在设计模型之初并没有考虑过多的安全因素,以至于通信子网和资源子网都没有涉及到数据加密的内容.为了解决这个问题,网景公司在资源子网和通信子网之间添加了半

linux网络数据传输的加密,解密以及基于openssl的私有CA的建立

网络数据传输的安全性是计算机通信领域的重要课题,数据加密就是保证数据安全性的主要方法.所谓数据加密,即是通过某种算法和秘钥对数据明文进行处理,从而得到密文的过程.计算机网络通信过程中的加密形式主要有以下几种: 1,对称加密,用同一个密钥对信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密.对称加密算法的优点是算法公开.计算量小.加密速度快.加密效率高,但秘钥有时会很多,难以管理.而且秘钥交换又是一个难以解决的问题. 常见算法: DES:Data Encryption Standard,

加密解密基础、PKI及SSL、创建私有CA

基本概念: 加密作为数据安全保障的一种方式,它不是近代才产生的,历史已经相当久远:加密算法就是加密的方法. 数据加密解密: 数据加密的基本过程就是对原来为明文的文件或数据按特定算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取.阅读的目的.该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程 为什么需要对数据加密:加密在网络上的作用就是防止有用或私有化信息在网络上被拦截和窃取:比如个

加密、解密   以及OpenSSL建立私有CA

加密.解密,以及OpenSSL建立私有CA 加密技术是互联网最常用的安全保密手段,其利用技术手段把重要的数据加密后传送,到达目的地后再用相同或不同的手段进行解密. 加密技术包括两个元素:算法和密钥 常用的加密技术:对称加密.非对称加密.单向加密 以上几种加密技术各有千秋,经常组合起来使用 1.对称加密 加密和解密使用同一个密钥,将明文分隔成固定大小的块,逐个进行加密: 常见算法:DES  3DES  Twofish  IDEA  IDEA  CAST5  RC6 Blowfish 2.非对称加密