ssl

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

SSL (Secure Socket Layer)

为Netscape所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape浏览器即可支持SSL。

当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器;

2)加密数据以防止数据中途被窃取;

3)维护数据的完整性,确保数据在传输过程中不被改变。

SSL协议的工作流程:

服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和 MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准

sasl

SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。在Postfix可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。

SASL提供了一个通用的方法为基于连接的协议增加验证支持,而XMPP使用了一个普通的XML名字空间来满足SASL的需要。

1.如果SASL协商发生在两台服务器之间,除非服务器宣称的DNS主机名得到解析,不能(MUST NOT)进行通信。

2.如果初始化实体有能力使用SASL 协商, 它必须(MUST)在初始化流的头信息中包含一个值为"1.0"的属性'version'。

3.如果接收实体有能力使用SASL协商, 它必须(MUST)在应答从初始化实体收到的打开流标签时(如果打开的流标签包含一个值为"1.0"的'version'属性),通过 'urn:ietf:params:xml:ns:xmpp-sasl'名字空间中的<mechanisms/>元素声明一个或多个验证机制.

4.当SASL 协商时, 一个实体不能(MUST NOT)在流的根元素中发送任何空格符号(匹配production [3] content of [XML])作为元素之间的分隔符(在以下的SASL例子中任何空格符号的出现仅仅是为了增加可读性); 这条禁令帮助确保安全层字节的精确度。

5.当SASL握手时,在XML元素中使用的任何XML 字符数据必须被编码成base64, 编码遵循RFC 3548 第三章的规定。

6.如果一个 简单名字"simple username" 规范被选定的SASL机制所支持,(比如, 这被DIGEST-MD5 和CRAM-MD5 机制支持但不被EXTERNAL 和GSSAPI 机制支持), 验证的时候初始化实体应该(SHOULD)在服务器间通信时提供简单名字 自身的发送域(IP地址或包含在一个域标识符中的域名全称),在客户端与服务器之间通信时提供注册用户名(包含在一个XMPP节点标识符中的用户或节点名)。

7.如果初始化实体希望以另一个实体的身份出现并且SASL机制支持授权ID的传输,初始化实体在SASL握手时必须(MUST)提供一个授权ID。如果初始化实体不希望以另一个实体的身份出现,初始化实体在SASL握手时不能(MUST NOT)提供一个授权ID。在[SASL] 的定义中,除非授权ID不同于从验证ID(详见[SASL])中得到的缺省的授权ID,初始化实体不能(MUST NOT)提供授权ID。如果提供了,这个授权ID的值必须(MUST)是<domain>的格式(对于服务器来说) 或<node@domain>的格式(对于客户端来说).

8.在成功进行包括安全层的SASL握手之后,接收实体必须(MUST)丢弃任何从初始化实体得到的而不是从SASL协商本身获得的信息。

9.在成功进行包括安全层的SASL握手之后,初始化实体必须(MUST)丢弃任何从接收实体得到的而不是从SASL协商本身获得的信息。

10.参看 强制执行的技术,了解关于必须(MUST)支持的机制.


案例:

Sendmail 的加密(ssl)与验证(sasl)_sendmail



创建账户:

useradd bj

echo “123” |passwd –stdin bj

修改hosts:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_02

Sendmail 的加密(ssl)与验证(sasl)_sendmail_03

修改主机名:

vim /etc/sysconfig/network

Sendmail 的加密(ssl)与验证(sasl)_linux_04


sendmail

rpm –ivh sendmil-cf

cd /etc/mail/

vim sendmil.mc 更改为:addr=0.0.0.0

Sendmail 的加密(ssl)与验证(sasl)_sendmail_05

vim accesss

Connect:localhost.localdomain RELAY
Connect:localhost RELAY
Connect:127.0.0.1 RELAY
Connect:192.168.101.183 RELAY
Connect:192.168.101 RELAY
sh.com RELAY #中继
bj.com OK


