1、加密过的数据可以公开地传送。2.数据的一致性加密也能保证数据的一致性。例如:消息验证码(MAC),能够校验用户提供的加密信息,接收者可以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。3.安全验证加密的另外一个用途是用来作为个人的标识,用户的密匙可以作为他的安全验证的标识。SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。目前,大部分的Web 服务器及浏览器都广泛支持SSL 技术。当浏览器试图连接一个具有SSL认证加密的服务器时,就会唤醒一个SSL会话,浏览器检查认证,必须具备下面三个条件:1)有一个权威机构发放证书,当然可以创建自我签订的
2、证书(x509 结构)。2)证书不能过期。3)证书是属于它所连接的服务器的。只有全部具备了这三个条件,浏览器才能成功完成认证。通过这三个条件,用户能确认其浏览器连接到正确的服务器,而不是连接到一些想盗取用户密码等重要信息的虚假的服务器上。在当今的电子商务中还有一项被广泛使用的安全协议是SET协议。SET(Secure Electronic Transaction,安全电子交易)协议是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。SET能在电子交易环节上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。SET交易分三个阶段进行:用户向商家购物并
3、确定支付;商家与银行核实;银行向商家支付货款。每个阶段都涉及到RSA对数据加密,以及RSA数字签名。使用SET协议,在一次交易中,要完成多次加密与解密操作,故有很高的安全性,但SET协议比SSL协议复杂,商家和银行都需要改造系统以实现互操作。在Linux 下,比较流行支持SSL认证的是OpenSSL服务器。OpenSSL项目是一个合作的项目,开发一个健壮的、商业等级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets Layer,SSL v2/v3)和传输层的安全性(Transport Layer Security,TLS v1)。这个项目是由
4、全世界的志愿者管理和开发OpenSSL工具包和相关文档。如何在Linux下配置OpenSSL服务器,首先从OpenSSL的主页()上下载并可以使用自我签订的证书做认证,关于如何编译、安装OpenSSL服务器,可以参考一下OpenSSL HOWTO文档。SSL 程序设计初步介绍SSL 通讯模型为标准的C/S 结构,除了在 TCP 层之上进行传输之外,与一般的通讯没有什么明显的区别。在这里,我们主要介绍如何使用OpenSSL进行安全通讯的程序设计。关于OpenSSL 的一些详细的信息请参考OpenSSL的官方主页 。在使用OpenSSL前,必须先对OpenSSL 进行初始化,以下的三个函数任选其一
5、:SSL_library_init(void);OpenSSL_add_ssl_algorithms();SSLeay_add_ssl_algorithms();事实上 后面的两个函数只是第一个函数的宏。如果要使用OpenSSL的出错信息,使用SSL_load_error_strings (void)进行错误信息的初始化。以后可以使用void ERR_print_errors_fp(FILE *fp) 打印SSL的错误信息。一次SSL连接会话一般要先申请一个SSL 环境,基本的过程是:1. SSL_METHOD* meth = TLSv1_client_method(); 创建本次会话连接所使
6、用的协议,如果是客户端可以使用SSL_METHOD* TLSv1_client_method(void); TLSv1.0 协议SSL_METHOD* SSLv2_client_method(void); SSLv2 协议SSL_METHOD* SSLv3_client_method(void); SSLv3 协议SSL_METHOD* SSLv23_client_method(void); SSLv2/v3 协议服务器同样需要创建本次会话所使用的协议:SSL_METHOD *TLSv1_server_method(void);SSL_METHOD *SSLv2_server_method(v
7、oid);SSL_METHOD *SSLv3_server_method(void);SSL_METHOD *SSLv23_server_method(void);需要注意的是客户端和服务器需要使用相同的协议。2申请SSL会话的环境 CTX,使用不同的协议进行会话,其环境也是不同的。申请SSL会话环境的OpenSSL函数是SSLK_CTX* SSL_CTX_new (SSL_METHOD*); 参数就是前面我们申请的 SSL通讯方式。返回当前的SSL 连接环境的指针。然后根据自己的需要设置CTX的属性,典型的是设置SSL 握手阶段证书的验证方式和加载自己的证书。void SSL_CTX_set
8、_verify (SSL_CTX* , int , int* (int, X509_STORE_CTX*) )设置证书验证的方式。第一个参数是当前的CTX 指针,第二个是验证方式,如果是要验证对方的话,就使用SSL_VERIFY_PEER。不需要的话,使用SSL_VERIFY_NONE.一般情况下,客户端需要验证对方,而服务器不需要。第三个参数是处理验证的回调函数,如果没有特殊的需要,使用空指针就可以了。void SSL_CTX_load_verify_locations(SSL_CTX*, const char* , const char*);加载证书;第一个参数同上,参数二是证书文件的名称
9、,参数三是证书文件的路径;int SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);加载本地的证书;type 指明证书文件的结构类型;失败返回-1int SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);加载自己的私钥;type 参数指明私钥文件的结构类型;加载了证书和文件之后,就可以验证私钥和证书是否相符:BOOl SSL_CTX_check_private_key (SSL_CTX*);3既然SSL 使用TCP
10、 协议,当然需要把SSL attach 到已经连接的套接字上了:SSL* SSL_new (SSL_CTX*); 申请一个SSL 套节字;int SSL_set_rfd (SSL*); 绑定只读套接字int SSL_set_wfd (SSL*); 绑定只写套接字int SSL_set_fd ( SSL*); 绑定读写套接字绑定成功返回 1, 失败返回0;4 接下来就是SSL 握手的动作了int SSL_connect (SSL*); 失败返回 -15. 握手成功之后,就可以进行通讯了,使用SSL_read 和SS_write 读写SSL 套接字代替传统的read 、writeint SSL_r
11、ead (SSL *ssl, char *buf, int num );int SSL_write (SSL *ssl, char *buf, int num);如果是服务器,则使用 SSL_accept 代替传统的 accept 调用int SSL_accept(SSL *ssl);6. 通讯结束,需要释放前面申请的 SSL资源int SSL_shutdown(SSL *ssl); 关闭SSL套接字;void SSL_free (ssl); 释放SSL套接字;void SSL_CTX_free (ctx); 释放SSL环境;册都没有完成。所以,本文紧紧是讲述了使用OpenSSL 进行程序设计
12、的框架。更加详细的资料可以参考OpenSSL 的文档或者 Apache mod_ssl 的文档。通过以上的介绍,我想读者对SSL协议已经有了一定的了解,作者有机会将会继续给大家介绍SSL协议的其他方面的内容。SSL原理解密本文出自:范晓明RSA公钥加密在计算机产业中被广泛使用在认证和加密。可以从RSA Data Security Inc.获得的RSA公钥加密许可证。公钥加密是使用一对非对称的密码加密或解密的方法。每一对密码由公钥和私钥组成。公钥被广泛发布。私钥是隐密的,不公开。用公钥加密的数据只能够被私钥解密。反过来,使用私钥加密的数据只能用公钥解密。这个非对称的特性使得公钥加密很有用。使用公
13、钥加密法认证认证是一个身份认证的过程。在下列例子中包括甲和乙,公钥加密会非常轻松地校验身份。符号数据 key意味着数据已经使用密码加密或解密。假如甲想校验乙的身份。乙有一对密码,一个是公开的,另一个是私有的。乙透露给甲他的公钥。甲产生一个随机信息发送给乙。甲乙:random-message乙使用他的私钥加密消息,返回甲加密后的消息。 乙甲:random-message乙的私钥甲收到这个消息然后使用乙的以前公开过的公钥解密。他比较解密后的消息与他原先发给乙的消息。如果它们完全一致,就会知道在与乙说话。任意一个中间人不会知道乙的私钥,也不能正确加密甲检查的随机消息。除非你清楚知道你加密的消息。用私
14、钥加密消息,然后发送给其他人不是一个好主意。因为加密值可能被用来对付你,需要注意的是:因为只有你才有私钥,所以只有你才能加密消息。所以,代替加密甲发来的原始消息,乙创建了一个信息段并且加密。信息段取自随机消息(random-message)并具有以下有用的特性:1. 这个信息段难以还原。任何人即使伪装成乙,也不能从信息段中得到原始消息;2. 假冒者将发现不同的消息计算出相同的信息段值;3. 使用信息段,乙能够保护自己。他计算甲发出的随机信息段,并且加密结果,并发送加密信息段返回甲。甲能够计算出相同的信息段并且解密乙的消息认证乙。这个技术仅仅描绘了数字签名。通过加密甲产生的随机消息,乙已经在甲产
15、生的消息签名。因此我们的认证协议还需要一次加密。一些消息由乙产生:你好,你是乙么?乙甲:甲,我是乙信息段甲,我是乙 乙的私钥当你使用这个协议,乙知道他发送给乙的消息,他不介意在上面签名。他先发送不加密的信息,甲,我是乙。,然后发送信息段加密的消息版本。甲可以非常方便地校验乙就是乙,同时,乙还没有在他不想要的信息上签名。提交公钥那么,乙怎样以可信的方式提交他的公钥呢?看看认证协议如下所示:你好嗨,我是乙,乙的公钥prove it甲,我是乙 信息段甲,我是乙 乙的私钥在这个协议下,任何人都能够成为乙。所有你所要的只是公钥和私钥。你发送给甲说你就是乙,这样你的公钥就代替了乙的密码。然后,你发送用你的
16、私钥加密的消息,证明你的身份。甲却不能发觉你并不是乙。为了解决这个问题,标准组织已经发明了证书。一个证书有以下的内容:* 证书的发行者姓名* 发行证书的组织* 标题的公钥* 邮戳证书使用发行者的私钥加密。每一个人都知道证书发行者的公钥(这样,每个证书的发行者拥有一个证书)。证书是一个把公钥与姓名绑定的协议。通过使用证书技术,每一个人都可以检查乙的证书,判断是否被假冒。假设乙控制好他的私钥,并且他确实是得到证书的乙,就万事大吉了。这些是修订后的协议:嗨,我是乙,乙的校验甲,我是乙 信息段甲, 我是乙 乙的私钥现在当甲收到乙的第一个消息,他能检查证书,签名(如上所述,使用信息段和公钥解密),然后检
17、查标题(乙的姓名),确定是乙。他就能相信公钥就是乙的公钥和要求乙证明自己的身份。乙通过上面的过程,制作一个信息段,用一个签名版本答复甲。甲可以校验乙的信息段通过使用从证书上得到的公钥并检查结果。如果一个黑客,叫H甲H:H不能建立一个令甲相信的从乙的消息。交换密码(secret)一旦甲已经验证乙后,他可以发送给乙一个只有乙可以解密、阅读的消息:secret乙的公钥唯一找到密码的方法只有使用乙的私钥解码上述的信息。交换密码是另一个有效使用密码加密的方法。即使在甲和乙之间的通讯被侦听,只有乙才能得到密码。使用密码作为另一个secret-key增强了网络的安全性,但是这次这是一个对称的加密算法(例如D
18、ES、RC4、IDE甲)。因为甲在发送给乙之前产生了密码,所以甲知道密码。乙知道密码因为乙有私钥,能够解密甲的信息。但他们都知道密码,他们都能够初始化一个对称密码算法,而且开始发送加密后的信息。这儿是修定后的协议:甲,我是乙 信息段甲,我是乙 乙的私钥ok 乙,here is a secret secret乙的公钥some messagesecret-key黑客窃听那么如果有一个恶意的黑客H在甲和乙中间,虽然不能发现甲和乙已经交换的密码,但能干扰他们的交谈。他可以放过大部分信息,选择破坏一定的信息(这是非常简单的,因为他知道甲和乙通话采用的协议)。H乙:乙H:H甲:ok 乙,here is a
19、 secret secret 乙的公钥Garblesome messagesecret-key H忽略一些数据不修改,直到甲和乙交换密码。然后H干扰乙给甲的信息。在这一点上,甲相信乙,所以他可能相信已经被干扰的消息并且尽力解密。需要注意的是,H不知道密码,他所能做的就是毁坏使用秘钥加密后的数据。基于协议,H可能不能产生一个有效的消息。但下一次呢?为了阻止这种破坏,甲和乙在他们的协议中产生一个校验码消息(message authentication code)。一个校验码消息(MAC)是一部分由密码和一些传输消息产生的数据。信息段算法描述的上述特性正是它们抵御H的功能:MAC= Digestso
20、me message,secret 因为H不知道密码,他不能得出正确的值。即使H随机干扰消息,只要数据量大,他成功的机会微乎其微。例如,使用HD5(一个RSA发明的好的加密算法),甲和乙能够发送128位MAC值和他们的消息。H猜测正确的MAC的几率将近1/18,446,744,073,709,551,616约等于零。这是又一次修改后的协议:some message,MACsecret-key现在H已经无技可施了。他干扰了得到的所有消息,但MAC计算机能够发现他。甲和乙能够发现伪造的MAC值并且停止交谈。H不再能与乙通讯。OpenSSL FAQ参考资料: bird.org/linux_serve
21、r/0360apache.php#www_ssl_files20.5 建立连线加密网站 (https) 及防砍站脚本从本章一开始的 20.1 就谈过 http 这个通讯协定是明码传送资料,而那个 https 才是加密传输的!那加密的方法是透过 SSL 啊,这个 SSL 就是以 openssl 软体来提供的一个加密函式库。更多与 https 有关的资讯,请参考 20.1.4 吧!20.5.1 SSL 所需软体与凭证档案及预设的 https要达成让 apache 支援 https 协定的话,你必须要有 mod_ssl 这个软体才行!请先自行使用 yum 去装好这个软体吧! 同时,我们的 CentO
22、S 5.x 也已经预设提供了 SSL 机制所需要的私钥与凭证档案罗!相关软体提供的档案如下: /etc/httpd/conf.d/ssl.conf:mode_ssl 提供的 Apache 设定档; /etc/pki/tls/private/localhost.key:系统私钥档,可以用来制作凭证的! /etc/pki/tls/certs/localhost.crt:就是加密过的凭证档!(signed certificate) 图 20.5-1、在 firefox 底下看到的 SSL 安全问题图示就如同本章 20.1.4 谈到的,因为我们这个 Apache 网站并没有将此凭证向 CA 注册,因此
23、就会出现上述的讯息了! 这就类似 ssh 连线时,系统需要你输入 yes 是一样的啦!要接受凭证後才能够进行加密的功能。所以,请点选上图中的箭头 1,此时就会延伸出箭头 2 的位置,按下去吧!然後就会出现如下所示:图 20.5-2、在 firefox 底下接受一把私有的凭证所需要的流程如果你确定这个网站是你自己的可信任网站,那就按下 1 及 2 的箭头处!如果还想要看一下这个网站所提供的相关凭证内容, 就按下 3 箭头的地方:图 20.5-3、在 firefox 底下观察凭证的详细内容20.5.2 拥有自制凭证的 https建立凭证档预设的凭证虽然已经可以让你顺利的使用 https 了,不过,
24、凭证的有效日仅有 1 年而已实在讨厌 所以,我们还是得要自制凭证才行这个凭证的制作仅是私有 WWW 网站的用途,并没有要拿去 CA 注册喔! 那麽自制凭证需要什麽步骤呢?基本上需要的流程是:1. 先建立一把 private key 预备提供给 SSL 凭证签章要求所用;2. 最後建立 SSL 凭证 (test certificates)。那麽建立凭证有没有很困难呢?没有啦!因为 CentOS 5.x 已经帮我们写好了 Makefile 了!你先到 /etc/pki/tls/certs 这个目录下,然後直接输入 make 这个指令,就能够看到所有可行的目标动作!我们就可以很快速的建置好凭证喔!
25、不过,因为预设的私钥档需要加上密码才能够进行建立,所以我们还得要额外进行一下动作就是了。好! 现在假设我们要建立的是名为 vbird 的凭证!那麽底下流程中,所有的关键字就是 vbird!简单流程如下所示:这样就建立好凭证档了!接下来就是得要去处理 ssl.conf 这个设定内容喔!另外,这把凭证依旧只能使用 1 年!如果你想要建立十年的凭证,那就得要修改一下 Makefile 里面的内容,将 365 改成 3650 即可!Tips:如果你曾经多次重复进行上述的建立凭证动作,会发现到同一个凭证内容若制作多次,则最终用户端浏览器会出现一些错误讯息, 导致无法连线!因此,建议多加一个序号 (SER
26、IAL) 的参数,可以修订这个错误喔!修改 ssl.conf 的内容,使用自制凭证修改 ssl.conf 的内容也是很简单!只要修改两个地方,亦即是档案档名的地方即可!图 20.5-4、检查凭证的详细内容!20.5.3 将加密首页与非加密首页分离 一般明码传输的网页首页不要变更;所以我们得先要设定 /var/www/https 目录才行!然後,只要修改 ssl.conf 档案内容即可!整个过程可以这样处理:大部分都使用预设值,就是 DocumentRoot 以及 ServerName 需要留意就是了。如此一来,我们就将 https, http 两个完整的分开,你的重要资料需要加密的,终於有个可
27、靠的地方摆放罗!_20.5.4 防砍站软体几个比较知名的网站管理员大概都有这样的困扰,那就是网站常被砍站软体所强力下载,结果造成主机的 CPU loading 过重,最後竟然会导致死掉唉!真是的人怕出名猪怕肥呐!先来解释一下什麽是砍站吧!所谓的砍站,就是以类似多点连线下载的持续性讯息传递软体进行网站资料的下载,而且, 一启用该软体,该软体就将整个网站的内容都给他 download 下来,很厉害吧!没错!是很厉害,但是却也害死人了怎麽说呢?因为这种软体常常会为了加快 download 的速度,所以采用多点连线的方式,也就是会持续不断的向 Server 发出要求封包,而由於这些封包并不见得能够成功的让 Server 把资料传导给 Client 端,常常会无法投递就是啦!这样的结果就是.造成 Server
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1