A sample text widget

Etiam pulvinar consectetur dolor sed malesuada. Ut convallis euismod dolor nec pretium. Nunc ut tristique massa.

Nam sodales mi vitae dolor ullamcorper et vulputate enim accumsan. Morbi orci magna, tincidunt vitae molestie nec, molestie at mi. Nulla nulla lorem, suscipit in posuere in, interdum non magna.

iptables命令指南

iptables 命令指南语法:iptables [-t table] command [match] [target]
-t table:指定 iptables 表。
command:命令选项。
match:规则选项
target:动则选项

iptables 命令选项选 项 描 述
-A 在所选择的链规则结尾添加一条规则。
-D 从所选择的链中删除规则。有两种方法指定要删除的规则:一是把规则完整地写出来,再就是指定规则序号。
-R 在所选中的链里指定的行上替换match。如iptables -R INPUT number [match] [target]。当地址是以名字而不是以IP的形式出现时,若名字可以被解析为多个IP,则这条command会失败。
-I 根据给出的序号插入规则,默认向顶部插入规则。
-L 列出所选择的链的所有规则。如iptables -L INPUT,不指定链将列出表中所有规则。
-F 清空所选链的规则。
-Z 清空所选链的计数器。如iptables -Z INPUT,不指定链则认为是所有链。
-N 建立新链。
-X 删除指定的用户定义链。被删除的链必须没有被引用,如果被引用,在删除之前你必须删除与之有关的规则。如果没有给出参数,这条命令将会删除所有非内建链。
-P 定义链的默认target, 这里的target只能是DROP和ACCEPT。
-E 对自定义链进行重命名。如iptables -E allowed disallowed
-x 只能和-L连用,使-L输出中的计数器显示准确的数值,而不是K、M、G等估值。
-n
–line-numbers 只能和-L连用,以数值形式显示,而不是默认的名字:主机名、网络名、程序名等。
-c 只能和-A,-I,-R连用,在创建或更改规则时设置计数器,如-c 20 400,意思是让内核把包计数器设为20,把字节计数器设为400。
-m
–modprobe 此选项告诉 iptables 探测并装载要使用的模块
iptables 规则选项我把规则按协议方式分为五类:通用规则、TCP规则、UDP规则、ICMP规则、高级规则。其中通用规则是可以应用于任何协议的,也不用装载何种扩展的。而TCP规则、UDP规则、ICMP规则只能应用于对应的协议,要装入相应扩展模块,但它是自动或隐含装入内核的,不需手动使用 -m 载入,所以也称为隐含匹配。高级规则必须用 -m 装载扩展的,也称为显式匹配。

