Monthly Archives: May 2012

Debian5(lenny)升级至Deiban6(squeeze)

VPS上只有Debian5的模板,需要升级为Debian6.

1.修改source.list为Debian6

# vi /etc/apt/sources.list
deb http://ftp.us.debian.org/debian/ squeeze main
deb-src http://ftp.us.debian.org/debian/ squeeze main
deb http://security.debian.org/ squeeze/updates main
deb-src http://security.debian.org/ squeeze/updates main
deb http://volatile.debian.org/debian-volatile squeeze/volatile main
deb-src http://volatile.debian.org/debian-volatile squeeze/volatile main

注意:volatile.debian.org已经不在官方源了,注意

2.执行升级命令

首先清除原有信息:

#apt-get clean
#apt-get update
#apt-get install apt dpkg aptitude
#apt-get dist-upgrade

3.重启即可

申请SSL证书以及Nginx配置

申请的namecheap的ssl证书(其实namacheap也是comodo的代理),首先要创建Certificate Signing Request (CSR)后才能把CSR输入网站,邮件验证后才能生成证书。

1. 在服务器上创建Certificate Signing Request (CSR)

要使用SSL必须有独立IP地址,所有共享IP的虚拟主机是没有办法申请的。首先把目录切换到Nginx的conf文件目录:

#cd /usr/local/nginx/conf
#openssl req -nodes -newkey rsa:2048 -keyout myserver.key -out server.csr

运行上述命令后就在目录下创建了两个文件:myserver.key和server.csr.myserver.key是你的私钥,要妥善保管。然后openssl会让你输入一些信息:

Country Name (2 letter code) [AU]: GB
State or Province Name (full name) [Some-State]: Yorks
Locality Name (eg, city) []: York
Organization Name (eg, company) [Internet Widgits Pty Ltd]: MyCompany Ltd
Organizational Unit Name (eg, section) []: IT
Common Name (eg, YOUR name) []: mysubdomain.mydomain.com
Email Address []:

域名一定要输入你的域名,email也要输入注册域名时候的whois信息中的邮箱地址。

A challenge password []:
An optional company name []:

这两项可以留空。

然后运行下面命令,显示CSR文件内容:

#cat server.csr

把包含“—–BEGIN CERTIFICATE REQUEST—– ”和“—–END CERTIFICATE REQUEST—– ”在内的内容拷贝。

2. 验证

把CSR的信息输入namecheap后,第二步会有一个可选的邮件地址让你选择,本别是admin@youdomain.com或者webmaster@youdomain.com还有你的whois信息中的邮箱地址,我让选了了whois信息中的邮箱地址。namecheap会向这个邮箱发送一封验证信,根据信中的地址输入验证码后就会向你发送包含证书文件的压缩包了。

解压后把这三个文件通过FTP或者SFTP上传到Nginx的conf目录。

3.Nginx配置文件
Nginx的配置文件需要两个文件,一个是SSL的私钥,也就是刚才第一步创建的myserver.key;另一个是comodo通过邮件发给我的压缩包中文件的“合体”:

cat www_yourdomain_com.crt PositiveSSLCA2.crt AddTrustExternalCARoot.crt >> ssl-bundle.crt

创建的ssl-bundle.crt就是所需的“合体”。
下面创建一个ssl.conf:

server
{
        listen      443;
        server_name yourdomain.com www.yourdomain.com;
        index index.html index.htm index.php;
        root /home/wwwroot;
        ssl on;
        ssl_certificate ssl-bundle.crt;
        ssl_certificate_key myserver.key;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;
        location ~ .*\.(php|php5)?$
        {
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        fastcgi_param  HTTPS on;
        include fcgi.conf;
        }
        access_log  off;
}

然后在ningx.conf中引用这个ssl.conf即可。

6.Nginx子目录rewrite
如果网站全部通过https访问的话,肯定会给服务带来很多压力(ssl证书每次加密需要CPU运算),所以我只希望某些子目录使用https访问,并且对使用http访问的强制转向至https:

server {
        listen          80;
        server_name     domain.com;

        location / {
                index index.php index.html;
                root  /home/domain.com/public;
                }

        #Redirect Admin requests to secure server
        location ^~ /www/admin/ {
                rewrite ^/(.*) https://domain.com$1 permanent;
                }
}

这样就能强制所有试图用http访问/www/admin/子目录的请求rewrite至https,增加网站的安全性。

5.结尾
重启后通过https就能访问网站了,不过我发现申请comodo廉价SSL证书后,浏览器并没有出现像其他大网站SSL访问时候的效果:

我申请的征收只有显示一把绿色的锁而已,后来查了Google的说明才知道,那样效果的SSL证书是EV SSL证书,价格比较贵:

图标 含义
圆球 此网站未使用 SSL。大多数网站不需要使用 SSL,因为它们不处理敏感信息。请避免在此类网页上输入敏感信息,比如用户名和密码。
锁定图标绿色的 https Google Chrome 浏览器成功地与该网站建立了安全连接。如果您需要登录该网站或在该网页上输入敏感信息,请查找此图标并确保该网址具有正确的域名。

如果网站使用了扩展验证安全套接字层 (EV-SSL) 证书,则单位名称也会以绿色字体显示在该图标旁。请务必将浏览器设置为检查服务器证书吊销状态,以鉴别网站是否有 EV-SSL 证书。

提醒图标 黄色的 https 该网站使用 SSL,但 Google Chrome 浏览器在网页上检测到不安全的内容。请勿轻易在此网页上输入敏感信息。不安全的内容会产生漏洞,给他人提供更改网页外观的可乘之机。
提醒图标 红色的 https 该网站使用 SSL,但 Google Chrome 浏览器在该网页上检测到高风险的不安全内容或该网站的证书有问题。请勿在此网页上输入敏感信息。无效证书或其他严重的 https 问题表明有人试图篡改您与该网站的连接。

Nginx实现目录密码保护

web目录的管理目录一般都不希望除了管理员之外的人访问吗,当然php内置的用户验证安全性非常重要,如果在web服务器上加入目录访问验证的话,效果当然更好。目前我用的是Nginx,需要如下开启目录访问密码验证:

location /secret {
   auth_basic            "Restricted";
   auth_basic_user_file  /etc/htpasswd;
 }

这样设置的话,如果用户访问secret目录的话,首先要接受Nginx本身内置的密码验证系统(保存在/etc/htpasswd文件中)。但是如何创建这个密码验证文件?如果安装了Apache的话,apache内置有生成htpasswd的工具,nginx的话只有利用shell的内置工具:

printf "user:$(openssl passwd -crypt yourdomian)\n" >> /etc/htpasswd

上面的命令就能创建一个用户名为user,密码为yourdomian的用户。

但是如果被保护的web目录中包含有php文件的话,直接访问php的话就不需要输入密码了,需要把Nginx的conf文件改一下:

location /secret {
   auth_basic            "Restricted";
   auth_basic_user_file  /etc/htpasswd;
   location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        include        fastcgi.conf;
    }
}

把php的解析复制一段,放在对secret目录里面,再访问这个目录里面的php文件的话就需要输入密码了。

iptables屏蔽php-fpm的端口

有个VPS用户安装了lnmp后又安装了VPN安装包,结果造成php无法解析,当把iptables暂停的时候php解析正常,所以猜想是iptables屏蔽了php-fpm的端口的原因,查看/etc/sysconfig/iptables:

# Generated by iptables-save v1.3.5 on Mon May 21 23:54:04 2012
*nat
:PREROUTING ACCEPT [135:17888]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [19:1172]
-A POSTROUTING -j MASQUERADE
-A POSTROUTING -j MASQUERADE
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Mon May 21 23:54:04 2012
# Generated by iptables-save v1.3.5 on Mon May 21 23:54:04 2012
*filter
:INPUT ACCEPT [358:40386]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [179:40626]
COMMIT
# Completed on Mon May 21 23:54:04 2012

在filter中有限制端口,把整个filter内容全部删除后重启iptables正常。

不过很奇怪,在VPN安装包中,只有下面的几行iptables设置:

iptables -F
service iptables save
iptables --table nat --append POSTROUTING --jump MASQUERADE
service iptables save

目的只是加入了nat的转发,但是iptables竟然添加了默认的filter?

Excel指定某区域字符串相加

我手里有一个表,从A1到A100都联系人邮箱,我想把这些联系人邮箱地址通过“,”加起来,然后就能用邮件系统发送邮件了,但是Excel竟然没有这个函数,只有通过VBA实现功能了。

Sub test()
    Dim str$, rng As Range
    str = ""
    For Each rng In [a1].CurrentRegion
        str = str & "," & rng
    Next
    [D1] = Right(str, Len(str) - 1)
End Sub

运行这个VBA,就能在D1这一个单元格中显示从A1到A100的所有邮件地址合并了。

发现CurrentRegion是好玩的属性,能返回所有连接的区域内所有单元格的属性:

http://www.excelperfect.com/index.php/2009/07/23/usecurrentregionproperty/