vim /etc/mail/local-host-names

Sendmail 的加密(ssl)与验证(sasl)_sendmail_06

DNS

yum install bind-9.3.6-4.P1.el5_4.2.i386.rpm

bind-chroot-9.3.6-4.P1.el5_4.2.i386.rpm

caching-nameserver-9.3.6-4.P1.el5_4.2.i386.rpm


编辑配置文件:

cd /var/named/chroot

cp –p named-cachingnameserver named.conf

vim named.conf

Sendmail 的加密(ssl)与验证(sasl)_linux_07

Sendmail 的加密(ssl)与验证(sasl)_mail_08

Sendmail 的加密(ssl)与验证(sasl)_linux_09


Sendmail 的加密(ssl)与验证(sasl)_sendmail_10

rndc reload

编辑区域文件:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_11

Sendmail 的加密(ssl)与验证(sasl)_sendmail_12

Sendmail 的加密(ssl)与验证(sasl)_mail_13

正向查找:

cp localhost.zone bj.com.zone

Sendmail 的加密(ssl)与验证(sasl)_mail_14

反向查找:

cp -p named.local 101.168.192.zone

Sendmail 的加密(ssl)与验证(sasl)_sendmail_15

chkconfig named.on

指定Dns

Sendmail 的加密(ssl)与验证(sasl)_mail_16

nameserver 192.168.2.100


上海服务器同上.请确保DNS解析正常:

C:\Users\nate&gt;nslookup

默认服务器: mail.bj.com

Address: 192.168.101.183

&gt; mail.bj.com

服务器: mail.bj.com

Address: 192.168.101.183

名称: mail.bj.com

Address: 192.168.101.183

&gt; mail.sh.com

服务器: mail.bj.com

Address: 192.168.101.183

非权威应答:

名称: mail.sh.com

Address: 192.168.101.188

&gt; pop3.bj.com

服务器: mail.bj.com

Address: 192.168.101.183

名称: mail.bj.com

Address: 192.168.101.183

Aliases: pop3.bj.com

&gt; smtp.bj.com

服务器: mail.bj.com

Address: 192.168.101.183

名称: mail.bj.com

Address: 192.168.101.183

Aliases: smtp.bj.com

&gt; smtp.sh.com

服务器: mail.bj.com

Address: 192.168.101.183

非权威应答:

名称: mail.sh.com

Address: 192.168.101.188

Aliases: smtp.sh.com

&gt; pop3.sh.com

服务器: mail.bj.com

Address: 192.168.101.183

非权威应答:

名称: mail.sh.com

Address: 192.168.101.188

Aliases: pop3.sh.com




做完dns后就可以发邮件了:(outlook2010)

创建账户

Sendmail 的加密(ssl)与验证(sasl)_linux_17

测试可以使用:

Sendmail 的加密(ssl)与验证(sasl)_linux_18

发送邮件:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_19

Sendmail 的加密(ssl)与验证(sasl)_sendmail_20

但此时我们可以以任意身份发给任意用户,很明显这样是不安全的:

Sendmail 的加密(ssl)与验证(sasl)_linux_21

Sendmail 的加密(ssl)与验证(sasl)_sendmail_22 可以收到

加密:

openssl

smtps:

显示sendmail详细信息:

Sendmail 的加密(ssl)与验证(sasl)_mail_23

Version 8.13.8
Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS
TCPWRAPPERS USERDB USE_LDAP_INIT

============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = dns
(canonical domain name) $j = dns.bj.com
(subdomain name) $m = bj.com
(node name) $k = localhost.localdomain
========================================================

telnet 127.0.0.1 25

Sendmail 的加密(ssl)与验证(sasl)_sendmail_24 telnet 127.0.0.1可以看到,未启用数据加密

安装openssl

yum install openssl*

cd /etc/pki/

vim tls/openssl.cnf

更改45行 =/etc/pki/CA

Sendmail 的加密(ssl)与验证(sasl)_mail_25