选 项 描 述
通用规则
-p 匹配协义类型。可以是协义名称(不分大小写),也可以是相应整数值,必需在/etc/protocols中定义,缺省设置为ALL。可以在协义前加英文感叹号取反。
-s 匹配源地址。单个地址:192.168.1.1 192.168.1.1/24;多个地址:192.168.1.0/24 192.168.1.0/255.255.255.0;在地址前加英文感叹号表示取反,注意空格:-s ! 192.168.1.0/24; 缺省是匹配所有地址。
-d 匹配目标地址。语法和-s完全一样。
-i 以包进入本地所使用的网络接口匹配包。要注意这个匹配操作只能用于INPUT,FORWARD,PREROUTING这三个链。感叹号表示取反,-i ! eth0。
-o 以包离开本地所使用的网络接口来匹配包。语法和-i完全一样。
-f 用来匹配一个被分片的包的第二个片或及以后的部分。因为它们不包含源或目的地址,或ICMP类型等信息,因此其它规则无法匹配到它,所以才有这个匹配操作。要注意碎片攻击哦。这个操作也可以加英文感叹号表示取反,但要注意位置,如 ! -f。取反时,表示只能匹配到没有分片的包或者是被分片的包的第一个碎片,其后的片都不行。现在内核有完善碎片功能,可以防止碎片攻击,所以不必使用取反的功能来防止碎片通过。如果你使用连接跟踪,是不会看到任何碎片的,因为在它们到达任何链之前就被处理过了。
TCP规则(必需有-p tcp作为前提条件)
–sport 基于TCP包的源端口来匹配包,不指定端口认为是全部端口。可以使用端口号或者服务名匹配,使用服务名时必需在/etc/servers中定义。可以使用连续的端口–sport 22:80,表示从22到80所有端口。使用连续端口时省略首位端口号时默认是0,如:–sport :80表示从0到80的所有端口,使用连续端口时省略末位端口时,默认是65535,如–sport 22:表示从22到65535的所有端口。在端口号前面加英文感叹号表示取反。
–dport 基于TCP包的目的端口来匹配包。语法和–sport完全一样。
–tcp-flags 匹配指定的TCP标记。有两个参数,它们都是列表,列表内部用英文逗号隔开,这两个列表之间用空格分开。第一个参数指定我们要检查的标记,第二个参数指定在第一个参数中设为1的标记(即状态是打开的标记),且其它标记值为0。这个匹配操作可以识别以下标记:SYN、ACK、FIN、RST、URG、PSH,另外还有两个词也可以使用就是ALL和NONE。ALL是指选定所有标记,NONE是不选定任何标记。–tcp-flags也可以使用英文感叹号取反值,如:–tcp-flags ! SYN,FIN,ACK SYN表示匹配FIN和ACK标记被设置而SYN标记没有设置的TCP包。
–syn 这是ipchains时代的遗留物,和–tcp-flags SYN,RST,ACK SYN的作用完作一样。也可以使用英文感叹号,如:! –syn用来匹配状态为已建立的连接包。
–tcp-option 这个选项我还没有理解,请网友帮助我补充。
UDP规则(必需有-p udp作为前提条件)
–sport 基于UDP的源端口匹配包,语法同-p tcp –sport完全一样。
–sport 基于UDP的目的端口匹配包,语法同上。
ICMP规则(必需有-p ICMP作为前提条件)
–icmp-type 根据ICMP类型匹配包,类型的指定可以使用十进制数值和相应的名字。数值在RFC792中有定义,名字可以用iptables -p ICMP –help查看。这个选项也可以用英文感叹号取反。

高级规则,要用 -m 装载扩展模声,把这个规则分开是因为更好描述。

选 项 描 述
-m limit 载入匹配速率模块。
–limit 为某条规则设置最大平均匹配速率,也就是单位时间内可以匹配几个包。它的形式是一个数值加一个单位,可以是/second /minute /hour /day。默认是每小时3次,即3/hour,也就是每20分种一次。也以用英文感叹号取反。
–limit-burst 定义limit match的峰值,就是在单位时间内最多匹配几个包,默认是5。
-m mac 载入 MAC匹配模块。
–mac-source 地址格式只能是xx:xx:xx:xx:xx:xx,也可以用英文感叹号取反。
-m mark 标志匹置模块
–mark 以包被设置的标志值来匹配包,这个值是由iptables的MARK target来设置的,它是一个无符号的整数。
-m multiport 多端口匹配模块,可以定义不连续的多个端口,最多定义15个不连续的端口,且不能同时使用标准端口匹配和多端口扩展匹配。应用于TCP规则和UDP规则
–sport 定义多个源端口,如:-p tcp -m multiport -sport 22,53,81,3389。
–dport 定义多个目的端口,语法同上。
–port 同端口多端口匹配,意思就是它匹配的是那种源端口和目的端口是同一端口的包。比如:端口80到端口80的包。语法同上。
-m iprange 多个连续IP匹配模块
–src-range 源IP匹配,例:192.168.0.1-192.168.0.100。
–dst-range 目的IP匹配
-m owner 应用级权限匹配模块
–uid-owner 基于生成包的用户ID来匹配外出的包。如:-m owner –uid-owner 0
–gid-owner 基于生成包的用户组ID来匹配外出的包。
–pid-owner 基于生成包的进程ID来匹配外出的包。
–sid-owner 按生成包的会话ID来匹配外出的包。
-m state 连接状态匹配模块
–state 4种状态可用:INVALID、ESTABLISHED、NEW、RELATED。INVALID意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题;ESTABLISHED意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。NEW表示包将要或已经开始建立一个新的连接,或者这个包和一个还没有在两端都有数据发送的连接有关。RELATED说明包正在建立一个新连接,这个连接和一个已建立的连接相关的。注意:NEW状态并不在试图建立新连接的TCP包里寻找SYN标记。
-m tos TCP的TOS字段匹配模块
–tos 根据TOS匹配包。
-m ttl TCP的TTL字段匹配模块
–ttl 根据TTL值来匹配,参数是十进制数。
iptables 动作选项就是匹配规则后发生的动作。命令 -j。
还有一个很有用的选项:-j 用户自定义链,这就就是跳入到这个用户自定义链中去。

