Opencart上使用开放平台ID登录的经验

以facebook为例,登录流程如下:

1、在页面上嵌入facebook登录链接,链接指向facebook开放平台网址,并附件参数及回调页面地址;

2、facebook完成登录校验,并按参数要求通过回调URL将参数传给回调页面;

3、回调页面(controller/acount/fbconnect)的工作最重要,主要包括:初始化fb模块及参数appid和secret,执行getUser函数,解密从facebook加密传送过来的信息,确保数据不是伪造的;如果getUser成功,则将信息中email地址进行匹配,如果匹配不到,则新建帐号,如果匹配到,就按此email地址的帐号成功登录。

总结:非对称加密、数字证书, 数字签名, SSL(TLS) , SASL

数字证书, 是级联认证派发的, 最上层是根CA认证中心. 数字证书的根本作用, 是为了保证所有人公钥的安全性和真实性. 大致认证过程是: 通过CA的公钥来解出该CA所派发的证书里面所包含的公钥(用户或者机构的). 并通过该公钥来验证证书持有人的真实性. (因为持有人并不一定是证书所有人)

 

       通过上面对SSL的分析,我们可以看到,SSL并不能阻止别人获得你传输的数据,但是由于你传输的数据都是加密过的,别人拿到了毫无用处,一样可以保护信 息的安全。还有一点需要强调一下,SSL并不依赖于TCP,它可以建立在任何可靠的传输层协议(比如TCP)之上。也就是说SSL是不能建立在UDP之上 的。这是显然的,如果传输都不可靠,偶尔丢两个包或者包的顺序换一换的话,怎么保证安全呢?

SASL是提供一种用户身份认证机制, 你可以简单认为是用来认证用户的账号/密码是否运行进入系统或者使用系统的服务. 一般较长使用digest-md5, 该种机制下, 密码可以不用在网络上传输, 也就不用怕密码被窃听.

SASL – 简单认证和安全层

SASL是一种用来扩充C/S模式验证能力的机制认证机制,  全称Simple Authentication and Security Layer.

当你设定sasl时,你必须决定两件事;一是用于交换“标识信 息”(或称身份证书)的验证机制;一是决定标识信息存储方法的验证架构。

sasl验证机制规范client与server之间的应答过程以及传输内容的编码方法,sasl验证架构决定服务器本身如何存储客户端的身份证书以及如何核验客户端提供的密码。

如果客户端能成功通过验证,服务器端就能确定用户的身份, 并借此决定用户具有怎样的权限。

比较常见的机制;

1. plain(较常用)

plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,你可能会想要结合tls。

2. login

login不是其正式支持的机制,但某些旧版的mua使用这种机制,所以cyrus sasl让你可选择其是否支持login机制。如果你的用户仍在使用这类老掉牙的mua,你必须在编译sasl函数库时,指定要包含login的支持。 login的证书交换过程类似plain。

3. otp

otp是一种使用“单次密码”的验证机制。此机制不提供任何加密保护,因为没必要--每个密码都只能使用一次,每次联机都要改用新密码。smto client必须能够产生otp证书。

4. digest-md5(较常用)

使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输。验证过程是从服务器先提出challenge(质询)开始, 客户端使用此challenge与隐性密码计算出一个response(应答)。不同的challenge,不可能计算出相同的response;任何拥 有secret password的一方,都可以用相同的challenge算出相同的response。因此,服务器只要比较客户端返回的response是否与自己算 出的response相同,就可以知道客户端所拥有的密码是否正确。由于真正的密码并没有通过网络,所以不怕网络监测。

5. kerberos

kerberos是一种网络型验证协议。除非你的网络已经使用kerberos,否则你应该用不到kerberos机制;相对的,如果你的网络已经架设了kerberos验证中心,sasl就能完美的将smtp验证整合进现有的体系。

6. anonymous

anonymous机制对smtp没有意义,因为smtp验证的用意在于限制转发服务的使用对象,而不是为了形成open relay,sasl之所以提供这种机制,主要是为了支持其他协议。 当 客户端链接到一个支持sasl的邮件服务器时,服务器会以优先级列出可用的机制供客户端选择。如果客户端也支持多钟机制,则当第一种机制验证失败时,客户 端可能会继续尝试第二种机制,直到通过验证或是所有机制都失败为止。如果双方在一开始就无法协调出共同的机制,验证过程就算失败。 一旦双方在使用哪种机制上达成共识,就开始进行验证过程。实际的交互过程随机制而定,但通常包含一次或多次应答过程。验证协议本身也规定了应答内容的编码格式。

 

