一、前言
什么是openssl?讲openssl之前我们先了解一下什么是ssl?ssl是secure socket layer的简称,其使用对称加密,非对称加密(公钥加密解密),单向加密解密结合证书实现数据传输安全,openssl默认是在系统安装时就已经安装上去的。随着互联网的迅速发展,网络通信已经成为传递信息的主要途径。而通信时的数据传输大部分都是明文传输的,在网络不安全的环境下,如果没有一套数据加密机制,就会导致敏感信息和重要数据泄漏,从而引起不可估计的损失。而Openssl正好弥补了这一缺陷,那什么是OpenSSL呢?OpenSSL是一套强大的具有加密功能的组件,它包含三个主要的组件:libcrypto(公共加密库)、libssl(SSL协议的实现)和Openssl(多功能命令工具),因其开源思想,现已广泛应用与数据通信加密领域。Openssl还可以在局域网内构建私有CA,实现局域网内的证书认证和授权,保证数据传输的安全性。具体怎么实现,请看之后的演示。
在电子商务没有出现之前,我们基本上通过面对面的钱权交易,不存在加密解密问题;随着电子商务的兴起,我们现在很多的交易都是在互联网上完成的,银行转账,网上购物等等。早期的各种传输软件都没有考虑到安全的问题,都是以明文进行传输,信息被别人窃取,篡改等等;因此有很多群体靠网络发家!!犯罪!!但是网络交易确实给我们的生活带来了极大的方便,怎么解决这个问题呢;美国NIST,为了保证计算机的安全,提出了几个要求:
1、保密性:数据保密性和隐私性;确保信息不被别人获取,个人存储的信息不能被别人收集到;
2、完整性:包括数据完整性和系统完整性;数据完整性确保数据和程序只能以特定权限的进行授权和改变,只能授权之后才能改变或者被改变;确保系统以一种正常的方式执行预定的功能,不会因别人的介入改变方向;
3、可用性,工作迅速,可正常使用的情况并获取到信息;
二、基本概念
加密:我们将文字转换成不能直接阅读的形式(即密文)的过程称为加密。数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文",使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。
解密:我们将密文转换成能够直接阅读的文字(即明文)的过程称为解密。
大多数计算机加密系统都属于以下两种类型之一:"对称式"和"非对称式"。
对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。
常用的对称加密:DES、3DES、AES、DH
因为对称式的加密方法如果是在网络上传输加密文件就很难把密钥告诉对方,不管用什么方法都有可能被别窃听到。且通信方如果比较多,秘钥过多,不便于管理,密钥传输和交换难以实现;因此产生了公钥加密(也叫非对称加密):
非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",它们两个必需配对使用,否则不能打开加密文件。这里的"公钥"是指可以对外公布的,"私钥"则不能,只能由持有人一个人知道。"公钥"是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。
常用加密算法:RSA, DSA, EIGamal ;RSA:身份认证和加密;DSA:身份认证
单向加密 又称数据完整性校验加密方式,可以利用算法计算数据指纹信息,此种方式得出的数据指纹信息具有定长和雪崩效应(数据中的微小变化将会导致数据指纹信息的巨大变化)的特性,常用来实现数据完整性的验证。
常用加密算法:md5,sha1,sha256,sha384,sha512,sha224
公钥私钥的原则:
1. 一个公钥对应一个私钥。
2. 密钥对中,让大家都知道的是公钥,只有自己知道的是私钥。
3. 如果用其中一个密钥加密数据,则只有对应的那个密钥才可以解密。
4. 如果用其中一个密钥可以进行解密数据,则该数据必然是对应的那个密钥进行的加密。
三、加密传输原理
加密的各种算法只是对文件进行了加密,可是如何让其能在网络上进行安全的传输,而不被窃听,篡改呢?
用电子邮件的方式说明一下原理。
使用公钥与私钥的目的就是实现安全的电子邮件,必须实现如下目的:
1. 我发送给你的内容必须加密,在邮件的传输过程中不能被别人看到。
2. 必须保证是我发送的邮件,不是别人冒充我的。
要达到这样的目标必须发送邮件的两人都有公钥和私钥。
公钥,就是给大家用的,你可以通过电子邮件发布,可以通过网站让别人下载,公钥其实是用来加密/验章用的。私钥,就是自己的,必须非常小心保存,最好加上 密码,私钥是用来解密/签章,首先就Key的所有权来说,私钥只有个人拥有。公钥与私钥的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能 用公钥解密。
随着计算机网络技术的迅速发展和信息化建设的大力推广,越来越多的传统办公和业务处理模式开始走向电子化和网络化,从而极大地提高了效率、节约了成本。与传统的面对面的手工处理方式相比,基于网络的电子化业务处理系统必须解决以下问题:
1如何在网络上识别用户的真实身份;
2如何保证网络上传送的业务数据不被篡改;
3如何保证网络上传送的业务数据的机密性;
4如何使网络上的用户行为不可否认;———-如我们网上购物,东西到了,我们不承认,商家将遭受损失;
例如: 假设用户甲要寄信给用户乙,他们互相知道对方的公钥。甲就用乙的公钥加密邮件寄出,乙收到后就可以用自己的私钥解密出甲的原文。由于别人不知道乙的私钥,所以即使是甲本人也无法解密那封信,这就解决了信件保密的问题。另一方面,由于每个人都知道乙的公钥,他们都可以给乙发信,那么乙怎么确信是不是甲的来信呢?那就要用到基于加密技术的数字签名了。
基于公开密钥算法的数字签名技术和加密技术,为解决上述问题提供了理论依据和技术可行性;同时,《中华人民共和国电子签名法》的颁布和实施为数字签名的使用提供了法律依据,使得数字签名与传统的手工签字和盖章具有了同等的法律效力。
PKI(Public Key Infrastructure)是使用公开密钥密码技术来提供和实施安全服务的基础设施,其中CA(Certificate Authority)系统是PKI体系的核心,主要实现数字证书的发放和密钥管理等功能。数字证书由权威公正的CA中心签发,是网络用户的身份证明。使用数字证书,结合数字签名、数字信封等密码技术,可以实现对网上用户的身份认证,保障网上信息传送的真实性、完整性、保密性和不可否认性。
数字证书目前已广泛应用于安全电子邮件、网上商城、网上办公、网上签约、网上银行、网上证券、网上税务等行业和业务领域。
数字证书是一种数字标识,如同我们的身份证一样,是网络上的身份证明,它是由证书授权机构(CA)签名颁发的数字文件,该签名使得第三者不能伪造和篡改证书。
数字证书: 数字证书为实现双方安全通信提供了电子认证。在因特网、公司内部网或外部网中,使用数字证书实现身份识别和电子信息加密。数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。
ITU-T的X..509国际标准定义了数字证书的格式,目前X .509v3数字证书的主要内容如图:
注册授权服务器(RA) :负责定期从数据库中提取已审核通过的证书申请/更新/作废信息,按既定格式打包提交到CA服务器,并接收和记录返回的结果。
证书签发服务器(CA):负责密钥对(公私钥对)的产生,可采用软件方式或硬件方式(加密机);接收RA服务器的请求,签发/更新/作废用户证书;定期签发CRL(证书撤销列表)。
,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。
CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。
如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。
使用数字证书能做什么?
数字证书在用户公钥后附加了用户信息及CA的签名。公钥是密钥对的一部分,另一部分是私钥。公钥公之于众,谁都可以使用。私钥只有自己知道。由公钥加密的信息只能由与之相对应的私钥解密。为确保只有某个人才能阅读自己的信件,发送者要用收件人的公钥加密信件;收件人便可用自己的私钥解密信件。同样,为证实发件人的身份,发送者要用自己的私钥对信件进行签名;收件人可使用发送者的公钥对签名进行验证,以确认发送者的身份。如此我们便可以安全的在网上进行各种交易,接下来我们实践操作一下此过程的实现。
四、Openssl 基本使用方法
1、OpenSSL 是一个强大的安全套接字层密码库, 在应用层和传输层之间加了一个半层,基于套接字传输时专用的;所以不是对所有的数据进行加密;Appache使用它加密HTTPS,http(80/tcp)->ssl—>https(443/tcp):两个完全不同的协议;OpenSSH使用它加密SSH,它不止是一个库,而且还是一个多用途、跨平台的密码加密工具。整个软件包有三部份构成:
密码算法库(7种分组加密算法、RC4的流加密算法)
SSL 协议库(SSLv2,v3、TLSv2,v3)
应用程序(密码生成、证书管理、格式转换、数据加密签名)
2、openssl基本用法
#查看是否安装;
[root@zabbix ~]# rpm -ql openssl
/etc/pki/CA #所有CA服务器相关内容的默认存储位置(此路径在主配置文件中定义)
/etc/pki/CA/certs #证书存放位置
/etc/pki/CA/crl #已吊销证书存放路径
/etc/pki/CA/newcerts #新证书存放路径
/etc/pki/CA/private #根证书私钥存放路径
/etc/pki/tls
/etc/pki/tls/certs
/etc/pki/tls/certs/Makefile
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/certs/renew-dummy-cert
/etc/pki/tls/misc
/etc/pki/tls/misc/CA
/etc/pki/tls/misc/c_hash
/etc/pki/tls/misc/c_info
/etc/pki/tls/misc/c_issuer
/etc/pki/tls/misc/c_name
/etc/pki/tls/openssl.cnf #主配置文件
/etc/pki/tls/private
/usr/bin/openssl #二进制运行程序
/usr/lib64/.libcrypto.so.1.0.1e.hmac #公共加密库
/usr/lib64/.libcrypto.so.10.hmac #公共加密库
/usr/lib64/.libssl.so.1.0.1e.hmac #ssl协议实现共享库
/usr/lib64/.libssl.so.10.hmac #ssl协议实现共享库
/usr/lib64/libcrypto.so.1.0.1e #公共加密库
/usr/lib64/libcrypto.so.10 #公共加密库
/usr/lib64/libssl.so.1.0.1e #ssl协议实现共享库
/usr/lib64/libssl.so.10 #ssl协议实现共享库
/usr/lib64/openssl
/usr/lib64/openssl/engines
#可以显示帮助信息
[root@localhost ~]# openssl ?
openssl:Error: '?' is an invalid command.
Standard commands
asn1parse ca #CA证书相关子命令 ciphers cms
crl #吊销证书相关操作 crl2pkcs7 dgst #提取特征码命令 dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa #生成私钥
nseq ocsp passwd#用户密码加密 pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand #生成随机数 req #证书申请相关操作
rsa #提取公钥 rsautl s_client s_server
s_time sess_id smime speed #测试算法的加密性能
spkac ts verify version #查看openssl版本
x509 #指定证书类型
Message Digest commands (see the `dgst' command for more details)
md2 md4 md5 rmd160
sha sha1
##通过openssl dgst来调用上面的算法,完成单向加密,图区数据指纹信息
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 seed seed-cbc seed-cfb
seed-ecb seed-ofb zlib
<code class="bash comments">#通过openssl enc字母令指定上面的加密算法来执行加密解密操作</code>
#查看openssl的版本
[root@zabbix ~]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013
#对称加密
openssl enc -ciphername [-in filename] [-out filename] [-pass arg]
[-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key]
[-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize
number] [-nopad] [-debug] [-none] [-engine id]
-e:指定为加密,可以不写默认为加密
-des3:指定加密算法
-salt:默认设置,生成一段字符串放在密码最前面进行加密,提高加密难度。 (加点盐)
-a:基于base64处理数据。加密结果进行base64编码处理
-in:读取那个文件进行加密
-out:输出到那里
-d:指定为解密
例如:
<span style="color:#FF0000;">openssl enc -e -des3 -a -salt -in /etc/fstab -out /tmp/fstab.her</span>
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@localhost ~]# cat /tmp/fstab.her
U2FsdGVkX1/kxq8A9Ioq7aUHHB0DyZpZbVn94GcBWTJkI9FFdMTuPsdX84GombFd
2n/L8TFPeY/HT4eDsAinpkIg3KEzD5SSlq+06FDyD+4LAyD5iZEjQUyc7yDsnBPs
emgD4dmXBmrM8kvmqf/jWCqIgd2FfcG9CPrVpOfUcRASU4svTrjXlSmKp1oBGREN
Di7Wc2apvJRUIHclMraq5Xsx03aUiBj9LKKs45hjCUgmFP58u4YWsf6FhSarL1QA
nKxGWyYha0HuCKZLhCQJUyLhkrif7LffYfAcqVRIXx/B03eK+SX+QXVsSUHTRHjv
YPzfCvy8q6k2FgMnggQPnZB5SsbBiW/fR4iFhIHTdbOOOsQrbtpLq3naWp0wJHm2
pgzzH9/fEW+GVeq9LrAiVOOeoAPUS2W0QojLiwMfmOppRpb6AT3+lbEJaMAnXzE2
5d7xLiozmwaP6lt6XziCZj5go+T61QoQFnfawhkMdp8ygjrsUn6TABj5r1MzNsBB
meUf+sQwGH8uaZ5j3F8tYOjdCbij1NNNBaWARTVPlBH4zeHRM2mN9zlvxYdWBtri
q+KbCwabS7401GLjIZEgL1mVdspActtfugpLwJiAHMuYj7vkU5lCi0xDXHcRas9F
pguG40yRRaNhFo5H6BBp+Ph/cuXT76nLCSFGp1owGInGnS0g+rz0Zhx5j2fAutrw
pZsVHJTmxBqm0coXn/1al2j2GFLaMGaBTHfOH+TKBGj6Pvfjyzzb+qDn0U9T85y+
q2mO4xN+bjnG5foEOKPthGvmn4OtrzwVDO6djNGcWOG0nZV8Xtj6tKrPYmRfkshv
0YdRX9naw/rWl/QyDsvUgqhcNpRmggsGGDvRjbEw6DTVynodq6y3AAP+XcG68asE
j7oCt3ZTrqnnwFPpq56zsvQY12cumsQndEzysXI+5Qt9Vz+FYOb/gm4UQbDOqDg0
oyXsLP8EVTElJCECcX/d1XbTRPgJSZpbmyo0329TFiP2JcOyw4LyZgai96UdzR5h
FBiKDJa9i7FP7Zu/fvip5OgVNlJmAc36kHVBuJfSeoN5RAhljD/9ZjNJBeWm0NX5
nfBwuevo488Za0e2OkTcsXC2h03c+55RD1p+5Nr1z+rlxv7SlfBkeYPIO3/4xI3p
i32eVE2Em9gCEhpdc9+fzg==
<code class="bash comments">##对fstab.her进行解密</code>
[root@zabbix tmp]# <span style="color:#FF0000;">openssl enc -d -des3 -a -salt -in fstab.her -out fstab</span>
enter des-ede3-cbc decryption password: #输入加密时的密码
##单项加密:openssl dgst 用于实现在网络通信中保证所传输的数据的完整性
openssl <span style="color:#FF0000;">dgst </span>[-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c]
[-d] [-hex] [-binary] [-out filename] [-sign filename] [-keyform
arg] [-passin arg] [-verify filename] [-prverify filename]
[-signature filename] [-hmac key] [file...]
-md5:用md5的方式进行加密
-sha1:用sha1方式加密
-out:加密后密码保存到哪里
<pre name="code" class="plain">例如:md5sum fstab 或者 openssl dgst -md5 fstab 提取的特征码相同
[root@zabbix tmp]# <span style="color:#FF0000;">md5sum </span>fstab
e784c8bb3dde9df0e8248941def7ac7f fstab
[root@zabbix tmp]# openssl <span style="color:#FF0000;">dgst </span>-md5 fstab
MD5(fstab)= e784c8bb3dde9df0e8248941def7
生成用户密码:openssl
passwd
-1 [-salt string] password
-1:md5加密
-salt:加点盐
生成随机数:openssl <span style="color:#FF0000;">rand </span>-base64 4 或 openssl rand -hex4 生成8位随机数
[root@zabbix tmp]# openssl passwd -1 -salt 12345678
Password:
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/
[root@zabbix tmp]# openssl passwd -1 -salt 12345678 123
$1$12345678$tRy4cXc3kmcfRZVj4iFXr/ #指定salt是12345678对123加密
[root@zabbix tmp]# openssl passwd -1 -salt 12345678 1234
$1$12345678$g4kuC1.5wVcZ0Y5XnhARm1 #指定salt是12345678对1234加密
[root@zabbix tmp]# openssl passwd -1 -salt `openssl rand -hex 4`
Password:
$1$c3e4a371$h2oSsBHRWUrNEimT06ZIA0
[root@zabbix tmp]# openssl <span style="color:#FF0000;"><span style="background-color: rgb(255, 255, 255);">rand </span></span>-hex 4 #生成8位随机salt
9ce23611
生成密钥对:genrsa命令
openssl genrsa -out /path/to/privatekey.FILE num.BITS
(umask 077;openssl genrsa -out key.pri 2048)
提取公钥:openssl rsa -in /path/to/privatekey.FILE -pubout
#自签证书
[root@zabbix tmp]
# cp cakey.pem /etc/pki/CA/private/
[root@zabbix private]
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
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) []:Beijing
#省份或洲
Locality Name (eg, city) [Default City]:Beijing
#城市
Organization Name (eg, company) [Default Company Ltd]:hzcf
#公司
Organizational Unit Name (eg, section) []:linux
#部门
Common Name (eg, your name or your server's
hostname
) []:ca.hzcf.com
#主机(必须与证书所有者能解析到的名字保持一致,否则将无法通过验证)
Email Address []:
#邮箱(可以不填)
###以上操作默认选项可通过修改配置文件(/etc/pki/tls/openssl.cnf)修改
[root@zabbix private]
# cd ..
[root@zabbix CA]
# ll
-rw-r--r-- 1 root root 1318 Dec 30 15:57 cacert.pem
drwxr-xr-x. 2 root root 4096 Nov 22 2013 certs
drwxr-xr-x. 2 root root 4096 Nov 22 2013 crl
drwxr-xr-x. 2 root root 4096 Nov 22 2013 newcerts
drwx------. 2 root root 4096 Dec 28 14:39 private
命令详解:
req: 生成证书签署请求
-news: 新请求
-key
/path/to/keyfile
: 指定私钥文件
-out
/path/to/somefile
: 指定生成证书位置
-x509: 生成自签署证书
-days n: 有效天数
|
初始化工作环境
[root@zabbix CA]
# touch index.txt serial
[root@zabbix CA]
# ls
cacert.pem certs crl index.txt newcerts private serial
[root@zabbix CA]
# echo 01 >serial
[root@zabbix CA]
# cat serial
01
#命令详解:
index.txt:证书缩影数据库
serial:签署证书编号文件
echo
01 > serial
#设定编号初始值
|
客户端申请证书
#生成密钥
#我们给web服务生成请求用于https,在其配置文件目录创建用于保存私钥和证书的目录
[root@www ~]
# mkdir /etc/httpd/ssl
[root@www ~]
# cd /etc/httpd/ssl
[root@www ssl]
# ls
[root@www ssl]
# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
..........................................................................+++
....+++
e is 65537 (0x10001)
[root@www ssl]
# ll
-rw------- 1 root root 1679 Dec 30 16:36 httpd.key
#生成证书签署请求
[root@lab01 ssl]
# openssl req -new -key httpd.key -out httpd.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) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:hzcf
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's
hostname
) []:www.hzcf.com
Email Address []:
Please enter the following
'extra'
attributes
to be sent with your certificate request
A challenge password []:
#证书请求需要加密存放,如果添加密码,需要将密码一同给CA
An optional company name []:
###将签署请求文件发送给CA服务器
##CA服务器工作目录下,手动创建了一个存放证书请求的目录(存放目录请随意)
[root@lab01 ssl]
# scp httpd.csr 192.168.9.9:/u01/tmp
The authenticity of host
'192.168.9.9 (192.168.9.9)'
can't be established.
RSA key fingerprint is 36:17:6b:58:68:f2:cc:9e:af:0d:e8:84:a5:83:4c:9c.
Are you sure you want to
continue
connecting (
yes
/no
)?
yes
Warning: Permanently added
'192.168.9.9'
(RSA) to the list of known hosts.
root@192.168.9.9's password:
httpd.csr 100% 1005 1.0KB
/s
00:00
CA签署证书
[root@zabbix ~]
# cd tmp
[root@zabbix tmp]
# ls
httpd.csr
[root@zabbix tmp]
# openssl ca -in httpd.csr -out httpd.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: Dec 30 08:49:17 2015 GMT
Not After : Dec 27 08:49:17 2025 GMT
Subject:
countryName = CN
stateOrProvinceName = Beijing
organizationName = hzcf
organizationalUnitName = linux
commonName = www.hzcf.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
D4:83:D5:B4:54:00:C2:FD:BC:70:52:FD:CF:74:0A:69:56:7E:54:02
X509v3 Authority Key Identifier:
keyid:1B:DB:DC:36:5A:82:A5:AF:1A:A9:9C:7B:71:51:54:44:10:31:C3:4B
Certificate is to be certified
until
Dec 27 08:49:17 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
#将签署的证书发回请求者
[root@zabbix tmp]
# scp httpd.crt 192.168.9.208:/etc/httpd/ssl
The authenticity of host
'192.168.9.208 (192.168.9.208)'
can't be established.
RSA key fingerprint is 57:ea:c0:ae:84:98:d8:63:01:b0:65:85:ef:4b:46:88.
Are you sure you want to
continue
connecting (
yes
/no
)?
yes
Warning: Permanently added
'192.168.9.208'
(RSA) to the list of known hosts.
root@192.168.9.208's password:
httpd.crt 100% 4446 4.3KB
/s
00:0
#这样客户端就可以配置使用CA签署的证书,进行加密通信了。
但是如果客户端的私钥不慎丢失,或者证书过期了该怎么办呢?接下来我们看一下证书怎么吊销吧。
|
吊销证书
客户端获取证书serial
[root@lab01 ssl]
# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject=
/C
=CN
/ST
=Beijing
/O
=hzcf
/OU
=linux
/CN
=www.hzcf.com
#CA验证信息
根据节点提交的serial和subject信息来验证与index.txt文件中的信息是否一致
[root@zabbix CA]
# cat index.txt
V 251227084917Z 01 unknown
/C
=CN
/ST
=Beijing
/O
=hzcf
/OU
=linux
/CN
=www.hzcf.com
#CA吊销证书
[root@zabbix CA]
# ls newcerts/
01.pem
[root@zabbix CA]
# openssl ca -revoke newcerts/01.pem
Using configuration from
/etc/pki/tls/openssl
.cnf
Revoking Certificate 01.
Data Base Updated
[root@zabbix CA]
# cat index.txt
R 251227084917Z 151230090339Z 01 unknown
/C
=CN
/ST
=Beijing
/O
=hzcf
/OU
=linux
/CN
=www.hzcf.com
CA生成吊销证书编号(第一次吊销)
[root@zabbix CA]
# echo 01 > crlnumber
CA更新证书吊销列表
[root@zabbix CA]
# cd crl
[root@zabbix crl]
# openssl ca -gencrl -out ca.crl
Using configuration from
/etc/pki/tls/openssl
.cnf
#如果有需要,可查看crl文件的内容
#openssl crl -in /path/to/crlfile.crl -noout -text
|
好了,证书成功吊销,可以重新申请了。
最后讲讲https
我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。
HTTPS简介
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的,且看下图。
1. 客户端发起HTTPS请求
这个没什么好说的,就是用户在浏览器里输入一个https网址,然后连接到server的443端口。
2. 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl就是个不错的选择,有1年的免费服务)。这套证书其实就是一对公钥和私钥。如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
3. 传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
4. 客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书对该随机值进行加密。就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。
5. 传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
6. 服务段解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密。所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。
7. 传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
8. 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容。整个过程第三方即使监听到了数据,也束手无策。