选 项 描 述
-j ACCEPT 对符合规则的包允许通过。
-j DROP 对符合规则的包丢弃动作。
-j REJECT 拒绝数据包,并返回错误信息。只能用于INPUT、FORWARD、OUTPUT链中。
–reject-with 告诉REJECT target 应向发送者反回什么样的信息。可用的信息类型可以man一下。
-j DNAT 目的地址转换。DNAT只能应用于nat表的PREROUTING和OUTPUT中。
–to-destination 指定要写入的IP头的地址。可以使用这几种方式:1、单个IP;2、连续地址192.168.1.1-192.168.1.10,这种情况下每个流就会被随机分配一个要转发的地址,但同一个流总是使用同一个地址。3、我们还可以在地址后面指定端口或端口范围,如:192.168.1.1:80或192.168.1.1:80-100,要注意只有选用-p指定协议后,才能使用。
-j SNAT 源地址转换。只能应用于nat表的POSTROUTING中。
–to-source 指定要转换的源地址和端口。
-j MASQUERADE 这个动作和SNAT的作用是一样的,区别就是它不需要指定源地址。MASQUERADE被设计用于那些动态获取IP地址的连接的,比如拨号上网。MASQUERADE和SNAT一样,只能应用于nat表的POSTROUTING中。
–to-ports 在指定协义的前提下,设置外出包能使用的端口。例:–to-ports 1025或–to-ports 1024-1050。
-j LOG 记录包的有关信息,这个功能是通过内核的日志工具完成的,需要开启syslogd服务。
–log-level 记录等级设置,记录等级详细信息可以查看文件/etc/syslog.conf。
–log-prefix 在记录信息之前加上指定的前缀。如:–log-prefix “INPUT packets”
–log-tcp-sequence 把包的TCP序列号和其它日志信息一起记录下来。
–log-tcp-options 记录TCP包头中的字段大小不变的选项。
–log-ip-options 记录IP包头中的字段大小不变的选项。
-j MARK 用来设置mark值,这个值只能在本地的mangle表里使用,不能用在其它任何地方。
–set-mark 设置mark值,这个值是一个无符号的整数。
-j MIRROR 颠倒IP头中的源地址和目的地址,然后转发包。这个动作只能应就于INPUT、FORWARD、PREROUTING链和被它们调用的自定义链中,如果外出的包是因MIRROR target发出的,则它们是不会被filter、net、mangle表内的链处理的。
-j QUEUE 这个target为用户空间的程序或应用软件管理包队列。它是和iptables之外的程序或工具协同使用的,包括网络计数工具,高级的数据包代理或过滤应用,等等。
-j REDIRECT 在防火墙所在的机子内部转发包或流到另一端口。换包话说,这个target把要转发的包的目的地址改写为我们自已机子的IP。我们在做透明代理时,这个target可是起了很大作用的。
–to-ports 在指定协义前提下,定义目的端口。不使用这个选项,目的端口不会被改变。指定一个端口,如–to-ports 8080。指定端口范围,如–to-ports 8080-8090。
-j RETURN 若包在子链中遇到了RETURN target,则返回父链的下一条继续进行条件的比较。
-j TOS TOS是用来设置IP头中的Type of Service字段的。这个target只能应用于mangle表内使用。
–set-tos 设置TOS的值。
-j TTL 修改IP头中的Time To Live字段的值。只能用于mangle表中。
–ttl-set 设置TTL值。
–ttl-dec 设定TTL要被减掉的值。
–ttl-inc 设定TTL要被增加的值。
-ULOG 可以在用户空间记录被匹配的包信息,这些信息和整个包都会通过netlink socket被多播。然后一个或多个用户空间的进程就会接受它们。我们可以在ULOGD project page里面找ULOGD用户空间的软件。
–ulog-nlgroup 指定向哪个netlink组发送包。
–ulog-prefix 指定记录信息的前缀。
–ulog-cprange 指定每个包要向“ULOG在用户空间的代理”发送的字节数。
–ulog-qthreshold 表示先在内核里积聚多个少包,再把它们发送到用户空间里。