SSL(TLS) – 传输层安全协议

SSL全称是 Secure Sockets Layer,它是一种间于传输层(比如TCP/IP)和应用层(比如HTTP)的协议. 它通过”握手协议”和”传输协议”来解决传输安全的问题。

握手协议是基于非对称加密的,而传输协议是基于对称加密的。根据不同的应用,SSL对证书的要求也是不一样的,可以是单方认证(比如HTTP, FTP),也可以是双方认证(比如网上银行)。通常情况下,服务器端的证书是一定要具备的,客户端的证书不是必须的。

Postfix疑难问题处理过程

安装mysql用户数据库,并设置后,一直无法生效:

May 25 07:59:43 jiamh2005 postfix/local[10352]: D0D579A62A68: to=<xujh@jiamh2005.tk>, relay=local, delay=1.3, delays=1.2/0.01/0/0.03, dsn=5.1.1, status=bounced (unknown user: “xujh”)

后来查阅解决方法,

#/etc/postfix/main.cf
mydestination =
# set to localhost localhost.$mydomain or remove mydomain.com for now
# Ensure that postmap -q mydomain.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf is returning mydomain.com and
# postmap -q myuser@mydomain.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf succeeds
postmap -q xujh@wengin.tk mysql:/etc/postfix/my-vm-maps.cf

 

后,发现问题在mydestination中的接收域和虚拟域重复了,删去mydestination的域名,问题得到解决。

 

 

Postfix命令详解(3)–SMTP认证的配置

如果任何人都可以通过一台邮件服务器来转发邮件,会有什么后果呢?很可能这台邮件服务器就成为了各类广告与垃圾信件的集结地或中转站,网络带宽也会很快被耗尽。为了避免这种情况的出现,Postfix默认不会对外开放转发功能,而仅对本机(localhost)开放转发功能。但是,在实际应用中,必须在Postfix主配置文件中通过设置mynetworks、relay_domains参数来开放一些所信任的网段或网域,否则该邮件服务器几乎没有什么用处。在开放了这些所信任的网段或网域后,还可以通过设置SMTP认证,对要求转发邮件的客户端进行用户身份(用户账户名与密码)验证。只有通过了验证,才能接收该用户寄来的邮件并帮助转发。

目前,比较常用的SMTP认证机制是通过Cyrus SASL包来实现的。

在默认情况下,Postfix邮件主机可以接收和转发来自什么地方的邮件呢?

注记: (1)默认情况下,Postfix接收符合以下条件的邮件: 目的地为$inet_interfaces的邮件; 目的地为$mydestination的邮件; 目的地为$ virtual_alias_maps的邮件。

 

(2)默认情况下,Postfix转发符合以下条件的邮件: 来自客户端IP地址符合$mynetworks的邮件; 来自客户端主机名称符合$relay_domains及其子域的邮件; 目的地为$relay_domains及其子域的邮件。 此外,还可以通过其他方式来实现更强大的控制,如STMP认证就是其中的一种方式。

Cyrus SASL是Cyrus Simple Authentication and Security Layer的简写,它最大的功能是为应用程序提供了认证函数库。应用程序可以通过函数库所提供的功能定义认证方式,并让SASL通过与邮件服务器主机的沟通从而提供认证的功能。

下面介绍使用Cyrus SASL包实现SMTP认证的具体方法。

1.Cyrus-SASL认证包的安装 默认情况下,Red Hat Enterprise Linux安装程序会自动安装Cyrus-SASL认证包。读者可使用下面的命令检查系统是否已经安装了Cyrus-SASL认证包或查看已经安装了何种版本。

rpm -qa | grep sasl

 

命令执行结果如图9-7所示,这表示Cyrus-SASL已安装,它的版本为2.1.22-4(V2版),但它的相关程序还没有安装完全。

 

图9-7  检查系统是否已经安装了Cyrus-SASL

如果系统还没有安装Cyrus-SASL认证包,应将Red Hat Enterprise Linux 5第1、2和3张安装光盘分别放入光驱,加载光驱后在光盘的Server目录下找到与Cyrus-SASL认证包相关的RPM包文件,然后分别使用rpm -ivh命令安装。例如,要安装第1张光盘上的cyrus-sasl-2.1.22-4.i386.rpm包文件,可使用下面的命令。

