使用zimbra作为企业邮件服务器的公司,可能会遇到这样一种情况:使用用户名+密码的传统认证方法,经常会发现有人恶意登录用户邮箱,采取暴力 破解,不断尝试登录密码。同时,简单密码组合很轻易被破解。从而在未经授权情况下登录用户邮箱。。。管理员可能会采取强制用户使用复杂密码,特殊字符,大 小写字母,数字等排列组合。。。但这种密码同时也加大了用户的负担,因为他们要记很长,很复杂的密码。。。

Zimbra提供了另一种方法可以解决这个问题,就是双向证书认证【2-way SSL (mutual authentication) using X.509 certificates】。用户只需拿着属于自己的私钥即可在不需要用户名密码的情况下,访问自己的邮箱。认证方式由密码认证,变成证书认证。

更多内容,请访问 Darren博客

 

环境:
操作系统:Ubuntu 12.04_x64 LTS
Zimbra版本: zcs-8.0.0_GA_5434.UBUNTU12_64.20120907144631
域名:mail.imycloud.com

由于大部分操作我全部使用root用户完成,所以很多zimbra提供的命令需要打绝对路径。

加粗显示的为命令

斜体的为系统提示符

正常显示的为显示信息

一、zimbra安装

请参考另一篇博文:

二、双向证书认证设置:

创建一个目录来存放证书文件
root@mail:/opt/zimbra# mkdir certs
root@mail:/opt/zimbra# cd certs/

 

1. 生成CA证书

a. 创建一个私钥

root@mail:/opt/zimbra#/opt/zimbra/openssl/bin/openssl genrsa -out ca.key 2048

b. 创建一个证书请求

root@mail:/opt/zimbra/certs# /opt/zimbra/openssl/bin/openssl req -new -key ca.key -out ca.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) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:imycloud.com
Organizational Unit Name (eg, section) []:imycloud.com
Common Name (e.g. server FQDN or YOUR name) []:www.imycloud.com
Email Address []:admin@imycloud.com

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
root@mail:/opt/zimbra/certs#
c. 根据证书请求,创建自签名证书
root@mail:/opt/zimbra/certs#/opt/zimbra/openssl/bin/openssl x509 -extfile /opt/zimbra/openssl/ssl/openssl.cnf -extensions v3_ca -req -days 365 -in ca.csr -out ca.crt -signkey ca.key
Signature ok
subject=/C=CN/ST=Shanghai/L=Shanghai/O=imycloud.com/OU=imycloud.com/CN=www.imycloud.com/emailAddress=admin@imycloud.com
Getting Private key

d. 验证x509V3 CA证书:

root@mail:/opt/zimbra/certs# /opt/zimbra/openssl/bin/openssl x509 -in ca.crt -noout -text

……

X509v3 extensions:
X509v3 Subject Key Identifier:
73:C6:B6:51:BA:8A:F1:E9:1C:CE:51:C6:4F:A5:36:31:82:4F:1F:48
X509v3 Authority Key Identifier:
keyid:73:C6:B6:51:BA:8A:F1:E9:1C:CE:51:C6:4F:A5:36:31:82:4F:1F:48

X509v3 Basic Constraints:
CA:TRUE
……

2. 生成客户端证书

a. 创建私钥(我在这里用admin用户演示,如果你要为n个帐号做认证,需要创建n个):

root@mail:/opt/zimbra/certs#/opt/zimbra/openssl/bin/openssl genrsa –out admin.key 2048

 

b. 创建证书请求:

注意:此步骤最重要的是填写正确的用户邮箱地址,此地址必须是zimbra用户邮箱地址!
root@mail:/opt/zimbra/certs#/opt/zimbra/openssl/bin/openssl req -new -key admin.key -out admin.csr

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]:imycloud.com
Organizational Unit Name (eg, section) []:imycloud.com
Common Name (e.g. server FQDN or YOUR name) []:www.imycloud.com
Email Address []:admin@imycloud.com #注意该邮箱地址!必须填写zimbra邮箱用户地址。

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

c. 使用第一步创建的ca证书签署用户证书请求,并创建该用户证书:

root@mail:/opt/zimbra/certs#/opt/zimbra/openssl/bin/openssl ca -in admin.csr -cert ca.crt -keyfile ca.key -out admin.crt -policy policy_anything
注意:
如果你看到如下报错:
Using configuration from /opt/zimbra/openssl-1.0.0d/ssl/openssl.cnf
I am unable to access the ./demoCA/newcerts directory
./demoCA/newcerts: No such file or directory
请做以下操作:
root@mail:/opt/zimbra/certs#mkdir -p ./demoCA/newcerts
root@mail:/opt/zimbra/certs#cd demoCA
root@mail:/opt/zimbra/certs#echo “01″ > serial
root@mail:/opt/zimbra/certs#touch index.txt     #创建一个空的index.txt文件
root@mail:/opt/zimbra/certs#cd ..                                 #回到刚才创建的存放证书的目录