nsf文件系统

NFS服务简介
NFS是Network File System的缩写,即网络文件系统。NFS是由Sun开发并发展起来的一项用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。NFS server也可以看作是一个FILE SERVER,用于在UNIX类系统之间共享文件,可以轻松的挂载(mount)到一个目录上,操作起来就像本地文件一样的方便。

服务器端配置

在Redhat Linux下NFS是默认安装的

[root@linux-a ~]# rpm -qa | grep nfs
nfs-utils-1.0.9-16.el5
nfs-utils-lib-1.0.8-7.2

NFS配置文件设置

NFS服务的配置文件是etc/exports

exports文件内容格式:

<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

1.输出目录:
输出目录是指NFS系统中需要共享给客户机使用的目录;

2.客户端:
客户端是指网络中可以访问这个NFS输出目录的计算机

客户端常用的指定方式
指定ip地址的主机 192.168.0.200
指定子网中的所有主机 192.168.0.0/24
指定域名的主机 a.liusuping.com
指定域中的所有主机 *.liusuping.com
所有主机 *

3.选项:
选项用来设置输出目录的访问权限、用户映射等。NFS主要有3类选项:

访问权限选项
设置输出目录只读 ro
设置输出目录读写 rw

用户映射选项
all_squash 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash 与all_squash取反(默认设置);
root_squash 将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash 与rootsquash取反;
anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx 将远程访问的所有用户组都映射为匿名用 户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);

其它选项
secure 限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure 允许客户端从大于1024的tcp/ip端口连接服务器;
sync 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async 将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay 检查是否有相关的写操作,如果有则将这些写操作 一起执行,这样可以提高效率(默认设置);
no_wdelay 若有写操作则立即执行,应与sync配合使用;
subtree 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

NFS服务器配置实例
/nfs/public 192.168.0.0/24(rw,async) *(ro)
/nfs/frank 192.168.0.232(rw,sync)
/nfs/root *.liusuping.com(ro,no_root_squash)
/nfs/users *.liusuping.com(rw,insecure,all_squash,sync,no_wdelay)
/mnt/cdrom 192.168.0.*(ro)

注意:除了在配置文件中定义目录的读写权限外,还需要相应的目录具有相应的读写权限。

查看NFS共享目录信息
[root@linux-a ~]# exportfs
/nfs/public 192.168.0.0/24
/nfs/frank 192.168.0.232
/nfs/users *.liusuping.com
/mnt/cdrom 192.168.0.*
/nfs/root *.liusuping.com
/nfs/public

启动或停止NFS服务
[root@linux-a ~]# sevice nfs start|stop|restart
[root@linux-a ~]# chkconfig –level 35 nfs on //设置NFS自动启动方式;

客户端配置
Linux客户端可以直接通过mount命令挂载NFS文件

[root@linux-a ~]# mkdir /mnt/nsf1

[root@linux-a ~]# mount -t nfs 192.168.0.231:/nfs/frank /mnt/nfs1

[root@linux-a ~]# mount | grep nfs

[root@linux-a ~]# umount /mnt/nfs1

通过修改/etc/fstab文件可以实现开机自动挂载nfs目录

