Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1738553
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-06-05 17:54:38

加密技术

加密算法(Cryptographic Algorithm)有两类:

协议加密(Conventional cryptographic):也称对称(symmetric)加密。发送者和接收者共享一个密钥,用来加密和解密。

公钥加密(Public key cryptographic):也称不对称加密。用户有两个密钥,任何一个都可以用来加密。如果其中一个用来加密,那必须用另一个来解密。如此就可以把一 个密钥公开,而秘密保存另一个。任何人都可以通过公钥来加密信息,但只有私钥的主人才能读取它。


虽然发送的消息被加密,但仍有可能某人修改原始消息,并用其它消息代替它,比如向错误的帐号汇款。解决方法是为发送的消息创建一个汇总,一同发送给 接收方。接收方收到消息时,也创建它自己的汇总。如果两个汇总相同,就说明发送方的消息没有被篡改。这样的汇总称为消息摘要(message digests)、单向函数或哈希函数。消息摘要为更长的可变长度的消息创建一个更小的固定长度的消息。摘要算法为每个消息创建唯一的摘要。理论上不可能 找到两条不同的但有相同摘要的消息,同时在实践中也极难从摘要确定消息的内容。


我们必须确保消息摘要要安全地发送。一种方式是使用数字签名。通过发送者的密钥加密消息摘要和其它信息(比如序列号),创建数字签名。尽管任何人都可以用公钥解密这个签名,但只有发送者才能为这个消息签名。这样其它人就无法修改摘要并同时为它签名。


证书

虽然客户可以发送私密消息给网站,为它签名并保证它的完整性,但他仍然要确保和他通信的网站确实是真实可靠的。也就是说他所使用的公钥是网站密钥对 的一部分,而不是其他人的。为此需要认证机构(Certificate Authorities,CA)来颁发把公钥与真实个体(比如网站)关联的证书。任何被信任的代理都可以作为认证机构。


在授予证书前,通过验证认证请求的信息,认证机构必须确保自己是密钥对里的私钥的主人。例如,当有人申请个人证书时,认证机构首先必须确认那个人确实和他所声明的身份一致。


认证机构可以为另一个认证机构颁发证书,这称为认证链。当检查证书时,我们可能需要检查证书的颁发者。沿着链一直找到自己信任的为止。


证书可以由自己颁发给自己,这样的称为顶级认证机构,有许多公司都建立了自己的CA。


认证机构不仅负责颁发证书,它还需要负责证书的管理和废除。


安全套接字层(Secure Sockets Layer,SSL)

SSL在TCP和应用层之间,提供客户端和服务器端的安全交流。它允许彼此认证、为完整性而对数字签名的使用、以及为隐私的加密。SSL目前最新版本为SSL3.0。


SSL会话可以通过客户端和服务器端的握手过程来建立。根据服务器的配置,这个过程可以是向客户提供或索取一个证书。一旦SSL会话建立,它可以被重用以减少开销。服务器赋给每个会话一个唯一的会话ID,缓存在服务器里,客户之后的连接都可以使用它以减少握手时间,直到会话过期。


握手的过程为:

1、协商传输数据所使用的加密套件(suit);

2、在客户端和服务器端之间建立并共享会话密钥;

3、服务器可选地向客户认证;

4、客户可选地向服务器认证;


SSL3.0定义了31种加密套件。一个加密套件由以下几个组件构成:

1、密钥交换方法;

2、数据传输的加密;

3、为了创建消息认证代码(Message Authentication Code,MAC)的消息摘要。


握手过程使用了三个协议:

1、SSL握手协议:建立客户和服务器的会话;

2、SSL Change Cipher Spec协议:在加密套件上达成共识;

3、SSL Alert协议:在客户和服务器之间传输错误消息。


https是SSL的一种普遍使用方式。


基本配置

Listen 443

    ServerName
    SSLEngine on
    SSLCertificateFile /path/to/.cert
    SSLCertificateKeyFile /path/to/.key


加密套件以及强制强安全

创建一个只接受强加密的SSL服务器:

SSLCipherSuite HIGH:!aNULL:!MD5

指定特定的速度优化的加密:

SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5
SSLHonorCipherOrder on


接受所有通用加密类型,但对特定URL的访问需要强加密:

# be liberal in general
SSLCipherSuite ALL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:+LOW:+EXP:+eNULL


# but and below
# requires strong ciphers
SSLCipherSuite HIGH:!aNULL:!MD5


客户认证和访问控制

强制客户使用证书认证:

# require a client certificate which has to be directly
# signed by our CA certificate in ca.crt
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile conf/ssl.crt/ca.crt


对特定URL强制客户使用证书认证,但允许用户随意访问其它URL:

SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt


SSLVerifyClient require
SSLVerifyDepth 1


只允许有证书的官户访问特定URL,但允许所有用户访问服务器的其它部分:

SSLVerifyClient      none

    SSLVerifyClient      require
    SSLVerifyDepth       5
    SSLCACertificateFile conf/ssl.crt/ca.crt
    SSLCACertificatePath conf/ssl.crt
    SSLOptions           +FakeBasicAuth
    SSLRequireSSL
    AuthName             "Snake Oil Authentication"
    AuthType             Basic
    AuthBasicProvider    file
    AuthUserFile         /usr/local/apache2/conf/httpd.passwd
    Require              valid-user


上述的httpd.password由DES加密,内容为:
/C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA
/C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA
/C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA



https服务器的配置

apache2的工具a2enmod可以启用模块。运行命令:

a2enmod ssl

启用ssl模块,你可以在/etc/apache2/mods-enabled/下找到ssl。

重启apache令其生效。netstat -l命令可以发现https端口已经被兼听。


创建私钥(使用Triple-DES加密的1024位的私钥,以PEM存储从而是ASCII可读的):

openssl genrsa -des3 -out server.key 1024

输出:

Generating RSA private key, 1024 bit long modulus
...++++++
.......................++++++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:


创建CSR (Certificate Signing Request):

openssl req -new -key server.key -out server.csr

输出:

Enter pass phrase for server.key:
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) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Tommy
Organizational Unit Name (eg, section) []:Tommy Sub
Common Name (e.g. server FQDN or YOUR name) []:Tommy
Email Address []:tommy_zalent@hotmail.com


Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:Yt


产生自签名的证书

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

输出:

Signature ok
subject=/C=CN/ST=Shanghai/L=Shanghai/O=Tommy/OU=Tommy Sub/CN=Tommy/emailAddress=tommy_zalent@hotmail.com
Getting Private key
Enter pass phrase for server.key:


安装证书

sudo mkdir /etc/apache2/conf/ssl.crt
sudo mkdir /etc/apache2/conf/ssl.key
sudo cp server.crt /etc/apache2/conf/ssl.crt/
sudo cp server.key /etc/apache2/conf/ssl.key/


修改虚拟主机


    SSLEngine on
    SSLCertificateFile /etc/apache2/conf/ssl.crt/server.crt
    SSLCertificateKeyFile /etc/apache2/conf/ssl.key/server.key

    ......


重启apache2。用浏览器打开,可以看到

“该网站的安全证书不受信任!”

的信息,这是由于证书是自签名的原因。点“仍然继续”,可以正常浏览网站。


由于每次启动apache都要输入密码,所以我们可以去掉密码

tommy:~$ cp server.key server.key.org
tommy:~$ openssl rsa -in server.key.org -out server.key

重新签名证书:

tommy:~$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=Shanghai/L=Shanghai/O=Tommy/OU=Tommy Sub/CN=Tommy/emailAddress=tommy_zalent@hotmail.com
Getting Private key

重新安装:

tommy:~$ sudo cp server.key /etc/apache2/conf/ssl.key/
tommy:~$ sudo cp server.crt /etc/apache2/conf/ssl.crt/

重启apache:
tommy:~$ sudo apache2ctl restart

为了获得受信任的证书,需要向某些网站申请,可能需要付费。

阅读(1321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~