rpm -ivh /mnt/Server/cyrus-sasl-2.1.22-4.i386.rpm

 

2.Cyrus-SASL V2的密码验证机制 默认情况下,Cyrus-SASL V2版使用saslauthd这个守护进程进行密码认证,而密码认证的方法有多种,使用下面的命令可查看当前系统中的Cyrus-SASL V2所支持的密码验证机制。

saslauthd -v

 

命令的执行情况如图9-8所示。

 

图9-8  查看可以使用的密码验证机制

从图中可以看到,当前可使用的密码验证方法有getwent、kerberos5、pam、rimap、shadow和ldap。为简单起见,这里准备采用shadow验证方法,也就是直接用/etc/shadow文件中的用户账户及密码进行验证。因此,在配置文件/etc/sysconfig/saslauthd中,应修改当前系统所采用的密码验证机制为shadow,即:

MECH=shadow

 

3.测试Cyrus-SASL V2的认证功能 由于Cyrus-SASL V2版默认使用saslauthd这个守护进程进行密码认证,因此需要使用下面的命令来查看saslauthd进程是否已经运行。

ps aux | grep saslauthd

 

如果没有发现saslauthd进程,则可用下面的命令启动该进程并设置它开机自启动。

/etc/init.d/saslauthd start chkconfig saslauthd on

 

然后,可用下面的命令测试saslauthd进程的认证功能。

/usr/sbin/testsaslauthd –u lbt –p ‘123456’

 

其中,lbt为Linux系统中的用户账户名,‘123456’为用户lbt的密码。该命令执行后,如果出现如图9-9所示的结果,则表示saslauthd的认证功能已起作用。

 

图9-9  测试saslauthd的认证功能

4.设置Postfix启用smtp认证 默认情况下,Postfix并没有启用SMTP认证机制。要让Postfix启用SMTP认证,就必须对Postfix的主配置文件/etc/postfix/main.cf进行修改。 下面先给出main.cf文件中有关SMTP认证的设置部分(位于文件的最后面),然后对这部分内容进行说明。

    smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = '' smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination broken_sasl_auth_clients=yes smtpd_client_restrictions = permit_sasl_authenticated smtpd_sasl_security_options = noanonymous

 

(1)smtpd_sasl_auth_enable:指定是否要启用SASL作为SMTP认证方式。默认不启用,这里必须将它启用,所以要将该参数值设置为“yes”。

(2)smtpd_sasl_local_domain:如果采用Cyrus-SASL V2版进行认证,那么这里不做设置。

(3)smtpd_recipient_restrictions:表示通过收件人地址对客户端发来的邮件进行过滤。通常有以下几种限制规则。

permit_mynetworks:表示只要是收件人地址位于mynetworks参数中指定的网段就可以被转发邮件。
permit_sasl_authenticated:表示允许转发通过SASL认证的邮件。 reject_unauth_destination:表示拒绝转发含未信任的目标地址的邮件。

(4)broken_sasl_auth_clients:表示是否兼容非标准的SMTP认证。有一些Microsoft的SMTP客户端(如Outlook Express 4.x)采用非标准的SMTP认证协议,只需将该参数设置为“yes”就可解决这类不兼容问题。

(5)smtpd_client_restrictions:表示限制可以向Postfix发起SMTP连接的客户端。如果要禁止未经过认证的客户端向Postfix发起SMTP连接,则可将该参数值设置为

“permit_sasl_authenticated”。

(6)smtpd_sasl_security_options:用来限制某些登录的方式。如果将该参数值设置为“noanonymous”,则表示禁止采用匿名登录方式。

在完成上述设置后,必须使用命令“/etc/init.d/postfix reload”重新载入配置文件,或使用命令“/etc/init.d/postfix restart”重新启动Postfix服务。

此外,由于当Postfix要使用SMTP认证时,会读取/usr/lib/sasl2/smtpd.conf文件中的内容,以确定所采用的认证方式,因此如果要使用saslauthd这个守护进程来进行密码认证,就必须确保/usr/lib/sasl2/smtpd.conf文件中的内容为:

pwcheck_method: saslauthd

 

5.测试Postfix是否启用了SMTP认证 经过上面的设置,Postfix邮件服务器应该已具备了SMTP认证功能。可采用Telnet命令连接到Postfix服务器端口25来进行测试,测试过程如图9-10所示。

 