然后再次执行该命令:
root@mail:/opt/zimbra/certs#/opt/zimbra/openssl/bin/openssl ca -in admin.csr -cert ca.crt -keyfile ca.key -out admin.crt -policy policy_anything
Using configuration from /opt/zimbra/openssl-1.0.1c/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0×1)
Validity
Not Before: Oct 1 10:39:23 2012 GMT
Not After : Oct 1 10:39:23 2013 GMT
Subject:
countryName = CN
stateOrProvinceName = Shanghai
localityName = Shanghai
organizationName = imycloud.com
organizationalUnitName = imycloud.com
commonName = www.imycloud.com
emailAddress = admin@imycloud.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
D5:98:89:84:5A:F4:92:EB:49:1D:3C:72:72:37:B2:A9:A8:91:52:0C
X509v3 Authority Key Identifier:
keyid:73:C6:B6:51:BA:8A:F1:E9:1C:CE:51:C6:4F:A5:36:31:82:4F:1F:48

Certificate is to be certified until Oct 1 10:39: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

此时certs目录下应该有如下文件:
root@mail:/opt/zimbra/certs# ls
admin.crt admin.csr admin.key ca.crt ca.csr ca.key demoCA

3. 导入用户证书至浏览器

我们以firefox为例。
因为一般我们使用crt格式的证书文件就可以了。如果你的浏览器要求的证书格式为pkcs12格式,请使用如下命令生成pkcs12格式的证书:
root@mail:/opt/zimbra/certs#/opt/zimbra/openssl/bin/openssl pkcs12 -export -clcerts -in admin.crt -inkey admin.key -out admin.p12
Enter Export Password:            #这个导出密码建议为不同帐号设置不同密码,在导入证书时会要求输入该密码。有密码保护也有保障。
Verifying – Enter Export Password:
然后将生成的admin.crt或者admin.pk12文件拷贝到本地。并导入到浏览器中。
火狐的浏览器导入证书步骤为:
点击左上角火狐→选项→选项→高级→加密→查看证书→我的证书→导入→选择pk12文件→点击打开→点击确定
此时在我的证书里面,就会看到导入的证书信息

4. 导入签署客户端证书的CA证书到ZCS的密钥库

两种方法:
a. root@mail:/opt/zimbra/certs# /opt/zimbra/bin/zmcertmgr addcacert ca.crt
b. root@mail:/opt/zimbra/certs# keytool -import -keystore /opt/zimbra/jetty/etc/keystore -alias myca -file ca.crt
笔者使用的的是第一种。

5. 配置zimbra 服务器请求客户端证书

由于客户端证书身份认证是利用ssl,所以要求访问方式为ssl。而且认证端口不能跟443冲突。笔者使用9443

a. 先确认登录方式为https:

root@mail:/opt/zimbra/certs# /opt/zimbra/bin/zmprov gs mail.imycloud.com zimbraMailMode
# name mail.imycloud.com
zimbraMailMode: https
如果不是https方式访问,请使用如下命令修改:
root@mail:/opt/zimbra/certs# /opt/zimbra/bin/zmtlsctl https

b. 设置认证端口

root@mail:/opt/zimbra/certs# /opt/zimbra/bin/zmprov ms mail.imycloud.com zimbraMailSSLClientCertPort 9443

c. 客户端认证有两种模式;

WantClientAuth 和 NeedClientAuth

区别为:
当使用WantClientAuth,服务器并不强制客户端拥有证书,如果没有证书,将使用用户名/密码的认证方式。
当使用NeedClientAuth,服务器强制要求客户端必须有证书,如果没有证书,连接将被服务器中断。
用哪种模式,取决为各位需求,笔者所在的公司要求使用证书认证,所以我选择NeedClientAuth方式

使用如下命令看详细信息:
root@mail:/opt/zimbra#/opt/zimbra/bin/zmprov desc -a zimbraMailSSLClientCertMode
设置认证方式为NeedClientAuth:
root@mail:/opt/zimbra#/opt/zimbra/bin/zmprov ms mail.imycloud.com zimbraMailSSLClientCertMode NeedClientAuth

6. 重启mailbox服务:

由于此命令只允许zimbra用户执行,请先切换至zimbra用户。
root@mail:/opt/zimbra# su zimbra
zimbra@mail:~$ zmmailboxdctl restart
Stopping mailboxd…done.
Starting mailboxd…done.

至此,双向证书认证登录基本配置完毕。

三、测试

ZWC登录:

https://mail.imycloud.com:9443/certauth

Admin console登录:

https://mail.imycloud.com:9443/certauth/admin

如果配置正确,打开页面时,会先弹出来证书认证窗口,如果证书配置正确。然后将直接跳转至用户邮箱。如果没有,请检查配置。

 

小结:以上步骤仅仅实现了双向证书的认证登录,但是具体细节还需要再配置完善一下,请看第二篇博文。