ssl加密的方法Word格式.docx
《ssl加密的方法Word格式.docx》由会员分享,可在线阅读,更多相关《ssl加密的方法Word格式.docx(19页珍藏版)》请在冰豆网上搜索。
加密过的数据可以公开地传送。
2.数据的一致性
加密也能保证数据的一致性。
例如:
消息验证码(MAC),能够校验用户提供的加密信息,接收者可
以用MAC来校验加密数据,保证数据在传输过程中没有被篡改过。
3.安全验证
加密的另外一个用途是用来作为个人的标识,用户的密匙可以作为他的安全验证的标识。
SSL是利用公开密钥的加密技术(RSA)来作为用户端与服务器端在传送机密资料时的加密通讯协定。
目前,大部分的Web服务器及浏览器都广泛支持SSL技术。
当浏览器试图连接一个具有SSL认证加
密的服务器时,就会唤醒一个SSL会话,浏览器检查认证,必须具备下面三个条件:
1)有一个权威机构发放证书,当然可以创建自我签订的证书(x509结构)。
2)证书不能过期。
3)证书是属于它所连接的服务器的。
只有全部具备了这三个条件,浏览器才能成功完成认证。
通过这三个条件,用户能确认其浏览器连接
到正确的服务器,而不是连接到一些想盗取用户密码等重要信息的虚假的服务器上。
在当今的电子商务中还有一项被广泛使用的安全协议是SET协议。
SET(SecureElectronicTransaction,
安全电子交易)协议是由VISA和MasterCard两大信用卡公司于1997年5月联合推出的规范。
SET能在电
子交易环节上提供更大的信任度、更完整的交易信息、更高的安全性和更少受欺诈的可能性。
SET交
易分三个阶段进行:
用户向商家购物并确定支付;
商家与银行核实;
银行向商家支付货款。
每个阶段都
涉及到RSA对数据加密,以及RSA数字签名。
使用SET协议,在一次交易中,要完成多次加密与解密操作,
故有很高的安全性,但SET协议比SSL协议复杂,商家和银行都需要改造系统以实现互操作。
在Linux下,比较流行支持SSL认证的是OpenSSL服务器。
OpenSSL项目是一个合作的项目,开发一个
健壮的、商业等级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层
(SecureSocketsLayer,SSLv2/v3)和传输层的安全性(TransportLayerSecurity,TLSv1)。
这个项目是由全世界的志愿者管理和开发OpenSSL工具包和相关文档。
如何在Linux下配置OpenSSL服务器,首先从OpenSSL的主页()上下载
并可以使用自我签订的证书做认证,关于如何编译、安装OpenSSL服务器,可以参考一下OpenSSLHOWTO
文档。
SSL程序设计初步介绍
SSL通讯模型为标准的C/S结构,除了在TCP层之上进行传输之外,与一般的通讯没有什么明显的区
别。
在这里,我们主要介绍如何使用OpenSSL进行安全通讯的程序设计。
关于OpenSSL的一些详细的信
息请参考OpenSSL的官方主页。
在使用OpenSSL前,必须先对OpenSSL进行初始化,以下的三个函数任选其一:
SSL_library_init(void);
OpenSSL_add_ssl_algorithms();
SSLeay_add_ssl_algorithms();
事实上后面的两个函数只是第一个函数的宏。
如果要使用OpenSSL的出错信息,使用SSL_load_error_strings(void)进行错误信息的初始化。
以后
可以使用voidERR_print_errors_fp(FILE*fp)打印SSL的错误信息。
一次SSL连接会话一般要先申请一个SSL环境,基本的过程是:
1.SSL_METHOD*meth=TLSv1_client_method();
创建本次会话连接所使用的协议,如果是客户端可
以使用
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(void);
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握手阶段证书的验证方式和加载自己
的证书。
voidSSL_CTX_set_verify(SSL_CTX*,int,int*(int,X509_STORE_CTX*))
设置证书验证的方式。
第一个参数是当前的CTX指针,第二个是验证方式,如果是要验证对方的话,就使用
SSL_VERIFY_PEER。
不需要的话,使用SSL_VERIFY_NONE.一般情况下,客户端需要验证对方,而
服务器不需要。
第三个参数是处理验证的回调函数,如果没有特殊的需要,使用空指针就可以了。
voidSSL_CTX_load_verify_locations(SSL_CTX*,constchar*,constchar*);
加载证书;
第一个参数同上,参数二是证书文件的名称,参数三是证书文件的路径;
intSSL_CTX_use_certificate_file(SSL_CTX*ctx,constchar*file,inttype);
加载本地的证书;
type指明证书文件的结构类型;
失败返回-1
intSSL_CTX_use_PrivateKey_file(SSL_CTX*ctx,constchar*file,inttype);
加载自己的私钥;
type参数指明私钥文件的结构类型;
加载了证书和文件之后,就可以验证私钥和证书是否相符:
BOOlSSL_CTX_check_private_key(SSL_CTX*);
3.既然SSL使用TCP协议,当然需要把SSLattach到已经连接的套接字上了:
SSL*SSL_new(SSL_CTX*);
申请一个SSL套节字;
intSSL_set_rfd(SSL*);
绑定只读套接字
intSSL_set_wfd(SSL*);
绑定只写套接字
intSSL_set_fd(SSL*);
绑定读写套接字
绑定成功返回1,失败返回0;
4.接下来就是SSL握手的动作了
intSSL_connect(SSL*);
失败返回-1
5.握手成功之后,就可以进行通讯了,使用SSL_read和SS_write读写SSL套接字代替传统的
read、write
intSSL_read(SSL*ssl,char*buf,intnum);
intSSL_write(SSL*ssl,char*buf,intnum);
如果是服务器,则使用SSL_accept代替传统的accept调用
intSSL_accept(SSL*ssl);
6.通讯结束,需要释放前面申请的SSL资源
intSSL_shutdown(SSL*ssl);
关闭SSL套接字;
voidSSL_free(ssl);
释放SSL套接字;
voidSSL_CTX_free(ctx);
释放SSL环境;
册都没有完成。
所以,本文紧紧是讲述了使用OpenSSL进行程序设计的框架。
更加详细的资
料可以参考OpenSSL的文档或者Apachemod_ssl的文档。
通过以上的介绍,我想读者对SSL协议已经有了一定的了解,作者有机会将会继续给大家介绍
SSL协议的其他方面的内容。
SSL原理解密
本文出自:
范晓明
RSA公钥加密在计算机产业中被广泛使用在认证和加密。
可以从RSADataSecurityInc.获得的RSA公钥加密许可证。
公钥加密是使用一对非对称的密码加密或解密的方法。
每一对密码由公钥和私钥组成。
公钥被广泛发布。
私钥是隐密的,不公开。
用公钥加密的数据只能够被私钥解密。
反过来,使用私钥加密的数据只能用公钥解密。
这个非对称的特性使得公钥加密很有用。
使用公钥加密法认证
认证是一个身份认证的过程。
在下列例子中包括甲和乙,公钥加密会非常轻松地校验身份。
符号{数据}key意味着"
数据"
已经使用密码加密或解密。
假如甲想校验乙的身份。
乙有一对密码,一个是公开的,另一个是私有的。
乙透露给甲他的公钥。
甲产生一个随机信息发送给乙。
甲——〉乙:
random-message
乙使用他的私钥加密消息,返回甲加密后的消息。
乙——〉甲:
{random-message}乙的私钥
甲收到这个消息然后使用乙的以前公开过的公钥解密。
他比较解密后的消息与他原先发给乙的消息。
如果它们完全一致,就会知道在与乙说话。
任意一个中间人不会知道乙的私钥,也不能正确加密甲检查的随机消息。
除非你清楚知道你加密的消息。
用私钥加密消息,然后发送给其他人不是一个好主意。
因为加密值可能被用来对付你,需要注意的是:
因为只有你才有私钥,所以只有你才能加密消息。
所以,代替加密甲发来的原始消息,乙创建了一个信息段并且加密。
信息段取自随机消息(random-message)并具有以下有用的特性:
1.这个信息段难以还原。
任何人即使伪装成乙,也不能从信息段中得到原始消息;
2.假冒者将发现不同的消息计算出相同的信息段值;
3.使用信息段,乙能够保护自己。
他计算甲发出的随机信息段,并且加密结果,并发送加密信息段返回甲。
甲能够计算出相同的信息段并且解密乙的消息认证乙。
这个技术仅仅描绘了数字签名。
通过加密甲产生的随机消息,乙已经在甲产生的消息签名。
因此我们的认证协议还需要一次加密。
一些消息由乙产生:
你好,你是乙么?
乙——〉甲:
甲,我是乙
{信息段[甲,我是乙]}乙的私钥
当你使用这个协议,乙知道他发送给乙的消息,他不介意在上面签名。
他先发送不加密的信息,"
甲,我是乙。
"
,然后发送信息段加密的消息版本。
甲可以非常方便地校验乙就是乙,同时,乙还没有在他不想要的信息上签名。
提交公钥
那么,乙怎样以可信的方式提交他的公钥呢?
看看认证协议如下所示:
你好
嗨,我是乙,乙的公钥
proveit
甲,我是乙{信息段[甲,我是乙]}乙的私钥
在这个协议下,任何人都能够成为"
乙"
。
所有你所要的只是公钥和私钥。
你发送给甲说你就是乙,这样你的公钥就代替了乙的密码。
然后,你发送用你的私钥加密的消息,证明你的身份。
甲却不能发觉你并不是乙。
为了解决这个问题,标准组织已经发明了证书。
一个证书有以下的内容:
*证书的发行者姓名
*发行证书的组织
*标题的公钥
*邮戳
证书使用发行者的私钥加密。
每一个人都知道证书发行者的公钥(这样,每个证书的发行者拥有一个证书)。
证书是一个把公钥与姓名绑定的协议。
通过使用证书技术,每一个人都可以检查乙的证书,判断是否被假冒。
假设乙控制好他的私钥,并且他确实是得到证书的乙,就万事大吉了。
这些是修订后的协议:
嗨,我是乙,乙的校验
甲,我是乙{信息段[甲,我是乙]}乙的私钥
现在当甲收到乙的第一个消息,他能检查证书,签名(如上所述,使用信息段和公钥解密),然后检查标题(乙的姓名),确定是乙。
他就能相信公钥就是乙的公钥和要求乙证明自己的身份。
乙通过上面的过程,制作一个信息段,用一个签名版本答复甲。
甲可以校验乙的信息段通过使用从证书上得到的公钥并检查结果。
如果一个黑客,叫H
甲——〉H:
H——〉不能建立一个令甲相信的从乙的消息。
交换密码(secret)
一旦甲已经验证乙后,他可以发送给乙一个只有乙可以解密、阅读的消息:
{secret}乙的公钥
唯一找到密码的方法只有使用乙的私钥解码上述的信息。
交换密码是另一个有效使用密码加密的方法。
即使在甲和乙之间的通讯被侦听,只有乙才能得到密码。
使用密码作为另一个secret-key增强了网络的安全性,但是这次这是一个对称的加密算法(例如DES、RC4、IDE甲)。
因为甲在发送给乙之前产生了密码,所以甲知道密码。
乙知道密码因为乙有私钥,能够解密甲的信息。
但他们都知道密码,他们都能够初始化一个对称密码算法,而且开始发送加密后的信息。
这儿是修定后的协议:
甲,我是乙{信息段[甲,我是乙]}乙的私钥
ok乙,hereisasecret{secret}乙的公钥
{somemessage}secret-key
黑客窃听
那么如果有一个恶意的黑客H在甲和乙中间,虽然不能发现甲和乙已经交换的密码,但能干扰他们的交谈。
他可以放过大部分信息,选择破坏一定的信息(这是非常简单的,因为他知道甲和乙通话采用的协议)。
H——〉乙:
乙——〉H:
H——〉甲:
ok乙,hereisasecret{secret}乙的公钥
Garble[{somemessage}secret-key]
H忽略一些数据不修改,直到甲和乙交换密码。
然后H干扰乙给甲的信息。
在这一点上,甲相信乙,所以他可能相信已经被干扰的消息并且尽力解密。
需要注意的是,H不知道密码,他所能做的就是毁坏使用秘钥加密后的数据。
基于协议,H可能不能产生一个有效的消息。
但下一次呢?
为了阻止这种破坏,甲和乙在他们的协议中产生一个校验码消息(messageauthenticationcode)。
一个校验码消息(MAC)是一部分由密码和一些传输消息产生的数据。
信息段算法描述的上述特性正是它们抵御H的功能:
MAC=Digest[somemessage,secret]
因为H不知道密码,他不能得出正确的值。
即使H随机干扰消息,只要数据量大,他成功的机会微乎其微。
例如,使用HD5(一个RSA发明的好的加密算法),甲和乙能够发送128位MAC值和他们的消息。
H猜测正确的MAC的几率将近1/18,446,744,073,709,551,616约等于零。
这是又一次修改后的协议:
{somemessage,MAC}secret-key
现在H已经无技可施了。
他干扰了得到的所有消息,但MAC计算机能够发现他。
甲和乙能够发现伪造的MAC值并且停止交谈。
H不再能与乙通讯。
OpenSSLFAQ
参考资料:
bird.org/linux_server/0360apache.php#www_ssl_files
20.5建立连线加密网站(https)及防砍站脚本
从本章一开始的20.1就谈过http这个通讯协定是明码传送资料,而那个https才是加密传输的!
那加密的方法是透过SSL啊,这个SSL就是以openssl软体来提供的一个加密函式库。
更多与https有关的资讯,请参考20.1.4吧!
20.5.1SSL所需软体与凭证档案及预设的https
要达成让apache支援https协定的话,你必须要有mod_ssl这个软体才行!
请先自行使用yum去装好这个软体吧!
同时,我们的CentOS5.x也已经预设提供了SSL机制所需要的私钥与凭证档案罗!
相关软体提供的档案如下:
∙/etc/httpd/conf.d/ssl.conf:
mode_ssl提供的Apache设定档;
∙/etc/pki/tls/private/localhost.key:
系统私钥档,可以用来制作凭证的!
∙/etc/pki/tls/certs/localhost.crt:
就是加密过的凭证档!
(signedcertificate)
图20.5-1、在firefox底下看到的SSL安全问题图示
就如同本章20.1.4谈到的,因为我们这个Apache网站并没有将此凭证向CA注册,因此就会出现上述的讯息了!
这就类似ssh连线时,系统需要你输入『yes』是一样的啦!
要接受凭证後才能够进行加密的功能。
所以,请点选上图中的箭头1,此时就会延伸出箭头2的位置,按下去吧!
然後就会出现如下所示:
图20.5-2、在firefox底下接受一把私有的凭证所需要的流程
如果你确定这个网站是你自己的可信任网站,那就按下1及2的箭头处!
如果还想要看一下这个网站所提供的相关凭证内容,就按下3箭头的地方:
图20.5-3、在firefox底下观察凭证的详细内容
20.5.2拥有自制凭证的https
建立凭证档
预设的凭证虽然已经可以让你顺利的使用https了,不过,凭证的有效日仅有1年而已~实在讨厌~所以,我们还是得要自制凭证才行~这个凭证的制作仅是私有WWW网站的用途,并没有要拿去CA注册喔!
那麽自制凭证需要什麽步骤呢?
基本上需要的流程是:
1.先建立一把privatekey预备提供给SSL凭证签章要求所用;
2.最後建立SSL凭证(testcertificates)。
那麽建立凭证有没有很困难呢?
没有啦!
因为CentOS5.x已经帮我们写好了Makefile了!
你先到/etc/pki/tls/certs这个目录下,然後直接输入make这个指令,就能够看到所有可行的目标动作!
我们就可以很快速的建置好凭证喔!
不过,因为预设的私钥档需要加上密码才能够进行建立,所以我们还得要额外进行一下动作就是了。
好!
现在假设我们要建立的是名为vbird的凭证!
那麽底下流程中,所有的关键字就是vbird!
简单流程如下所示:
这样就建立好凭证档了!
接下来就是得要去处理ssl.conf这个设定内容喔!
另外,这把凭证依旧只能使用1年!
如果你想要建立十年的凭证,那就得要修改一下Makefile里面的内容,将365改成3650即可!
Tips:
如果你曾经多次重复进行上述的建立凭证动作,会发现到同一个凭证内容若制作多次,则最终用户端浏览器会出现一些错误讯息,导致无法连线!
因此,建议多加一个序号(SERIAL)的参数,可以修订这个错误喔!
修改ssl.conf的内容,使用自制凭证
修改ssl.conf的内容也是很简单!
只要修改两个地方,亦即是档案档名的地方即可!
图20.5-4、检查凭证的详细内容!
20.5.3将加密首页与非加密首页分离
∙一般明码传输的网页首页不要变更;
所以我们得先要设定/var/www/https目录才行!
然後,只要修改ssl.conf档案内容即可!
整个过程可以这样处理:
大部分都使用预设值,就是DocumentRoot以及ServerName需要留意就是了。
如此一来,我们就将https,http两个完整的分开,你的重要资料需要加密的,终於有个可靠的地方摆放罗!
^_^
20.5.4防砍站软体
几个比较知名的网站管理员大概都有这样的困扰,那就是网站常被砍站软体所强力下载,结果造成主机的CPUloading过重,最後竟然会导致死掉~唉!
真是的~人怕出名猪怕肥呐!
先来解释一下什麽是砍站吧!
所谓的『砍站』,就是以类似多点连线下载的持续性讯息传递软体进行网站资料的下载,而且,一启用该软体,该软体就将『整个网站』的内容都给他download下来,很厉害吧!
没错!
是很厉害,但是却也害死人了~怎麽说呢?
因为这种软体常常会为了加快download的速度,所以采用多点连线的方式,也就是会持续不断的向Server发出要求封包,而由於这些封包并不见得能够成功的让Server把资料传导给Client端,常常会无法投递就是啦!
这样的结果就是...造成Server