linux郵件伺服器的加密(ssl)與驗證(sasl)

火星人 @ 2014-03-08 , reply:0


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)支持的機制.

案例:

創建賬戶:

useradd bj

echo “123” |passwd –stdin bj

修改hosts:

修改主機名:

vim /etc/sysconfig/network

sendmail

rpm –ivh sendmil-cf

cd /etc/mail/

vim sendmil.mc 更改為:addr=0.0.0.0

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

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

rndc reload

編輯區域文件:

正向查找:

cp localhost.zone bj.com.zone

反向查找:

cp -p named.local 101.168.192.zone

chkconfig named.on

指定Dns

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)

創建賬戶

測試可以使用:

發送郵件:

但此時我們可以以任意身份發給任意用戶,很明顯這樣是不安全的:

可以收到

加密:

openssl

smtps:

顯示sendmail詳細信息:

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

telnet 127.0.0.1可以看到,未啟用數據加密

安裝openssl

yum install openssl*

cd /etc/pki/

vim tls/openssl.cnf

更改45行 =/etc/pki/CA

由上圖可以得知要創建如下文件:

mkdir certs crl newcerts

touch index.txt serial

echo “01” &gt;serial

match替換為optional

: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

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

重啟服務:

可以看到STARTTLS

測試:

將發送伺服器加密類型改為tls:

會提示你不信任根證書:

查看,並安裝:

測試完成:

加密發送成功:

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 *

重啟:

測試:

接受伺服器埠改為995:,選擇要求加密連接

會提示你不信任根證書:

查看,安裝:

測試完成:

郵件接收成功:

sasl

chkconfig –list |grep sasl

chkconfig saslauthd on

編輯配置文件:

vim sendmail.mc

加y

打開

強制驗證

重啟:

service saslauthd restart

可以看到多出了登陸驗證

[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

接收到的郵件:

此時已經需要驗證身份,才能發送郵件了

未更改outlook設置會有如下提示:

選擇使用密碼驗證登陸:

測試成功:

發送郵件成功:

實驗結束!!!!!!!!!





[火星人 via ] linux郵件伺服器的加密(ssl)與驗證(sasl)已經有199次圍觀

http://www.coctec.com/docs/linux/show-post-46291.html