早期在网络上传输的数据都是明文的,像http,ftp,telnet等协议,这样非常的不安全,只需要简单的抓包分析一下,你的账号和口令就一览无余。所以脑细胞发达的大神们自然不能坐视不管,于是乎各种加密算法就此诞生了。其实加密的历史非常久远了,很久很久以前,江湖人士为了防止隔墙有耳就发明了“行话”或者称之为“暗语”,这样即使咱们听到他们说什么,却也不知道人家在说什么,这对于我们来说就是密文,只有内部知情人士知晓密码懂得解密方法才能听懂。哈哈,所以要说加密恐怕咱们中华上下五千的文明才是鼻祖。加密应用于各个领域,在这个信息化的时代,加密尤显重要,得信息者得天下。
简单说下加密方式:
1、对称加密,加密与解密过程是可逆的,流行的算法主要有DES(Data Encryption Standard,早期由IBM公司研发),3DES, AES(Advanced Encryption Standard)等;
2、非对称加密,也叫密钥加密,通信的双方各自持有自己的私钥并且自己的私钥只有自己有 ,然后对外公开自己的公钥,用自己的公钥加密的数据则只有自己的私钥可以解密,这样就可以保证数据的机密性;同理用自己的私钥加密也只能用自己的公钥加密,这样可以用来做身份验证,用来确认收到的数据确实是我们所期望的人发来的。常用的非对称加密算法有RSA, DSA等。但是非对称加密由于算法比较复杂,通常加密速度要比对称加密慢3个数量级1000倍,差距还是非常大的,所以通常两种结合起来使用比较多,例如可以用非对称加密用户账号口令或对称加密的密钥,之后的数据传输则用对称加密,由于这个密钥是非对称加密传输的,很难被获取到,所以这个数据传输就相对要安全的很,而且传输的过程中还可以定期更换密钥,这样即使密钥被破解出来,对方也会发现是徒劳无功的。
3、单向加密, 这个应用的也非常广泛,最常见的要数我们平常从站点下载各种ISO镜像文件了,官方都会提供光盘的镜像文件的MD5或SHA值供我们校验文件有没有被别人篡改过。这个值也称之为数据的指纹,单向加密对所有的数据加密后结果都是一个定长的字串输出,而且原文只要有一点的变化,输出的结果就会发生很大的变化,面目全非,这称为单向加密的雪崩效应。常用的单向加密算法有MD5,SHA等。
那么数字证书又是什么呢?举个例子来说,我们知道银行等金融类的等等涉及到交易的都是加密数据传输的,以保证交易的安全。比如你要登陆工商银行的网银,打开网银登陆页面后你就会看见地址栏http变成了https,而且有了一个锁头的标志,点开锁头就能够看到工行的证书信息,如下图所示,我们可以看到是由VeriSign这个证书颁发机构把证书发给了mybank.icbc.com.cn这个站点,而像VeriSign这类的全球知名的证书颁发机构CA证书我们系统一般都会事先安装好了的,这样我们就首先先认可了VeriSign这个CA证书颁发机构,然后我们继而信任由这个机构颁发给工商银行的证书(因为CA颁发给工行的证书上有用CA自己私钥加密的数字签名,而我们本地已经有的CA证书含有CA的公钥如果能解密就可以确定确实是此CA颁发的),由此来确认我们访问的网站确实为真实的工商银行网站而不是一个冒牌的钓鱼网站。我们首次登陆网站时系统会提示我们安装工行的证书,安装完证书后我们即可以获得工行网站的公钥,之后我们的所有数据就都是加密传输的了(浏览器发给服务器的数据用工行的公钥加密,工行网银用自己的私钥解密;服务器返回给浏览器的数据用自己的私钥加密,浏览器则用服务器的公钥解密)。
数字证书一般包含以下内容:
协议(一般常见的x509, 其中包含协议的版本号以及这个证书的一个序列号,这个序列号在CA中的唯一存在的)
签名算法标志
发行者名称
有效期
证书主体名称
证书主体公钥信息
发行商唯一的标识
证书主体唯一标识
证书授权中心的数字签名
扩展信息等
数字证书由申请者向证书颁发机构申请,通过审核后颁发,通常遵循PKI (Public Key Infranstructure)标准,一个标准的PKI通常包含:
端实体(即申请者)
注册机构 RC
签证机构 CA
证书撤消列表发布机构 CRL(Certificate Revoke List)
证书存取库
可是通过著名的CA机构签发证书费用一般都是比较高的,如果我们只是内部使用而我们又可以自己确定信任我们自己的主机的,这样就比较不经济,所以这种场景下我们就可以通过Openssl提供的功能自建一个内部使用的CA服务器。
openssl 的配置文件为 /etc/pki/tls/openssl.cnf, 下面这段是CA的配置项
[
CA_default
]
dir
=
/
etc
/
pki
/
CA #
Where
everything
is
kept certs
=
$dir
/
certs #
Where
the issued certs are kept crl_dir
=
$dir
/
crl #
Where
the issued crl are kept
database
=
$dir
/
index
.txt #
database
index
file
. #unique_subject
=
no #
Set
to
'
no
'
to
allow creation
of
# several ctificates
with
same subject. new_certs_dir
=
$dir
/
newcerts #
default
place
for
new certs. certificate
=
$dir
/
cacert.pem # The CA certificate serial
=
$dir
/
serial # The
current
serial
number
crlnumber
=
$dir
/
crlnumber # the
current
crl
number
# must be commented out
to
leave a V1 CRL crl
=
$dir
/
crl.pem # The
current
CRL private_key
=
$dir
/
private
/
cakey.pem# The private
key
RANDFILE
=
$dir
/
private
/
.
rand
# private random
number
file
x509_extensions
=
usr_cert # The extentions
to
add
to
the cert
要创建CA服务器就要首先为CA自己颁发一个证书, 就要首先为CA自己生成私钥, 步骤如下
1> 生成CA私钥, umask 077保证私钥除属主外其他人没有任何权限
[root@localhost CA]
#
cd /etc/pki/CA/
[root@localhost CA]
#
(umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key,
2048
bit long modulus ..........................
+++
....................
+++
e
is
65537
(
0x10001
) [root@localhost CA]
#
ls private/
cakey.pem
2> 为CA自签证书, 并创建index.txt 和 serial 文件, 至此其实CA创建就已经完成了,下面就可以接受请求为其他主机颁发证书了.
[root@localhost CA]
#
ls private/
cakey.pem [root@localhost 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) [CN]: State
or
Province Name (full name) []:SHA Locality Name (eg, city) [Default City]:SHA Organization Name (eg, company) [Default Company Ltd]:BOB LINUX Organizational Unit Name (eg, section) []:TECH Common Name (eg, your name
or
your server
'
s hostname) []:BOB.ORG
Email Address []:[email protected] [root@localhost CA]
#
touch index.txt
[root@localhost CA]
#
echo 01 > serial
3> 生成证书申请
[root@localhost
~
]
#
(umask 077;openssl genrsa -out www.pri 2048)
Generating RSA private key,
2048
bit long modulus .....
+++
...................................................................................................................................................
+++
e
is
65537
(
0x10001
) [root@localhost
~
]
#
openssl req -new -key www.pri -out www.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) [CN]: State
or
Province Name (full name) []:SHA Locality Name (eg, city) [Default City]:PUDONG Organization Name (eg, company) [Default Company Ltd]:BOB LINUX Organizational Unit Name (eg, section) []:SYSTEM Common Name (eg, your name
or
your server
'
s hostname) []:www.linux.org
Email Address []: Please enter the following
'
extra
'
attributes to be sent with your certificate request A challenge password []: An optional company name []: [root@localhost
~
]
#
4> 为新主机申请颁发证书,我们可以看到serial的序号已经自动加1变成02了,新颁发的证书在 newcerts目录下也有了
[root@localhost
~
]
#
openssl ca -in www.csr -out www.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: Mar
3
03
:
16
:
53
2014
GMT Not After : Feb
29
03
:
16
:
53
2024
GMT Subject: countryName
=
CN stateOrProvinceName
=
SHA organizationName
=
BOB LINUX organizationalUnitName
=
SYSTEM commonName
=
www.linux.org X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 6F:4B:
01
:ED:
07
:
00
:A6:
75
:
28
:
44
:D6:C1:
46
:
22
:
49
:9D:
29
:8B:
46
:A2 X509v3 Authority Key Identifier: keyid:D5:BA:
32
:A8:5B:5A:2F:E9:AF:
60
:
43
:
95
:AB:CD:
52
:F2:
89
:BE:
31
:CB Certificate
is
to be certified until Feb
29
03
:
16
:
53
2024
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 [root@localhost
~
]
#
cd /etc/pki/CA
[root@localhost CA]
#
ls
cacert.pem crl index.txt.attr newcerts requests serial.old certs index.txt index.txt.old private serial [root@localhost CA]
#
cat serial
02
[root@localhost CA]
#
cat index.txt
V 240229031653Z
01
unknown
/
C
=
CN
/
ST
=
SHA
/
O
=
BOB LINUX
/
OU
=
SYSTEM
/
CN
=
www.linux.org [root@localhost CA]
#
ls newcerts/
01
.pem
注意: 此方法创建CA时, 证书申请的国家,省份及组织名必须与CA的信息保持一致.
完成此过程的脚本:
#
!/bin/bash
#
To create a self-authorized CA server
dir
=/
etc
/
pki
/
CA database
=
$dir
/
index.txt certificate
=
$dir
/
cacert.pem serial
=
$dir
/
serial private_key
=
$dir
/
private
/
cakey.pem echo
"
Generating CA private key...
"
(umask
077
;openssl genrsa
-
out $private_key
2048
&>
/
dev
/
null) echo
"
Issue certificate for CA self...
"
read
-
p
"
pls provide your suggestion for the cert expiry days:
"
days openssl req
-
new
-
x509
-
key $private_key
-
out $certificate
-
days $days echo
01
>
$serial touch $database echo
"
CA created
"