[root@linux-b nfs1]# vim /etc/fstab

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
192.168.0.231:/nfs/frank /mnt/nfs1 nfs defaults 0 0

Msiexec.exe应用程序错误解决方法

安装软件老是提示:

windows installer:msiexec.exe 应用程序错误 应用程序发生异常 unknown softwara exception (0×0000096),位置为0x23006f0a
解决方法:
请下载补丁:WindowsXP-KB942288-v3-x86.exe 安装即可解决.

开放平台oauth的一般开发流程

最近在开发一个oauth认证的开放平台,现在简要写下开发流程
开放平台一般流程:

1.获取未授权的Request Token https://www.oauth.com/open/request_token.php
2.请求用户授权Request Token https://www.oauth.com/open/authorize.php
3.使用授权后的Request Token换取Access Token https://www.oauth.com/open/access_token.php
4.使用 Access Token 访问或修改受保护资源 http://www.oauth.com/open/hello.php (这个是暂时测试用的API)

请求签名说明
所有TOKEN请求和受保护的资源请求必须被签名,微博开放平台会根据签名来判断请求的合法性。签名算法使用Signature Base String和密钥(Secret)生成签名,参数oauth_signature用于指定签名。

一、获取未授权的Request Token
通过访问以下 URL 获取未授权的 Request Token

http://www.oauth.com/open/request_token.php

返回结果:
oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&oauth_callback_confirmed=true

请求参数
oauth_consumer_key App Key(应用信息中的App Key值)
oauth_nonce 单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同)
oauth_signature_method 签名方法(HMAC-SHA1)
oauth_timestamp 时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数
oauth_version(可选) 版本号,如果有必须为“1.0”
oauth_callback 认证成功后浏览器会被重定向到这个url中
oauth_signature 签名值,密钥为:App Secret。

返回参数
oauth_token 未授权的Request Token
oauth_token_secret 对应的Request Token Secret
oauth_callback_confirmed 对oauth_callback的确认信号

二、请求用户授权Request Token
此步骤的目的是请求用户授权Request Token,请求URL:

https://www.oauth.com/open/authorize.php

返回结果:
oauth_token=hdk48Djdsa&oauth_verifier=473f82d3

请求参数:
oauth_token 上一步中获得的未授权的Request Token

返回参数:
oauth_token 用户授权之后的Token值,与未授权Token值相同。
oauth_verifier 验证码
①此页面中会要求用户登陆,然后选择同意或者拒绝对应用授权。
②授权成功后:web应用会重定向到oauth_callback所指定的URL(含返回参数)。

三、使用授权后的Request Token换取Access Token
通过访问以下 URL 获取授权的 Access Token

https://www.oauth.com/open/access_token.php

返回结果:
oauth_token=nnch734d00ls2jdk&oauth_token_secreate=pdkkdhi9sl3r4s00

请求参数:
oauth_consumer_key AppKey
oauth_token 第一步中获得的Request Token
oauth_signature_method 签名方法
oauth_signature 签名值 签名值,密钥为:App Secret&Request Token Secret
oauth_timestamp 时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数
oauth_nonce 单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同)
oauth_verifier 上一步请求授权request token时返回的验证码
oauth_version(可选) 版本号,有的话必须为“1.0”

返回参数:
oauth_token Access Token
oauth_token_secreate Access Token Secret
# ①本步骤用于签名的密钥为App Secret和Request Token Secret(中间使用&分隔)
# ②获得返回值后就可以使用Access Token来访问资源了。
# ③Access Token和Access Token Secret永远不会过期,直到用户撤销应用授权或腾讯回收您的app访问权限才会失效。

四、使用Access Token访问API

http://www.oauth.com/open/hello.php

在每次调用接口API时,请求都必须包含以下参数:
oauth_consumer_key AppKey
oauth_token Access Token
oauth_signature_method 签名方法,暂只支持HMAC-SHA1
oauth_signature 签名值,密钥为:App Secret&Access Token Secret。
oauth_timestamp 时间戳
oauth_nonce 单次值

core.php(配置文件)

session_start();

