互联网高速发展的今天,确保通信数据能够在互联网上安全可靠的传输是极为重要的。为此,各种安全算法,协议纷纷诞生。Openssl只是其中之一,Openssl为网络通信提供安全及数据完整性的一种安全协议,包括了主要的密码算法、常用的密钥和证书封装管理功能(CA)以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用
美国NIST给出了数据安全可靠传输的明确标准:
保密性:
数据保密性
隐私性
完整性:
可用性:
加密:使用加密算法对明文加工处理,转换成不可识别的代码信息,确保信息安全。
解密:运用对应的解密算法对加密过的信息,进行反向解码,还原原始数据。
常见加密算法和协议有:
对称加密
公钥加密(非对称加密)
单向加密
认证协议
对称加密:加密和解密使用同一个密钥
常见的对称加密算法有:DES(Data Encryption Standard) ,3DES,AES,Blowfish,Twofish,IDEA,RC6 ...
特性有:
1.加密,解密使用同一个密钥
2.将原始数据分割成块,逐个加密(导致加解密速度慢)
缺陷:
1.密钥过多,通信对象过多时,要维护的密钥过多,不便管理
2.密钥分发,初次通信,安全分发密钥有困难
非对称加密:亦称公钥加密,密钥成对出现,分为公钥和私钥,均可用来加密和解密,但是公钥加密的 数据,只能用与之对应的私钥来解密;反之亦然
公钥:pubkey,用来公开给所有人
私钥:private key, 自己保存,且必须保证私密性
公钥加密可以实现如下功能:
数字签名(身份确认):用于让数据接收方确认发送方的身份信息,接收方用对方公钥可以解开对方 发送过来的数据,即可确认对方身份
密钥交换:用接收方的公钥加密一个对称密钥给接收方,并发送给对方
加密数据:但加密过程会很慢
算法有:RSA,DSA,ELGamal
单向加密:只能加密,不能被解密;用户提取数据的的指纹(特征码)
算法有:md5,sha1,sha224,sha256....
特性:
1.定长输出:无论原数据有多大,一旦算法确定,加密后结果长度就是确定不变的
2.雪崩效应:原数据的细小改变,均可导致加密后的结果巨大的变化
功能:用来校验数据完整性,接收方使用同种算法对数据进行单向加密,提取特征和发送方提供的 特征码比对,如果一致,即可验证数据完整性
PKI: Public Key Infrastructure
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
X.509:定义了证书的结构以及认证协议标准
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称
主体公钥
发行者惟一标识
主体的惟一标识
扩展
发行者签名
CA:是PKI系统中通信双方都信任的实体,被称为可信第三方(Trusted Third Party,简称TTP)。CA作 为可信第三方的重要条件之一就是CA的行为具有非否认性。作为第三方而不是简单的上级,就必须 能让信任者有追究自己责任的能力。CA通过证书证实他人的公钥信息,证书上有CA的签名。
注:在操作系统发布的时候,知名权威的CA机构都已经被内置到操作系统中。
SSL:
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传 输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。
其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为 Internet上保密通讯的工业标准。
OpenSSL: 开源项目,是SSL协议的开源实现
作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算 法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的 使用
有如下组件:
Openssl:多用途的命令行工具
libcrypto:公共加密算法库
libssl: 库,实现了ssl及tls
openssl命令:使用
rpm -qa opnessl 查看有无安装openssl,如果没有使用yum安装即可
使用-help 了openssl 支持使用的命令 [root@S1 CA]# openssl -help #查看帮助文档 openssl:Error: '-help' is an invalid command. Standard commands #标准命令 asn1parse ca ciphers cms crl crl2pkcs7 dgst dh ...此处略去N行输出 Message Digest commands (see the `dgst' command for more details) #消息摘要支持的算法 md2 md4 md5 rmd160 sha sha1 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 ...此处略去N行输出
对称加密:工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
enc命令:
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext 解密:~]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
des3是算法也可以使用其它的算法;-a 基于base64编码;-salt 添加杂质;-in 代加密的 文件; -out 加密后的输出
]# cat test # test 文档内容为"加密测试" 加密测试 ]# openssl enc -e -des3 -a -salt -in test -out test.ciphertext enter des-ede3-cbc encryption password:#此处可以输入你的密码 Verifying - enter des-ede3-cbc encryption password:#确认你输入的密码 ]# cat test.ciphertext #此时查看内容已经是加密过的 U2FsdGVkX18W5bwFxvEnj6mouus7JSRy ]# openssl enc -d -des3 -a -salt -in test.ciphertext -out test enter des-ede3-cbc decryption password:#如果上一步有输入密码,此处需输入密码 ]# cat test #验证解密成功 加密测试
单向加密:
工具:md5sum, sha1sum, sha224sum, sha256sum,..., openssl dgst
dgst命令:openssl dgst -md5 /PATH/TO/SOMEFILE
[root@S1 test]# md5sum test #直接使用md5对 test 文档加密 d41d8cd98f00b204e9800998ecf8427e test [root@S1 test]# openssl dgst -md5 test #使用openssl 调用md5算法对test加密 MD5(test)= d41d8cd98f00b204e9800998ecf8427e 注:同一个算法,单向加密后结果一样
生成密钥对:openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
[root@S1 test]# (umask 077; openssl genrsa -out key.pri 2048) #()中命令在shell中 执行,执行完,退出子shell Generating RSA private key, 2048 bit long modulus ...........+++ .......+++ e is 65537 (0x10001) [root@S1 test]# ll key.pri #查看密钥key.pri已经生成,权限是600 -rw------- 1 root root 1675 Sep 20 17:24 key.pri
提取公钥:
[root@S1 test]# openssl rsa -in ./key.pri -pubout #从上一步生成的密钥对提取出公钥 writing RSA key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzlrktU8dLvkmfKyDOvGq sLd1m9XVVQ91JWueTTJ3Y4hs5DmnYWKCvcV2ZEl14Km/1ojCC7urWdFt9k7El1ED aHHA2LOrh+iSfH3hRUT/3TouylG7qUxa2IWbgKErnId/RIfIy8kIFw9Mg5jkS3xT SIjbS6+iyEr285x+mzBz8XVTngw6SgtQrOXKJEWkhDQMqUhGGbRSmOvPP/ZA2p6A 0TdOOGudBHX04d7G+2NSKEDMr1EAT6QiEWjPRSD7jZy6jSEg3kZ2Gsf6cJVSq3oD VtPd2hPEo2n/Sw3OT0M0n04W3VE2GQaa2bFhxOxZwczCZeJpdt9vZ44w7ERYuzfm KwIDAQAB -----END PUBLIC KEY-----
搭建私有CA
证书申请及签署步骤:
1、生成申请请求;
2、RA核验;
3、CA签署;
4、获取证书;
一:按需修改openssl的配置文件(etc/pki/tls/openssl.cnf)
This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd ...此处略去N行 #################################################################### [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = /etc/pki/CA # Where everything is kept #CA所有相关数据的存储路径 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 #CA自己的证书的保存路径 serial = $dir/serial # The current serial number #证书序列号 crl = $dir/crl.pem # The current CRL #存放被吊销的证书 private_key = $dir/private/cakey.pem# The private key #私钥存储路径 ...此处略去N行
二:创建所需的文件
#cd /etc/pki/CA
# touch index.txt
# echo 01 > serial #指定序列号
三:CA自签证书:
1.创建密钥对 (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) ##生 成密钥对,长度2048
[root@S1 CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...............................+++
e is 65537 (0x10001)
2.自签证书: openssl req -new -x509 -key etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
[root@S1 CA]# openssl req -new -x509 -key private/cakey.pem -days 365 -out cacert.pem 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]:hsp.com Organizational Unit Name (eg, section) []:^C [root@S1 CA]# openssl req -new -x509 -key private/cakey.pem -days 365 -out cacert.pem 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]:hsp.com Organizational Unit Name (eg, section) []:ops Common Name (eg, your name or your server's hostname) []:www.hsp.com Email Address []:[email protected]
3.发证
(a) 需要用到证书的主机生成证书请求;先创建相关保存私钥或证书的目录:mkdir /etc/httpd/ssl (可以自定路径)
[root@s7 ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) Generating RSA private key, 2048 bit long modulus ......................................................................................+++ .+++ e is 65537 (0x10001) [root@s7 ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) Generating RSA private key, 2048 bit long modulus .+++ .....................................................................................+++ e is 65537 (0x10001)
[root@s7 ssl]# openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/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]:hsp.com Organizational Unit Name (eg, section) []:ops Common Name (eg, your name or your server's hostname) []:www.hsp.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 []: [root@s7 ssl]#
(b) 把请求文件传输给CA;
[root@s7 ssl]# scp /etc/httpd/ssl/httpd.csr 172.17.0.10:/tmp #将证书申请请求传输给 CA,172.17.0.10 为我的CA服务器 httpd.csr [root@S1 tmp]# ll httpd.csr #S1上已经收到了客户端s7发送过来的证书请求文件 -rw-r--r-- 1 root root 1045 Sep 20 19:26 httpd.csr
(c) CA签署证书,并将证书发还给请求者;
[root@S1 tmp]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365 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: Sep 20 11:28:11 2015 GMT Not After : Sep 19 11:28:11 2016 GMT Subject: countryName = CN stateOrProvinceName = Beijing organizationName = hsp.com organizationalUnitName = ops commonName = www.hsp.com emailAddress = [email protected] X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 8F:E2:F6:10:D6:F4:9C:A3:28:35:1B:B9:01:07:40:F4:96:32:60:BA X509v3 Authority Key Identifier: keyid:C0:24:E3:CA:D7:6A:6C:AC:D1:08:83:D2:5B:55:9B:0A:F8:8A:78:88 Certificate is to be certified until Sep 19 11:28:11 2016 GMT (365 days) Sign the certificate? [y/n]:yes 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
将证书发送给申请证书的主机
[root@S1 tmp]# /usr/bin/scp /etc/pki/CA/certs/httpd.crt 172.17.0.20:/etc/httpd/ssl httpd.crt
查看证书中的信息:
[root@s7 ssl]# openssl x509 -in httpd.crt -noout -subject #查看证书中的信息 subject= /C=CN/ST=Beijing/O=hsp/OU=ops/CN=www.hsp.com/[email protected] [root@S1 CA]# ls certs/ httpd.crt [root@S1 CA]# cat serial #初始设置的系列号为01,现在颁发了一个证书给serverS7 ,现在 序列号增加到了2 02
4.吊销证书
(a) 客户端获取要吊销的证书的serial
# openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
[root@s7 ssl]# openssl x509 -in httpd.crt -noout -subject
subject= /C=CN/ST=Beijing/O=hsp/OU=ops/CN=www.hsp.com/[email protected]
(b) CA
先根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致;
吊销证书:
# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
(c) 生成吊销证书的编号(第一次吊销一个证书,后续会自动增长序列号,所以只用定义一次)
# echo 01 > /etc/pki/CA/crlnumber
(d) 更新证书吊销列表
# openssl ca -gencrl -out thisca.crl
查看crl文件的命令:
# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text