图9-10  测试Postfix是否启用了SASL认证

如图9-10所示,第6行输入EHLO命令向远程163.com域发出消息,在随后得到的本地Postfix响应信息中,如果出现第12、13行信息(显示当前Postfix所支持的认证方式),则表明Postfix已启用了SMTP认证功能。

如果没有安装Cyrus-SASL认证包的相关程序如 cyrus-sasl-md5-2.1.22-4.i386.rpm、cyrus-sasl-gssapi-2.1.22-4.i386.rpm等,第12、13行信息就显示为:

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN

 

Postfix命令详解(2)–虚拟别名域设置

虚拟别名域的配置

使用虚拟别名域,可以将发给虚拟域的邮件实际投递到真实域的用户邮箱中;可以实现群组邮递的功能,即指定一个虚拟邮件地址,任何人发给这个邮件地址的邮件都将由邮件服务器自动转发到真实域中的一组用户的邮箱中。

这里的虚拟域可以是实际并不存在的域,而真实域既可以是本地域(即main.cf文件中的mydestination参数值中列出的域),也可以是远程域或Internet中的域。虚拟域是真实域的一个别名。实际上,通过一个虚拟别名表(virtual),实现了虚拟域的邮件地址到真实域的邮件地址的重定向。

下面通过一些例子来说明虚拟别名域的设置方法。

【例1】如果要将发送给虚拟域@dzxx.cn的邮件实际投递到真实的本地域@gdvcp.net,那么可在虚拟别名表中进行如下定义:

@dzxx.cn  @gdvcp.net

 

【例2】如果要将发送给虚拟域的某个虚拟用户(或组)的邮件实际投递到本地Linux系统中某个用户账户的邮箱中,那么可在虚拟别名表中进行如下定义:

admin@example.com  lbt st0321@example.com  st0321001,st0321002,st0321003

【例3】如果要将发送给虚拟域中的某个虚拟用户(或组)的邮件实际投递到本地Linux系统中和Internet中某个用户账户的邮箱中,那么可在虚拟别名表中进行如下定义:

daliu@example.com  lbt,liu6812@163.com

 

在实际应用中,要实现上述虚拟别名域,必须按以下步骤进行。

编辑Postfix主配置文件/etc/postfix/main.cf,进行如下定义:

virtual_alias_domains = dzxx.cn,example.com virtual_alias_maps = hash:/etc/postfix/virtual

 

这里,参数virtual_alias_domains用来指定虚拟别名域的名称,参数virtual_alias_maps用来指定含有虚拟别名域定义的文件路径。

编辑配置文件/etc/postfix/virtual,进行如下定义:

@dzxx.cn  @gdvcp.net admin@example.com  lbt st0321@example.com  st0321001,st0321002 daliu@example.com  lbt,liu6812@163.com

 

在修改配置文件main.cf和virtual后,要使更改立即生效,应分别执行/usr/sbin目录下以下的两条命令。

postmap /etc/postfix/virtual postfix reload

 

其中,第1条命令用来将文件/etc/postfix/virtual生成Postfix可以读取的数据库文件/etc/postfix/virtual.db;第2条命令用于重新加载Postfix主配置文件main.cf文件。这两条命令的执行情况如图9-5所示。

 

图  使虚拟别名域设置生效

Postfix命令详解(1)

1.设置可接收邮件的主机名称或域名 mydestination参数非常重要,因为只有当发来的邮件的收件人地址与该参数值相匹配时,Postfix才会将该邮件接收下来。例如,这里将该参数值设置为$mydomain和$myhostname,表明无论来信的收件人地址是xxx@gdvcp.net(其中xxx表示某用户的邮件账户名),还是xxx@mail.gdvcp.net,Postfix都会接收这些邮件。

mydestination = $mydomain, $myhostname

 

2.设置可转发(Relay)哪些网络的邮件 可以使用mynetworks参数来设置。可将该参数值设置为所信任的某台主机的IP地址,也可设置为所信任的某个IP子网或多个IP子网(用“,”或者“ ”分隔)。这里,将mynetworks参数值设置为192.168.16.0/24,则表示这台邮件主机只转发子网192.168.16.0/24中的客户端所发来的邮件,而拒绝为其他子网转发邮件。

mynetworks = 192.168.16.0/24