$appkey = '915d223fdcb3a70b4b72e81c3ac0f52e04e78253c';
$appsecret = '00e8a7cb0bae5f337c7b27b1e22b8d61';

$request_url    =  'http://www.oauth.com/open/request_token.php';
$access_url     =  'http://www.oauth.com/open/access_token.php';
$authorize_url  =  'http://www.oauth.com/open/authorize.php'; 

$timestamp      = time();
$randstr        = md5(rand().$timestamp);

/**
 * @brief 对参数进行字典升序排序
 *
 * @param $params 参数列表
 *
 * @return 排序后用&链接的key-value对(key1=value1&key2=value2...)
 */
function get_normalized_string($params)
{
    ksort($params);
    $normalized = array();
    foreach($params as $key => $val)
    {
        $normalized[] = $key."=".$val;
    }

    return implode("&", $normalized);
}

/**
 *
 * Enter description here ...
 * @param unknown_type $str
 */
function QQConnect_urlencode($str)
{
	if ($str === false)
	{
		return $str;
	}
	else
	{
		return str_replace('%7E', '~', rawurlencode($str));
	}
}

/**
 * @brief 使用HMAC-SHA1算法生成oauth_signature签名值
 *
 * @param $key  密钥
 * @param $str  源串
 *
 * @return 签名值
 */

function signature (  $base_string, $consumer_secret, $token_secret )
{
	$key = QQConnect_urlencode($consumer_secret).'&'.QQConnect_urlencode($token_secret);
	if (function_exists('hash_hmac'))
	{
		$signature = base64_encode(hash_hmac("sha1", $base_string, $key, true));
	}
	else
	{
	    $blocksize	= 64;
	    $hashfunc	= 'sha1';
	    if (strlen($key) > $blocksize)
	    {
	        $key = pack('H*', $hashfunc($key));
	    }
	    $key	= str_pad($key,$blocksize,chr(0x00));
	    $ipad	= str_repeat(chr(0x36),$blocksize);
	    $opad	= str_repeat(chr(0x5c),$blocksize);
	    $hmac 	= pack(
	                'H*',$hashfunc(
	                    ($key^$opad).pack(
	                        'H*',$hashfunc(
	                            ($key^$ipad).$base_string
	                        )
	                    )
	                )
	            );
		$signature = base64_encode($hmac);
	}
	return QQConnect_urlencode($signature);
}

request_token.php(请求token)

include_once 'core.php';

$params['oauth_consumer_key']     = $appkey;
$params['oauth_nonce']            = $randstr;
$params['oauth_signature_method'] = 'HMAC-SHA1';
$params['oauth_timestamp']        = $timestamp;
$params['oauth_version']          = '1.0';
$params['oauth_callback']         = QQConnect_urlencode('http://www.demo.dev/callback.php');

$sigstr         = "GET"."&".QQConnect_urlencode($request_url)."&";
$normalized_str = get_normalized_string($params);
$sigstr        .= QQConnect_urlencode($normalized_str);
$signature      = signature($sigstr, $appsecret, '');

$url = $request_url.'?'.$normalized_str.'&'.'oauth_signature='.$signature;

$oauth_ts = file_get_contents($url);
$ots = array();
parse_str($oauth_ts,$ots);
$oauth_token = $ots['oauth_token'];
$oauth_token_secret = $ots['oauth_token_secret'];

$_SESSION['oauth_token']         = $oauth_token;
$_SESSION['oauth_token_secret']  = $oauth_token_secret;

echo '<a href="'.$authorize_url.'?oauth_token='.$oauth_token.'&amp;oauth_callback='.urlencode('http://www.demo.dev/callback.php').'">click me</a>';

callback.php(返回token认证)

include_once 'core.php';

$oauth_token       = $_GET['oauth_token'];
$oauth_verifier    = $_GET['oauth_verifier'];

$params['oauth_consumer_key']     = $appkey;
$params['oauth_nonce']            = $randstr;
$params['oauth_signature_method'] = 'HMAC-SHA1';
$params['oauth_timestamp']        = $timestamp;
$params['oauth_token']            = $oauth_token;
$params['oauth_verifier']         = $oauth_verifier;
$params['oauth_version']          = '1.0';

