-
加密解密基础;
-
典型的数据加密算法及加密原理;
-
数字证书及PKI
-
通过Openssl实现私有CA
-
自建CA/证书签署脚本
-
无论输入是多大的数据,其输出是定长的;
-
如果输入的数据一样,其结果一定一样;反之,输入数据微小改变,将引起结果的巨大改变,这种现象称之为“雪崩效应”;
-
md5: 无论输入是多长,输出为定长128bits
-
SHA1: 无论输入是多长,输出为定长160bits
-
SHA-256: 无论输入是多长,输出为定长256bits
-
SHA-512: 无论输入是多长,输出为定长512bits
1
2
3
4
5
6
|
[root@rhel5 home]
# openssl passwd -1 -salt 12345678 redhat
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/
[root@rhel5 home]
# openssl passwd -1 -salt 12345678 redhat
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/
#可以看到,两次输入的salt相同,加密后生成的密码是相同的哈
[root@rhel5 home]
# openssl passwd -1 -salt 12345698 redhat
$1$12345698$jX8ffqc5lSEfqT.NXmyP2.
#这里可以看到,两次输入的salt有细微的差别,则生成的密码差别甚大
|
-
不能保证可用性;
-
不能防止中间人攻击 ;
-
能够保证数据机密性;
-
在网上传输的数据有:两个素数q、a及中间结果a^Xm%q、a^Xn%q
-
Xm、Xn是私有的,不在网上传输(由中间结果逆推出Xm、Xn是不可能的)
-
此算法的缺陷--无法防止中间人攻击。
1
2
3
4
5
6
7
8
9
10
11
12
|
OpenSSL:SSL的开源实现
libcrypto:通用加密库,提供了各种加密函数
libssl:TLS
/SSL
协议的实现,基于会话的、实现了身份认证、数据机密性和会话完整性的TLS
/SSL
库
openssl:多用途的命令行工具;能够实现私有证书颁发机构;即在公司内部实现身份的验证;
openssl:openssl命令行工具
genrsa:通过RSA算法,生成密钥(私钥和公钥)
req:申请和生成证书
-new:生成新的证书
-x509:互联网常用的一种标准
-
in
:证书的位置(签署证书及证书请求常常用到)
-out:证书的存放位置
-days:证书的有效期限
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[root@Centos CA]
# rpm -qc openssl
/etc/pki/tls/openssl
.cnf
#配置文件所在位置
[root@Centos CA]
# vim /etc/pki/tls/openssl.cnf
[ 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
# 所颁发证书的序列号
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
# CA私钥的存放位置
RANDFILE = $
dir
/private/
.rand
# private random number file
x509_extensions = usr_cert
# The extentions to add to the cert
|
1
2
3
4
5
6
|
1、生成一个私钥;
# (umask 077; openssl genrsa -out /path/to/private_key 2048)
2、制作一个证书签署请求;
# openssl req -new -key /path/to/private_key -out /paht/to/certificate.csr
3、由CA负责签署证书;
# openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt -days 365
|
1
2
3
4
5
6
7
8
9
10
11
|
# cd /etc/pki/CA/
step1:为CA生成一个私钥:
# (umask 077; openssl genrsa -out private/cakey.pem 2048)
step2:生成自签证书:
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
# touch index.txt
# echo 01 > serial
step3:签署证书:
# openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt -days 365
专用客户端测试工具:
# openssl s_client -connect HOST:PORT -CAfile /path/to/cacertfile|-CApath /paht/to/cacertfiles_dir/ -ssl2|-ssl3|-tls1
|
1
|
yum
install
-y openssl
|
1
2
|
[root@Centos CA]
# cd /etc/pki/CA/
[root@Centos CA]
# (umask 077; openssl genrsa -out private/cakey.pem 2048) #创建私钥,并将权限改为600(一对括弧表示通过子shell执行命令)
|
1
2
3
4
5
6
7
8
|
[root@Centos CA]
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 #生成自签证书(注意:两个.pem文件是在配置文件中指定的,名称不能改)
#说明:
####openssl中有如下后缀名的文件####
.key格式:私有的密钥
.crt格式:证书文件,certificate的缩写
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式
|
1
2
3
4
5
6
7
8
9
10
|
[root@Centos CA]
# cd /etc/pki/CA/
[root@Centos CA]
# mkdir -pv certs crl newcerts #证书存放目录
[root@Centos CA]
# ls
cacert.pem certs crl newcerts private
[root@Centos CA]
# touch index.txt serial crlnumber #相关证书信息文件
[root@Centos CA]
# ls
cacert.pem certs crl crlnumber index.txt newcerts private serial
[root@Centos CA]
# echo 01 > serial #所颁发证书的序列号
[root@Centos CA]
# cat serial
01
|
1
2
3
4
5
6
7
8
9
10
11
|
##1、https是通过mod_ssl实现的,因此检查并安装mod_ssl:
[root@Centos ~]
# ls /etc/httpd/modules/ | grep "mod_ssl" #默认没有安装mod_ssl
[root@Centos ~]
# yum list all mod_ssl #查看mod_ssl的安装包信息
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
mod_ssl.x86_64 1:2.2.15-26.el6.centos
[root@Centos ~]
# yum install -y mod_ssl #安装mod_ssl
##2、检查mod_ssl是安装结果
[root@Centos ~]
# rpm -qc mod_ssl
/etc/httpd/conf
.d
/ssl
.conf
#mod_ssl的配置文件存放位置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
##1、编辑httpd.conf,注释中心主机:
#DocumentRoot "/var/www/html" #注释该行
##2、编辑httpd.conf,新建基于IP的虚拟主机:
<VirtualHost 192.168.1.58:80>
ServerName httpd.webtest.com
DocumentRoot
/website/httpd/
<
/VirtualHost
>
##3、创建站点目录:
[root@Centos ~]
# mkdir -pv /website/httpd/
mkdir
: created directory `
/website/httpd/
'
[root@Centos ~]
# ll -d /website/httpd/
drwxr-xr-x. 2 root root 4096 Jun 12 00:01
/website/httpd/
#成功创建了站点目录了哈
##4、提供默认主页面:
[root@Centos ~]
# vim /website/httpd/index.html
<h2>httpd.webtest.com:192.168.1.58<
/h2
>
##5、重启httpd服务:
[root@Centos ~]
# service httpd restart
|
1
2
3
4
5
6
7
8
9
10
11
|
##1、为Apache服务器端配置密钥
[root@Centos ~]
# mkdir -pv /etc/httpd/ssl
mkdir
: created directory `
/etc/httpd/ssl
'
[root@Centos ~]
# ls /etc/httpd
conf conf.d logs modules run ssl
#已然创建了ssl目录
[root@Centos ~]
# cd /etc/httpd/ssl
[root@Centos ssl]
# (umask 077;openssl genrsa -out httpd.key 1024) #为Apache服务器生成密钥
[root@Centos ssl]
# ls
httpd.key
#密钥生成了哈(该密钥文件名可自定义)
##2、生成证书签署请求文件:
[root@Centos ssl]
# openssl req -new -key httpd.key -out httpd.csr #.csr证书请求文件名可自定义
|
1
2
|
[root@Centos ~]
# cd /etc/httpd/ssl/
[root@Centos ssl]
# openssl ca -in httpd.csr -out httpd.crt -days 3650 #CA签署证书
|
1
2
3
4
5
6
7
8
|
##1、找到<VituralHost>虚拟主机配置段,配置如下:
<VirtualHost 192.168.1.60:443>
DocumentRoot
/website/https
ServerName https.webtest.com
##2、找到Server Certificate服务器认证段,配置如下:
SSLCertificateFile
/etc/httpd/ssl/httpd
.crt
#认证文件改为我们前面创建的
##3、找到Server Private Key服务器私钥存放段,配置如下:
SSLCertificateKeyFile
/etc/httpd/ssl/httpd
.key
#私钥文件改为我们前面创建的
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#!/bin/bash
#########################################################################
# File Name: MakeCA.sh
# Author: 土豆呼叫地瓜
# Email: 229293602@qq.com
# Created Time: 2015年06月15日 星期一
#########################################################################
#设定CA工作目录
dir
=${
dir
:-
/etc/pki/CA
}
certs=${certs:-$
dir
/certs
}
crl_dir=${crl_dir:-$
dir
/crl
}
private_key_dir=${private_key_dir:-$
dir
/private
}
new_certs_dir=${new_certs_dir:-$
dir
/newcerts
}
#自签证书相关的3个文件
database=${database:-$
dir
/index
.txt}
serial=${serial:-$
dir
/serial
}
crlnumber=${crlnumber:-$
dir
/crlnumber
}
#私钥文件(根密钥)
private_key=${private_key:-$private_key_dir
/cakey
.pem}
#自签证书
certificate=${certificate:-$
dir
/cacert
.pem}
#生成CA
makeCA() {
[ ! -d $
dir
] &&
mkdir
-p $
dir
[ ! -d $private_key_dir ] &&
mkdir
-p $private_key_dir
# 创建CA私钥
if
[ ! -f $private_key ];
then
(
umask
077; openssl genrsa -out $private_key 2048)
fi
# 生成自签证书
if
[ ! -f $certificate ];
then
openssl req -new -x509 -key $private_key -out $certificate -days 3650
fi
# 生成三个目录
[ ! -d $certs -a ! -d $crl_dir -a ! -d $new_certs_dir ] &&
mkdir
-p $certs $crl_dir $new_certs_dir
# 生成自签证书相关的3个文件
touch
$database $serial $crlnumber &&
echo
01 > $serial
}
makeCA
echo
"Make CA successfully.The newCA is $new_certs_dir."
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#!/bin/bash
#########################################################################
# File Name: CA_Signed.sh
# Author: 土豆呼叫地瓜
# Email: 229293602@qq.com
# Created Time: 2015年06月15日 星期一
#########################################################################
#Where is the crt saved
read
-p
"Plz input a path to save the certifacate:"
crtDir
#简单判断用户给的目录名称是否合法
if
[[ !
"$crtDir"
=~ ^/.*[[:alnum:]]$ ]];
then
echo
"$crtDir is the invalid path."
echo
"The Path should be such as '/path/to/somedir"
exit
10
fi
#Where is the key saved
cakey=${cakey:-$crtDir
/cakey
.key}
#Where is the csr saved
csr=${csr:-$crtDir
/certreq
.csr}
#Where is the crt saved
crt=${crt:-$crtDir
/cacert
.crt}
#General a private key
if
[ ! -d $crtDir ];
then
mkdir
-p $crtDir
else
if
[ ! -f $cakey ];
then
(
umask
077; openssl genrsa -out $cakey 1024)
fi
fi
#General .csr file
if
[ ! -f $csr ];
then
openssl req -new -key $cakey -out $csr
fi
#Make the certficate
if
[ ! -f $crt ];
then
retval=0
openssl ca -
in
$csr -out $crt -days 3650
[ $retval -nt 0 ] &&
echo
"The certificate is created failure."
&&
rm
-f $crt
echo
"$crt is created successfully. It is placed in $crtDir."
else
find
$crt -size 0 |
xargs
rm
-f
echo
"$crt is bad, try to create it again."
fi
|
1
|
Error:Serial number 01 has already been issued,check the database
/serial_file
for
corruption the matching entry has the fallowing details;
|
1
2
3
|
vim
/etc/pki/tls/openssl
.cnf
[ CA_default ]
dir
=
/etc/pki/CA
|
1
2
|
filed to update database
TXT_DB error number 2
|