在当今互联网的时代,密码学是提供安全的最主要工具之一。密码学的主要目的是通过数据机密性、数据完整性、认证、不可抵赖性来挫败大部分的网络攻击,包括窃听、IP欺骗、劫持、篡改。openssl是一个通过密码学实现的工具。
密码术的定义与概念:
加密方法能够将被称为明文的可读数据转换为密文的、看似随机和不可读的数据,加密解密的过程,如下图:
提供加密和解密的系统或产品称为密码系统,它由硬件组件和应用程序中的程序代码组成。密码系统使用加密算法(它决定加密过程 的简单或复杂程度)、密钥以及必要的软件组件和协议。当一条信息在两个人之间传递时,如果偷听者捕获这条消息,那么就可以查看该消息。但是,由于消息处于加密状态,因此偷听者无法理解它。即使知道两个人用于加密和解密信息的算法,偷听者在不知道密钥的情况下仍然无法利用这条消息。
密码系统的强度:
加密方法的强度源自算法的复杂程序、密钥的机密度、密钥的长度、初始化向量以及它们如何在密码系统内协同工作。设计加密方法的目标是使破解过程过于昂贵或十分费时。密码术强度也称为工作因数,即对攻击者破译一个密码系统所付出的努力和资源进行评估。
密码术定义:
访问控制:限制和控制主体与客体的访问尝试
算法:用于加密和解密的一组数学规则
密码:算法的另一个名称
密码术:采用数据的存储和传输只对预期方有效的形式来密写数据的学科
密码系统:密码术的硬件或软件实现,能够将消息转换为密文以及从密文转换回明文
密码分析:破解密的实际工作
密码学:对密码术与密码分析的研究
数据来源身份验证:证明消息来源(基于系统的身份验证)
加密:将数据转换为不可读格式的行为
实体身份验证:证明发送消息的实体的身份
解密:将数据转换为可读格式的行为
密钥:控制加密和解密行为的保密位序列和指令
密钥群集:同一明文使用两个不同密钥可以生成相同密文的实例
密钥空间:用于构建密钥的可能值范围
明文:可读格式的数据
加密的方法:
密码术算法可以是对称算法,它使用对称密钥(也称为秘密密钥);也可以是非对称算法,它使用非对称密钥(也称为公钥和私钥)。
对称密码术:
在一个使用对称密码术的密码系统中,发送方和接收方使用相同密钥的两个实例来加密和解密。因此,这两个密钥具有双重功能性,既可以完成加密,也可以完成解密。这种加密方法的脆弱性在于如果密钥被泄露,获取该密钥的人可以解密任何被截获的加密消息。
对称密码术的优点:
比非对称密码系统快得多
在使用大密钥时很难攻破
对称密码术的缺点:
需要一个恰当分发密钥的安全机制
每对用户都需要唯一的密钥,因此密钥数呈指数增长,密钥管理繁重不堪
能够提供机密性,但是不能提供确实性或不可否认性
对称加密算法的示例:
数据加密标准(Data Encryption Standard,DES)
三重DES(Triple-DES,3DES)
Blowfish
国际数据加密算法(Internatiional Data Encryption Algorithm,IEDA)
RC4、RC5和RC6
高级加密标准(Advanced Encryption Standard,AES)
非对称密码术:
在对称密钥密码术中,实体之间使用单一密钥;而公共密钥系统中,两个实体中的每个实体都具有不同的密钥或非对称密钥,这两个不同的非对称密钥是数学相关的。如果消息是使用其中一个密钥加密的,那么就需要另一个密钥进行解密。在公共密钥系统中,密钥由一个公钥和一个私钥组成。公钥可以被任何人所知,而私钥必须只由所有者知道和使用。很多时候,公钥列在电子邮件地址的目录和数据库中,以便任何人想与特定的人通信时都可以使用这些密钥来加密和解密数据。
非对称密钥算法的优点:
具有比对称系统更好的密钥分发功能
具有比对称系统更好的扩展性
能提供身份验证和不可否认性
非对称密钥算法的缺点:
比对称系统运行要慢
是数据密集的任务
非对称密钥算法的示例:
RSA
椭圆曲线密码系统(Elliptic Curve Cryptosystem,ECC)
Diffie-Hellman(DH)
El Gamal
数字签名算法(Digital Signature Algorithm,DSA)
背包算法(Merkle-Hellman)
对称算法与非对称算法之间的差异:
特征 对称系统 非对称系统 密钥 两个或多个实体共享同一个密钥 一个实体拥有公钥,另一个实体拥有私钥 密钥交换 通过带外方式的安全机制 公钥每个人都能使用,私钥只有使用人知道 速度 算法不太复杂,运行快 算法较为复杂,而且运行速度慢 用途 批量加密,也就是加密文件和通信路径 密钥分发和数字签名 提供的安全性 机密性 身份验证和不可否认性
混合加密方法:
我们了解到对称算法速度很快,但存在一些缺点(缺乏扩展性、密钥难以管理、仅提供机密性);非对称算法没有上述缺点,但速度很慢。两种加密算法都有不尽人意之处,于是我们考虑结合对称与非对称方法的混合系统。当使用对称密钥加密批量数据时,这个密钥用来加密您想要发送的消息。当您的朋友收到您发送的加密消息时,您希望他能解密这条消息,因此应该给他发送一个解密该消息所需要的密钥。当然,您不希望密钥被无保护地传送给朋友,因为如果这条消息被拦截,而该密钥又没有被保护,那么想做坏事的人就能够截获该密钥,从而可以解密您发送的消息,阅读您的信息。解决的办法是通过非对称密钥加密对称密钥,使用对称密钥加密消息。
混合密钥的工作方式:
假设Bill给Paul发送一条消息,而且Bill希望只有Paul能够阅读这条消息。Bill使用保密密钥加密了消息,于是就有了密文和相应的对称密钥。对称 密钥需要得到保护,因此Bill使用非对称密钥来加密这个对称密钥。需要记住的是非对称密钥用到公钥和私钥。因为Bill需要使用Paul的公钥加密对称密钥。此时Bill有了消息密文和对称密钥的密文。Paul接收到Bill的消息之后使用自己的私钥来解密对称密钥,然后使用对称密钥来解密消息。这样,Paul就能够阅读Bill发送给他的机密信息。
会话密钥:
会话密钥是只使用一次的对称密钥,用于对通信会话期间两个用户这间的消息进行加密。如果Bill和Paul通信的时候一直使用一个对称密钥来加密消息,那么这个对称密钥不会再生和改变,因此他们每次通信时都使用相同的密钥进行加密。然而,多次使用同一个密钥就增大了攻击者攻破密钥的机会,从而安全得不到保证。另和种方法,Bill和Paul每次通信时都产生一个新的对称密钥,这个密钥仅仅在一次对话中使用。与静态的对称密钥相比,会话密钥提供了更多的保护,如果攻击者截获了会话密钥,那么他只有很短的时间间隙来解密来回传输的加密消息。
消息完整性:
单向散列:
单向散列是一种函数,它将可变长的字符串或消息压缩变换成固定长度的值,也就是我们所说的散列值。散列算法的工作过程:
(1)发送方使用散列函数对消息进行计算
(2)生成消息摘要
(3)将这个消息摘要附近加在消息后面
(4)发送方向接收方发送消息
(5)接收方使用散列函数对消息进行计算
(6)接收方生成自己的消息摘要值
(7)接收方比较两个消息摘要值。如果两者相同,那么就认为消息未被修改。
各种散列算法:
算法 | 描述 |
消息摘要算法2(MD2) | 单向函数。产生128位的散列值,比MD4 MD5慢得多。 |
消息摘要算法4(MD4) | 单向函数。产生128位的散列值。 |
消息摘要算法5(MD5) | 单向函数。产生128位的散列值,比MD4复杂。 |
HVAL算法 | 单向函数。可变长的散列值,是对MD5的修改,对影响 MD5的攻击提供了更多保护。 |
安全散列算法(SHA) | 单向函数。产生160位的散列值,应用在DSA中。 |
SHA-1、SHA-256、SHA-384、SHA-512 | SHA的升级版。SHA-1产生160位的散列值,SHA-256产生256位的散列值,依此类推。 |
公钥基础设施(PKI):
PKI由程序、数据格式、措施、通信协议、安全策略以及公钥密码机制组成,这些组件综合方式运地的,使得分散的人们能够以安全的、预定的方式相互通信。PKI在一个环境内建立了一个信任级别。PKI是一种使用公钥密码术和X.509标准的ISO身份验证架构,建立这个架构的目的是允许在不同的网络和Internet之间进行身份验证。
PKI提供身份验证、机密性、不可否认性以及消息交换的完整性。PKI是混合对称与不对称密钥算法的系统。
PKI由许多不同的部分组成:认证授权、注册授权、证书、密钥以及用户。
认证授权机构(CA):
CA是保管和发布数字证书的可信组织机构(或服务器)。当一个人请求证书时,注册授权机构RA会验证这个人的身份,并将证书请求提交给CA。CA创建证书并签名,再将其发送给请求者,同时为请求者在证书的有效期内保管该证书。当一个人想要与这个人通信的时候,CA通常要担保这个人的身份。CA负责创建和分发证书,保管证书以及在必要时取消证书。取消证书的过程由CA处理,被取消证书的信息存储在证书取消列表(CRL)中。它是一个存储所有被取消证书的列表,该列表被加以维护和定期列新。
CRL:
CRL是许多PKI实现的“眼中钉”。由于许多原因,它们正受到挑战。有趣的是,在默认情况下,WEB浏览器并不检查CRL以确保某个证书未被取消。因此,如果建立SSL连接以通过Internet从事电子商务,那么您就可以使用一个实际上已被取消的证书。相对于繁琐的CRL方法,人们正越来越多地开始使用在线证书状态协议(OCSP)。如果使用OCSP,那么它会在后台自动完成上述工作。OCSP会对证书执行实时确证,并向用户报告证书是有效、无效还是未知。OCSP会检查由CA维护的CRL。因此,它仍然使用CRL,但现在已开发出了一个在证书确证过程中专门用于检查CRL的协议。
证书:
PKI的一个重要组成部分,证书是用于将公钥和唯一标识其所有者所需要的组成部分关联起来的机制。CA创建证书的标准是X.509,它规定证书中使用的不同字段以有能够在这些字段中输入的有效值。证书结构如下:
版本 序列号 签名 发行者 有效期 主体 主体公钥信息 发行者唯一ID 主体唯一ID 扩展 版本:标识证书的版本
序列号:证书的唯一序列号
签名:用于对证书进行签名的算法ID
发行者:证书发行者的名称
有效期:有效日期
主体:所有者的姓名
主体公钥信息:所有者的公钥
发行者唯一ID:发行CA的ID
主体唯一ID:主体的ID
扩展:可选扩展
注册授权机构(RA):
RA执行证书注册任务。RA建立和确认个人的身份,代表终端用户启动使用CA的认证过程,以及执行证书生命周期管理功能。RA不能发行证书,但是可以作为用户和CA之间的中间人。当需要新证书的时候,用户就会向RA发送请求,然后RA再将该请求发送给CA
PKI步骤:
1.用户A向RA发送一个请求
2.RA会向他索取特定的身份标信息,例如姓名、电话号码、籍贯等等
3.一旦RA接收到信息进行验证,那么RA就将用户A的认证请求发送给CA
4.CA创建一个证书,该证书嵌入了用户A的公钥及其身份信息(私钥/公钥对由CA或用户A的机器创建,这取决于系统的配置。如果由CA创建,那么就要通过安全的方式将私钥发送给用户A。在大多数情况下,用户会生成这个密钥对,然后在注册过程中发送他的公钥
5.用户A现在决定和用户B开始通信
6.用户A从一个公共目录请求用户B的公钥
7.这个目录(有时也称为存储库)将用户B的公钥发送给用户A
8.用户A验证数字证书并提取出用户B的公钥,用户A使用该公钥加密一个会话密钥,这个会话密钥将用于加密他们之间传递的消息。用户A将加密的会话密钥发送给用户B,然后再将自己的、包含其公钥的证书也发送给用户B
9.当用户B接收到用户A的证书时,其浏览器会查看她信任的CA是否对该证书进行了数字签名。只要用户B的浏览器信任这个CA,并且验证了证书,用户A和B就可以进行使用加密的通信。
PKI可能由下列实体和功能组成:
CA
RA
证书存储库
证书撤销系统
密钥备份和恢复系统
自动密钥更新
密钥历史记录管理
时间标记
客户端软件
PKI提供下列安全服务:
机密性
访问控制
完整性
身份验证
不可否认性
openssl是一个密码学实现的软件工具,用于实现SSL v2/v3和TLS v1网络协议。openssl的功能作用:
1.用于创建和、管理公钥和私钥以及一些参数
2.公钥加密业务操作
3.创建X.509格式的证书、证书签名请求(CSR)、证书吊销列表(CRL)
4.计算消息摘要
5.加密解密密码
6.SSL/TLS客户端和服务器的测试
7.处理S/MIME签名或者加密的邮件
8.时间标识请求、产生和验证
对称加密:
加密 # openssl enc -des3 -a -salt -in /etc/inittab -out /tmp/inittab.cipher -k 123 查看加密后的文件 # cat /tmp/inittab.cipher U2FsdGVkX19iSzkpfA0WUgWMwMcmBk+dLceoFZWAwM8ruuZ1Z22rRacHL0wc7bXc r86lNL4/UMl+aPFskV6SRTIOKBVej7bwORvUu8lpsbmroMCb4M2TzUGVrx1ggZ3V u47yFG+TKvjhfR26ZsCNZ9NTHXwEirHnXRlnDPAaUwZsv3lBv5NNjewoF3jF4cGk 3Mp3rk86rVkdB/EOlH4ob5bX1XnkBaMyMQpOH2uwUSJql9q7drjyCagUTQ3/Bsl3 NquvkdfitYoaWoawWbt7TtgCMpnP5O+wN/XRKaQT0DsjZ5CGnPkgQNXP7J83DDXu SCV9Wra9TgnDIRe+AT+Mmcanm80KGy3f8hUX086Sts6zhwrm6GB6zzWgq7/NekCI xdDL9raRdlBgYlB6SMq8FO484780OleJbfmco5F5BYY6peLTsinQG0eHw+Xfqycn ubDD26CBgrMVapFRAH8SKeUmCEn9B6BILsIxFUSpEflbOACcyeeHhttwd6Pth6+F PpxMH4HZcDMH2O8g5oiSn8rfBK3NF1Lzzt1GXxe50ug7CCly3+mX+uc6ByahBhpO BoOnqBRgGhGAygZOujreLUVx+AUW1z8sZBEGIeY64xevl7qa+U1qW29r1GfVRWTJ lDhZi+1jHc4YRxiFoOTnUU1gBlUqeN9rshYxJAXGcIXOfOZkcGDyM9/z2LMYuqvV OLnOGjO6FYnDUKBH1L48H4UIYulmWwlsL2ZAjCLNmjZdj3ouNyF2zVj3GseRwbKg d1dxHqzYcu8cK3bcJDjWE/4YCN3eDBH9xZDhEAQqLRtxNwphAOLMcusdnD3BvlhT cyyBe/W2Veb7pG2Xo4aQ3Bku1Co5vdMLq8Oyf0/ZUnmgiE+vSqa2S7CFHkrZ0K8U OiPoQIZFTozKKD9O9uenR3CU8BdWFHWWrEcz1AxfT5fqkOOUAaN1pCmrbXc4GQr1 6qOlQBf4gGVm2MJZLvAWOxhrXPdL+LxBDPvk5ZDKjVlURajcSQGK8MG2kdu1YQqY Leo9nkFInlvqQ1DSx6mUQHnoAXW4WbvYn4LwAIE0YZaDZRBFB4vunukHzSxoTNAn qLWO9SSstT4QSpf+uFPo4rOWtb9Of6S+hAqrxmx4krTmEF5HsiEd/cQeVeZMNWqE PyH+Lsd6rcxZ77b6GazC07cUnC1BY/PYjH96EOjYoFkm9sLugSIy2A== 解密 # openssl enc -d -des3 -a -salt -in /tmp/inittab.cipher -out /tmp/inittab.plaintext -k 123 查看解密后的文件 # cat /tmp/inittab.plaintext # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/rcS.conf # # Individual runlevels are started by /etc/init/rc.conf # # Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf, # with configuration in /etc/sysconfig/init. # # For information on how to write upstart event handlers, or how # upstart works, see init(5), init(8), and initctl(8). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3, if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault:
消息摘要
生成消息摘要,默认显示在标准输出 # openssl dgst -md5 /etc/inittab MD5(/etc/inittab)= 753a386bcd9ab0ca581056348463891e 生成消息摘要,重定向到文件中 # openssl dgst -md5 -out /tmp/md5.out /etc/inittab # cat /tmp/md5.out MD5(/etc/inittab)= 753a386bcd9ab0ca581056348463891e
使用openssl构建私有CA:
确认配置文件
# vim /etc/pki/tls/openssl.cnf2. 生成密钥对
# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus .................................................+++ .....................................................+++ e is 65537 (0x10001)3. 查看/导出公钥
# openssl rsa -in /etc/pki/CA/private/cakey.pem -pubout -text ................ ................ -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArLMrNnvyUCZR/GuIFSDZ GcF6+jxqFoVvN6iR17rN6gmyIzSJKep3o5buqcLv0gPMh7UVo44Xtg2i4AUuGEgt T7RQ/k/y6YAiFO6nwUzoEQTLjjdT3NWCjoTuP2L0svBhQpgp6iBFh5X4pNjAqbgh 8VspidZLW1LADqy/3HCRjizQ6To3Dh/hTL7QJYD6dCwC87+VHtOIefq01+KNb8Iy iQuosfl3rQ5akVX+VtunVP7Am4Jvpjl3MUQCgySpdatx8lkWFCMBNCHU/u//1zkK 9ry0GBKLfmbzXq4aWEURiZV6F9T1Jbr1sL9s7CGhBzjo/QXd2EzqiDhcqx7W1U8b qQIDAQAB -----END PUBLIC KEY-----4. 生成自签证书
# openssl req -new -x509 -key /etc/pki/CA/private/cacert.pem -out /etc/pki/CA/cacert.pem -days 3600 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]:SH State or Province Name (full name) []:ShangHai Locality Name (eg, city) [Default City]:ShangHai Organization Name (eg, company) [Default Company Ltd]:FU Organizational Unit Name (eg, section) []:linux Common Name (eg, your name or your server's hostname) []:192.168.57.23 Email Address []:root@localhost5.创建/etc/pki/CA目录下所需要的文件
# cd /etc/pki/CA # touch index.txt serial crlnumber # echo "000001" > serial6.在客户端上实现证书申请
# mkdir /etc/httpd/ssl # cd /etc/httpd/ssl # (umask 077;openssl genrsa -out httpd.key 2048) Generating RSA private key, 2048 bit long modulus ........................+++ ........................................+++ e is 65537 (0x10001) # 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) []:ShangHai Locality Name (eg, city) [Default City]:ShangHai Organization Name (eg, company) [Default Company Ltd]:FU Organizational Unit Name (eg, section) []:linux Common Name (eg, your name or your server's hostname) []:192.168.57.23 Email Address []:root@localhost Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: 将生成的.csr证书申请文件copy到CA服务器上 # scp httpd.csr [email protected]:/tmp/httpd.csr The authenticity of host '192.168.57.23 (192.168.57.23)' can't be established. RSA key fingerprint is 47:fb:11:3e:18:96:e1:b0:7e:18:ab:54:70:03:60:6a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.57.23' (RSA) to the list of known hosts. [email protected]'s password: httpd.csr 100% 1025 1.0KB/s 00:007. CA签署证书
# openssl ca -in /root/httpd.csr -out /etc/pki/CA/newcerts/httpd.crt -days 3600 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Sep 25 05:22:40 2014 GMT Not After : Aug 3 05:22:40 2024 GMT Subject: countryName = CN stateOrProvinceName = ShangHai organizationName = FU organizationalUnitName = linux commonName = 192.168.57.23 emailAddress = root@localhost X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: D6:14:58:90:3A:E6:5E:20:9C:E9:2B:CA:31:B3:21:29:0D:D4:E6:9E X509v3 Authority Key Identifier: keyid:7C:08:BB:84:5B:56:CB:FC:22:34:D1:5C:C7:96:22:AE:90:79:63:D0 Certificate is to be certified until Aug 3 05:22:40 2024 GMT (3600 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
8.将证书copy给请求者
# scp newcerts/httpd.crt [email protected]:/tmp/httpd.crt The authenticity of host '192.168.57.230 (192.168.57.230)' can't be established. RSA key fingerprint is aa:02:ce:3c:25:a5:34:28:2a:c2:ea:7b:6b:27:63:1a. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.57.230' (RSA) to the list of known hosts. [email protected]'s password: httpd.crt 100% 0 0.0KB/s 00:00
9.在CA上吊销证书
# openssl ca -revoke newcerts/httpd.crt Using configuration from /etc/pki/tls/openssl.cnf Revoking Certificate 00. Data Base Updated
10.重新产生CRL文件
# openssl ca -gencrl -out ca.crl -keyfile private/cakey.pem -cert cacert.pem Using configuration from /etc/pki/tls/openssl.cnf