$sigstr     = "GET"."&".QQConnect_urlencode($access_url)."&";

//参数按照字母升序做序列化
$normalized_str = get_normalized_string($params);
$sigstr        .= QQConnect_urlencode($normalized_str);
$signature      = signature($sigstr, $appsecret, $_SESSION['oauth_token_secret']);

 $url  = $access_url.'?'.$normalized_str.'&'.'oauth_signature='.$signature;
//echo "<a href='".$url."'>get access token</a>"; 

$oauth_ts = file_get_contents($url);
$ots = array();
parse_str($oauth_ts,$ots);

$_SESSION['access_token'] = $ots['oauth_token'];
$_SESSION['access_token_secret'] = $ots['oauth_token_secret'];

api.php(请求接口)

include_once 'core.php';

$timestamp = time();
$randstr = md5(rand().$timestamp);

$url = 'http://www.oauth.com/open/api/user.php/info';

$params['oauth_consumer_key']     = $appkey;
$params['oauth_token']            = $_SESSION['access_token'];
$params['oauth_signature_method'] = 'HMAC-SHA1';
$params['oauth_timestamp']        = $timestamp;
$params['oauth_nonce']            = $randstr;

$sigstr = "GET"."&".QQConnect_urlencode($url)."&";

$normalized_str = get_normalized_string($params);
$sigstr        .= QQConnect_urlencode($normalized_str);
$signature      = signature($sigstr, $appsecret, $_SESSION['access_token_secret']);

$url = $url.'?'.$normalized_str.'&'.'oauth_signature='.$signature;

$resutl = file_get_contents($url);
echo $resutl;

apache https的配置过程

最近项目需要用到SSL的https服务,所以就研究了下SSL的配置,现记录下当时的配置。

1、确认是否安装ssl模块

是否有mod_ssl.so文件

2、生成证书和密钥

linux下

步骤1:生成密钥

命令:openssl genrsa 1024 > server.key

说明:这是用128位rsa算法生成密钥,得到server.key文件

步骤2: 生成证书请求文件

命令:openssl req -new -key server.key > server.csr

说明:这是用步骤1的密钥生成证书请求文件server.csr, 这一步提很多问题,一一输入

步骤3: 生成证书

命令:openssl req -x509 -days 365 -key server.key -in server.csr > server.crt

说明:这是用步骤1,2的的密钥和证书请求生成证书server.crt,-days参数指明证书有效期,单位为天

window下

步骤1:生成密钥
命令:openssl genrsa 1024 > server.key
说明:这是用128位rsa算法生成密钥,得到server.key文件

步骤2: 生成证书请求文件
命令:openssl req -config D:\work_soft\Apache2.2\conf\openssl.cnf -new -key server.key > server.csr
说明:这是用步骤1的密钥生成证书请求文件server.csr, 这一步提很多问题,一一输入

步骤3: 生成证书
命令:openssl req -config D:\work_soft\Apache2.2\conf\openssl.cnf -x509 -days 365 -key server.key -in server.csr > server.crt
说明:这是用步骤1,2的的密钥和证书请求生成证书server.crt,-days参数指明证书有效期,单位为天

把得到的server.key和server.crt文件拷贝到apache的对应目录

3、配置apache

l 修改httpd-ssl.conf文件

注意在此文件中配置证书和密钥

SSLCertificateFile /apache/conf/server.crt

SSLCertificateKeyFile /apache/conf/server.key

虚拟机设置

NameVirtualHost *:443

…………

l 修改httpd.conf文件

步骤1:打开ssl模块

LoadModule ssl_module /opt/taobao/install/httpd/modules/mod_ssl.so

步骤2:引入ssl配置文件

Include “/apache/conf/httpd-ssl.conf”

步骤3:如果你配置的虚拟机,注意一下端口的访问接受情况

NameVirtualHost *:80

…………

4、重新启动apache

用https方式访问,查看是否生效