由上图可以得知要创建如下文件:

mkdir certs crl newcerts

touch index.txt serial

echo “01” &gt;serial

match替换为optional

Sendmail 的加密(ssl)与验证(sasl)_mail_26:88,90 s/match/optional

证书服务器生成私钥

cd /etc/pki/CA/private

openssl genrsa 1024 &gt;cakey.pem

为了安全最好更改一下私钥权限:

chmod 600 cakey.pem

自签发:

openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650


-----

#因为在前面我们已经设置过国、省、组织名不严格匹配了,而且只是实验,这里随便写好了
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:HN
Locality Name (eg, city) [Newbury]:ZZ
Organization Name (eg, company) [My Company Ltd]:ZZU
Organizational Unit Name (eg, section) []:NET
Common Name (eg, your name or your server's hostname) []:ROOT.BJ.COM #这里写的是证书服务器的地址,当然这里也是最便写的
Email Address []:

A challenge password []:#挑战口令,直接确定就好

证书客户端私钥:

cd /etc/mail mkdir certs cd certs

openssl genrsa 1024 &gt;senmail.key

Sendmail 的加密(ssl)与验证(sasl)_mail_27

CSR 请求文件 (Certificate Signing Request)此文件颁发证书后可删除

openssl req –mew –key sendmail.key –out sendmail.csr

-----
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:HN
Locality Name (eg, city) [Newbury]:ZZ
Organization Name (eg, company) [My Company Ltd]:ZZU
Organizational Unit Name (eg, section) []:NET
Common Name (eg, your name or your server's hostname) []:smtp.bj.com

Email Address []:

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

颁发证书:

openssl ca –in sendmail.csr –out sendmail.crt


Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Mar 20 03:53:38 2012 GMT
Not After : Mar 20 03:53:38 2013 GMT
Subject:
countryName = CN
stateOrProvinceName = HN
organizationName = ZZU
organizationalUnitName = NET
commonName = smtp.bj.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
44:2D:1B:1F:84:DD:BB:D3:4C:FF:B0:3B:89:80:AD:74:AA:A0:3E:1B
X509v3 Authority Key Identifier:
keyid:56:FD:BD:54:59:0D:3F:0B:27:1A:08:EB:10:95:CA:4B:E1:C2:BA:35

Certificate is to be certified until Mar 20 03:53:38 2013 GMT (365 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

更改权限:

chmod 600 certs

cp /etc/pki/CA/cacert.pem /etc/mail/cets/

vim /etc/mail/senmail.mc

Sendmail 的加密(ssl)与验证(sasl)_mail_28

Sendmail 的加密(ssl)与验证(sasl)_mail_29

Sendmail 的加密(ssl)与验证(sasl)_mail_30

重启服务:

Sendmail 的加密(ssl)与验证(sasl)_mail_31

可以看到STARTTLS

Sendmail 的加密(ssl)与验证(sasl)_sendmail_32

测试:

将发送服务器加密类型改为tls:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_33

会提示你不信任根证书:

Sendmail 的加密(ssl)与验证(sasl)_mail_34

查看,并安装:

Sendmail 的加密(ssl)与验证(sasl)_mail_35

Sendmail 的加密(ssl)与验证(sasl)_linux_36

测试完成:

Sendmail 的加密(ssl)与验证(sasl)_linux_37

加密发送成功:

Sendmail 的加密(ssl)与验证(sasl)_linux_38

pops

yum install dovecot

mkdir -pv /etc/dovecot/certs 创建多级子目录

cd /etc/dovecot/certs

[root@localhost certs]# openssl genrsa 1024 &gt;dovecot.key #私钥

Generating RSA private key, 1024 bit long modulus

...++++++

.......................++++++

e is 65537 (0x10001)

[root@localhost certs]# openssl req -new -key dovecot.key -out dovecot.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) [GB]:CN

State or Province Name (full name) [Berkshire]:HN

Locality Name (eg, city) [Newbury]:ZZ

Organization Name (eg, company) [My Company Ltd]:ZZU

Organizational Unit Name (eg, section) []:NET

Common Name (eg, your name or your server's hostname) []:pop3.bj.com

Email Address []:

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

[root@localhost certs]# openssl ca -in dovecot.csr -out dovecot.crt#颁发证书

Using configuration from /etc/pki/tls/openssl.cnf

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number: 2 (0x2)

Validity

Not Before: Mar 23 17:42:23 2012 GMT

Not After : Mar 23 17:42:23 2013 GMT

Subject:

countryName = CN

stateOrProvinceName = HN

organizationName = ZZU

organizationalUnitName = NET

commonName =pop3.bj.com

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

9D:0D:A9:89:C7:E6:54:7A:7E:76:99:1A:1D:97:FD:15:97:A2:7C:E4

X509v3 Authority Key Identifier:

keyid:12:9B:1E:DA:07:A7:0E:40:7A:EA:8B:EC:1C:C5:1B:EF:62:72:7F:A8

Certificate is to be certified until Mar 23 17:42:23 2013 GMT (365 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




编辑配置文件:

vim dovecot.conf

protocols = imap imaps pop3 pop3s

ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem

ssl_key_file = /etc/pki/dovecot/certs/dovecot.key

chmod 600 *


重启:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_39

测试:

接受服务器端口改为995:,选择要求加密连接

Sendmail 的加密(ssl)与验证(sasl)_linux_40

会提示你不信任根证书:

Sendmail 的加密(ssl)与验证(sasl)_linux_41

查看,安装:

Sendmail 的加密(ssl)与验证(sasl)_mail_42

测试完成:

Sendmail 的加密(ssl)与验证(sasl)_linux_43

邮件接收成功:

Sendmail 的加密(ssl)与验证(sasl)_linux_44

sasl




























chkconfig –list |grep sasl

chkconfig saslauthd on


编辑配置文件:

vim sendmail.mc

Sendmail 的加密(ssl)与验证(sasl)_sendmail_45加y

Sendmail 的加密(ssl)与验证(sasl)_sendmail_46 打开

Sendmail 的加密(ssl)与验证(sasl)_linux_47强制验证

重启:

service saslauthd restart








Sendmail 的加密(ssl)与验证(sasl)_mail_48 可以看到多出了登陆验证

[root@localhost certs]# telnet 127.0.0.1 25

Trying 127.0.0.1...

Connected to Mail.bj.com (127.0.0.1).

Escape character is '^]'.

220 Mail.bj.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 24 Mar 2012 02:45:47 +0800

mail from:mail.bj.com

530 5.7.0 Authentication required #需要验证身份

auth login Ymo= 要输入经过加密的用户名和密码

334 UGFzc3dvcmQ6

MTIz


[root@localhost certs]# echo -n "bj"|openssl base64

Ymo=

[root@localhost certs]# echo -n "123"|openssl base64

MTIz



235 2.0.0 OK Authenticated

mail from:bj@bj.com

250 2.1.0 bj@bj.com... Sender ok

rcpt to:sh@sh.com

250 2.1.5 sh@sh.com... Recipient ok

data

354 Enter mail, end with "." on a line by itself

from:bj@bj.com

to:sh@sh.com

subject:test666666666666

666666666666666666666666666666666

.

250 2.0.0 q2NIjldF009914 Message accepted for delivery

接收到的邮件:






















Sendmail 的加密(ssl)与验证(sasl)_linux_49 此时已经需要验证身份,才能发送邮件了

未更改outlook设置会有如下提示:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_50

选择使用密码验证登陆:

Sendmail 的加密(ssl)与验证(sasl)_sendmail_51

Sendmail 的加密(ssl)与验证(sasl)_mail_52

测试成功:

Sendmail 的加密(ssl)与验证(sasl)_mail_53


发送邮件成功:

Sendmail 的加密(ssl)与验证(sasl)_mail_54