使用GnuPG 签名来保护邮件安全 

玩电子邮件这么多年,一直没有怎么注重安全,最开始是连POP3,SMTP都是明文方式,再后来IMAP逐渐火了起来,TLS/SSL 加密协议才逐渐的被普遍使用~

不过,今天,我要正式的进入PGP/GPG时代了~因为用户的隐私是一个值得重视的问题~

于是,就在昨天我生成了我自己的密钥对(公钥和私钥),
1.首先,确认Ubuntu 已经安装了GPG(GnuPG),如下:

sharl@sharl-laptop:~/gpg$ gpg --version
gpg (GnuPG) 1.4.11
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
支持的算法:
公钥: RSA, RSA-E, RSA-S, ELG-E, DSA
对称加密: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
CAMELLIA192, CAMELLIA256
散列: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩: 不压缩, ZIP, ZLIB, BZIP2

2.之后,便可以使用GPG去生成我的密钥对了.

sharl@sharl-laptop:~/gpg$ gpg --gen-key
gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

请选择您要使用的密钥种类:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
您的选择? 4 #选择加密类型,一般选1,我这里为了测试选了4
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048) 1024
您所要求的密钥尺寸是 1024 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 1 #选择密钥过期时间,一般选"0"永不过期.
密钥于 2011年09月19日 星期一 11时57分14秒 CST 过期
以上正确吗?(y/n) y #确认信息正确性

您需要一个用户标识来辨识您的密钥;本软件会用真实姓名、注释和电子邮件地址组合
成用户标识,如下所示:
“Heinrich Heine (Der Dichter) <[email protected]>”

真实姓名: Tester #输入姓名
电子邮件地址: [email protected] #输入邮箱地址
注释: Just Test #输入注释
您选定了这个用户标识:
“Tester (Just Test) <[email protected]>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? O #确认数据正确性
您需要一个密码来保护您的私钥。
#这里会要求用户输入密码口令,两次。用于解开私钥。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
+++++
+++++
gpg: 密钥 4E9638A9 被标记为绝对信任
公钥和私钥已经生成并经签名。

gpg: 正在检查信任度数据库
gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
gpg: 深度:0 有效性: 2 已签名: 0 信任度:0-,0q,0n,0m,0f,2u
gpg: 下次信任度数据库检查将于 2011-09-19 进行
pub 1024R/4E9638A9 2011-09-18 [有效至:2011-09-19]
密钥指纹 = 046D 7880 874C E825 2D36 9A47 3B53 0E6E 4E96 38A9
uid Tester (Just Test) <[email protected]>

请注意这把密钥还不能用来加密,您必须先用“--edit-key”指令
生成用于加密的子钥。

3.一般到这里,生成的密钥对应该可以用了,不过由于我之前选择的类型是"RSA (仅用于签名)",所以我还得额外的添加一个用于加密的子钥.

sharl@sharl-laptop:~/gpg$ gpg --edit-key 4E9638A9 #uid 就是之前生成的“1024R/4E9638A9” 后面部分,即用户标识
gpg (GnuPG) 1.4.11; Copyright (C) 2010 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私钥可用。

pub 1024R/4E9638A9 创建于:2011-09-18 有效至:2011-09-19 可用于:SC
信任度:绝对 有效性:绝对
绝对 (1). Tester (Just Test) <[email protected]>

gpg> addkey #添加子钥
密钥受保护。
#这里需要输入之前创建的私钥密码口令.
您需要输入密码,才能解开这个用户的私钥:“Tester (Just Test) <[email protected]>”
1024 位的 RSA 密钥,钥匙号 4E9638A9,建立于 2011-09-18

请选择您要使用的密钥种类:
(3) DSA (仅用于签名)
(4) RSA (仅用于签名)
(5) ElGamal (仅用于加密)
(6) RSA (仅用于加密)
您的选择? 4 #选择RSA
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048) 1024
您所要求的密钥尺寸是 1024 位
请设定这把密钥的有效期限。
0 = 密钥永不过期
<n> = 密钥在 n 天后过期
<n>w = 密钥在 n 周后过期
<n>m = 密钥在 n 月后过期
<n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 1 #供测试,一天过期
密钥于 2011年09月19日 星期一 12时04分16秒 CST 过期
以上正确吗?(y/n) y #确认信息正确性
真的要建立吗?(y/N) y #再次确认
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
.....+++++
.+++++

pub 1024R/4E9638A9 创建于:2011-09-18 有效至:2011-09-19 可用于:SC
信任度:绝对 有效性:绝对
sub 1024R/F4A49466 创建于:2011-09-18 有效至:2011-09-19 可用于:S
绝对 (1). Tester (Just Test) <[email protected]>

gpg> save #保存,退出

4.至此,我的密钥对算是完全建立了,也可以用了。查看下我刚刚创建的私钥:
sharl@sharl-laptop:~/gpg$ gpg -K 4E9638A9
sec 1024R/4E9638A9 2011-09-18 [有效至:2011-09-19]
uid Tester (Just Test) <[email protected]>
ssb 1024R/F4A49466 2011-09-18 [有效至:2011-09-19]

5.这时候,我得把生成的公钥上传到网络上的公钥服务器(如 pgp.mit.edu )里面去,这样的话,别人收到了我用私钥加过密的邮件,才能有办法从公共的公钥服务器上获取对应的公钥去解密。不然那封邮件就是天书了~囧

上传公钥:
sharl@sharl-laptop:~/gpg$ gpg --send-keys --keyserver pgp.mit.edu 4E9638A9
gpg: 将密钥‘4E9638A9’上传到 hkp 服务器 pgp.mit.edu

完了之后,上传的公钥就会被全世界所有的公钥服务器同步上去,也就是说任何人都可以在任意一台公钥服务器上找到我上传的公钥了。

比如:
麻省理工的服务器上:
http://pgp.mit.edu:11371/pks/lookup?op= ... 6E4E9638A9

ubuntu 的 keyserver:
http://keyserver.ubuntu.com:11371/pks/l ... ;op=vindex

注:这里有一份全球主要公钥服务器的列表,见:http://sks-keyservers.net/status/

6.待这一切都搞定后,就可以配置下本地的邮件客户端了~基本上所有的邮件客户端都是支持PGP签名的。

我是使用的Mozilla 的Thunderbird的,它不像Evolution 原生支持PGP,而是要安装一个叫“enigmail”插件.

sudo apt-get install enigmail

安装之后,重启thunderbird,菜单栏里会多出来一个"安全"项.点击“设置”,根据向导提示,完成设置即可.具体不再赘述。

7.为了方便日后使用,一般建议把密钥的用户标识设置成系统环境变量,如下:
export GPGKEY=4E9638A9
source ~/.bashrc #使之生效

之后重启下gpg-agent(没有则安装 sudo apt-get install gnupg-agent )
killall gpg-agent
eval $(gpg-agent --daemon)
即可.

8.至此,其实一切都完成了。不过根据官方的建议,即在创建完密钥对后,强烈推荐备份公钥和私钥,已经生成吊销证书,以备不时之需。

所以:
备份私钥
sharl@sharl-laptop:~/gpg$ gpg -o tester_priv.asc -a --export-secret-key 4E9638A9

备份公钥
sharl@sharl-laptop:~/gpg$ gpg -o tester_pub.asc -a --export 4E9638A9

生成、备份密钥吊销证书
sharl@sharl-laptop:~/gpg$ gpg -o tester_revoke.asc --gen-revoke 4E9638A9

sec 1024R/4E9638A9 2011-09-18 Tester (Just Test) <[email protected]>

要为这把密钥建立一份吊销证书吗?(y/N) y #选“是”
请选择吊销的原因:
0 = 未指定原因
1 = 密钥已泄漏
2 = 密钥被替换
3 = 密钥不再使用
Q = 取消
(也许您会想要在这里选择 1)
您的决定是什么? 0 #选择原因
请输入描述(可选);以空白行结束:
> Just a Test. #输入理由
>
吊销原因:未指定原因
Just a Test.
这样可以吗? (y/N) y #确认信息正确性

您需要输入密码,才能解开这个用户的私钥:“Tester (Just Test) <[email protected]>”
1024 位的 RSA 密钥,钥匙号 4E9638A9,建立于 2011-09-18
#这里需要输入私钥的口令密码
已强行使用 ASCII 封装过的输出。
已建立吊销证书。

请把这个文件转移到一个可隐藏起来的介质(如软盘)上;如果坏人能够取得这
份证书的话,那么他就能让您的密钥无法继续使用。把这份凭证打印出来再藏
到安全的地方也是很好的方法,以免您的保存媒体损毁而无法读取。但是千万
小心:您的机器上的打印系统可能会在打印过程中把这些数据临时在某个其他
人也能够看得到的地方!

生成的文件列表:
sharl@sharl-laptop:~/gpg$ ls tester* -lh
-rw-r--r-- 1 sharl sharl 2.2K 2011-09-18 12:51 tester_priv.asc
-rw-r--r-- 1 sharl sharl 1.3K 2011-09-18 12:52 tester_pub.asc
-rw-r--r-- 1 sharl sharl 398 2011-09-18 12:53 tester_revoke.asc

保存在一个隐秘的地方即可。

至此,一切都OK了~尽情享受完全隐私的互联网吧~

注:本篇文章撰写以及实践时,参考了以下链接:
http://www.gnupg.org/gph/en/manual.html
https://help.ubuntu.com/community/GnuPrivacyGuardHowto
http://fedoraproject.org/wiki/Using_GPG ... hunderbird
http://enigmail.mozdev.org/documentatio ... t.php.html
[ ] ( 2607 次浏览 ) 永久链接 ( 3 / 2918 )
Typecho 在 Hiawatha web server 上的伪静态写法 

现在很多的人从Wordpress 转到了Typecho,从Apache httpd 转到了 Nginx.不得不说,typecho + nginx 是一个比较流行的博客搭配~

可是,使用除nginx外的其他用户就成了缺少支持的群体了,就拿typecho 来讲,它的官方doc(http://docs.typecho.org/servers)里面就没有提到除nginx 外的其他web server,连apache 也是轻描淡写的带过了。

那么,lighttpd 肿么办?hiawatha 肿么办?cherokee 肿么办?

没办法,只能用户自己搞定。

我就是一名typecho + hiawatha 的用户,一直以来,我的伪静态就不太理想,前台还行,后台很坑爹,基本属于不能用。

这是typecho 给出的适用于nginx的伪静态:

if (!-e $request_filename) {
rewrite ^(.*)$ /index.php$1 last;
}

location ~ .*\.php(\/.*)*$ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}


我之前照着写过一个给hiawatha用,不是很完美~见下:

UrlToolkit {
ToolkitID = te
RequestURI exists Return
Match ^.*$ Rewrite /index.php$1
}


一直想把这个问题修复,今天在逛hiawatha的在线手册(http://www.hiawatha-webserver.org/manpages)的时候,无意发现了EnablePathInfo 标签,见下:

EnablePathInfo = yes|no
Accepts URLs like /index.php/parameter if /index.php exists and the extension .php has been configured as a CGI program. '/parameter' will be placed in the environment variable PATH_INFO.
Default = no, example: EnablePathInfo = yes


我忽然明白了hiawatha 和 nginx 的不同之处~火速编辑我的hiawatha配置文件,改成如下:

VirtualHost {
Hostname = xiazhengxin.name,blog.xiazhengxin.name
WebsiteRoot = /home/http/blog_xiazhengxin_name
StartFile = index.php
UseFastCGI = PHP4TE
UseToolkit = te
ShowIndex = yes
FollowSymlinks = yes
EnablePathInfo = yes #加了这一行
# AccessList = allow 127.0.0.1,deny all
}


即启用PHP 的PathInfo功能。果然,重启hiawatha,伪静态完美了~
[ ] ( 3566 次浏览 ) 永久链接 ( 3 / 2797 )
修复Ubuntu Natty 64位 在DELL OptiPlex 790 机器上无法重启的问题 

这个坑爹的问题,在我拿到公司刚配的DELL OptiPlex 790型号的电脑的当天就发现了~当我兴冲冲的安装好最新的Ubuntu 11.04 Natty,打好最新的内核补丁,我发现重启后,机器没反应了。只能强制关机了~

我发现这可能是一个bug,我先是在Ubuntu的邮件列表里面提出了问题,果然很多人有这个问题,不仅仅是DELL OptiPlex 790的问题,还有DELL OptiPlex 的其他64位机型.

之后,我便向ubuntu 提交了这个bug,见:https://bugs.launchpad.net/ubuntu/+source/linux/+bug/819260

等啊等,这个bug一直没有得到修复。直到几天前,一个patch 解决了这个问题。现在只需要下载最新的linux kernel 源码,打入这个patch.编译并安装使用上该内核。重启就不会再假死拉~

下载该patch(感谢Leann Ogasawara),地址:http://ftp.xiazhengxin.name/xzx/patch/0004-UBUNTU-SAUCE-x86-reboot-Make-Dell-Optiplex-790-use-r.patch

下载最新的Linux kernel (3.0.4),地址:http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.4.tar.bz2

解压内核,进入目录:
1.打入重启补丁:
patch arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c /path/to/0004-UBUNTU-SAUCE-x86-reboot-Make-Dell-Optiplex-790-use-r.patch

2.编译内核:
make allyesconfig
生成临时.config 文件。


使用Ubuntu 的.config 文件编译,一般位于/boot/下,如下:
sharl@sharl-laptop:~$ ls /boot/config* -lh
-rw-r--r-- 1 root root 135K 2011-08-30 05:58 /boot/config-2.6.38-11-generic
-rw-r--r-- 1 root root 135K 2011-04-29 05:13 /boot/config-2.6.38-9-generic

复制过来,覆盖
cp /boot/config-X.X.XX-XX-generic ./.config

接来来,开始编译(时间很长~)
make

3.编译完成后,打成debian 包.
首先安装工具包:
sudo apt-get install kernel-package

之后,打包(时间也很长):
fakeroot make-kpkg --initrd --append-to-version=-by-sharl kernel-image kernel-headers

完成之后。就会在源码目录的上层目录里面发现,生成的deb包.
4.安装内核.
依次安装 linux-image、linux-headers包.
dpkg -i linux-image*
dpkg -i linux-headers*

5.关机.(现在重启还没好~)
6.再开机即可。

至此,我的DELL OptiPlex 790 就可以正常的重启拉~

注:
1.如果你不想自己重新编译内核,这里有我编译好的.可供下载.
http://ftp.xiazhengxin.name/xzx/linux-kernel/

2.DELL 其他机型重启内核补丁下载,见:
http://people.canonical.com/~ogasawara/ ... ot-quirks/

3.编译内核时,参考了Ubuntu官方文档,地址:
https://help.ubuntu.com/community/Kernel/Compile
[ ] ( 1968 次浏览 ) 永久链接 ( 3 / 2706 )
在Ubuntu 下导入CyanogenMod 的模块项目到Eclipse 

其实,这篇文章着实不应该发布在我的GNU/Linux学习站,因为这和GNU/Linux应该没有半毛钱关系~不过又实在没地方可放,所以只能发表于此了~(如果非要和GNU/Linux车上点关系,那就是是在Ubuntu下操作的 囧rz)

好了,言归正传。很多Android开发者都会或多或少的在现有项目的基础上进行二次开发,而我的工作则是基于著名的第三方Android ROM - CyanogenMod 进行的。

比如,改进下短信模块(MMS),改善下拨号界面(Contacts)等等,这个时候我就需要导入CM的单个模块到我的IDE(即Eclipse Platform)中。

一般的做法是,在Eclipse 中新建一个Android 项目,然后勾选掉“使用默认路径”,选中“使用已存在的路径”,再定位到指定模块的目录(如src/packages/apps/Mms),就可以导入了。

不过,这样的做法会有一个问题,那就是Eclipse的Egit不会认出该模块项目下的.git,也就是说我不能在导入的这个项目上使用版本控制。这的确很坑爹~

但是,这个方法也是
CM的官方WIKI(http://wiki.cyanogenmod.com/wiki/Loading_source_in_eclipse)

Android 官方的文档(http://source.android.com/source/using-eclipse.html)
里面建议的做法。

不过我本人极力的不推荐那样做,特别是前者,除了上面说到的没有GIT之外,它的.classpath 文件还会在你的项目下新增一堆用不到的文件夹。

好在,现在我找到了一个更好的办法~那就是:

1.打开Eclipse SDK.
2.选择菜单 "File"->"Import From".
3.选择GIT项下的 "From existed GIT Project".
4.点击 "Add",浏览到要导入模块的目录,如Mms.
5.点击 "Refresh",这时候会显示出 Mms.git,确定即可。
6.选择 "Import as General Project",下一步即可(要确保项目根目录下没有.project文件).
7.点击 "Finish".这个时候项目已经被导入进Eclipse了。不过还没完。
8.下载我事先准备好的模板(http://ftp.xiazhengxin.name/xzx/etc/pre-standard-template-for-android-project.7z),解压,覆盖至项目根目录下。
9.先 “Close Project”,再 "Open Project"下,最好在 "Refresh" 下。
10.右击项目,选择右键菜单 "Android Tools" -> "Fix Project Property".
11.你会发现,一个带有GIT的、可编译的CM模块项目回来了~

注:打开我提供的预模板,其实里面一共就三个文件: .project、.classpath、default.properties。
其实这些文件都是我之前以"Android Project"方式导入模块项目时,自动生成的。只不过为了以"GIT Project" 方式导入,预先删除了。待导入之后,又放进来了。

原理就是这样。
[ ] ( 2090 次浏览 ) 永久链接 ( 2.9 / 2719 )
升级安装 Hiawatha 7.6、nginx 1.1.1 和 Varnish Cache 3.0.1 RC1 

本周我所使用的web server —— Hiawatha 发布了7.6的版本,重写了关于防止SQL注入方面的模块,官方推荐升级标记为低。考虑到稳定性,我决定还是跟进,因为hiawatha 并不常更新。

还有就是我所使用的缓存服务器varnish 也放出了3.0.1的测试版 RC1,考虑到前一版本的varnishadm 有点问题,我也打算更新到该版本。

最后就是nginx 发布了1.1.1的光棍版,本来我用1.0.4版用的好好的,唯一不爽的就是时区总是不对。我怀疑是在编译安装时被定义死了,所以我便打算重新编译一个版本,看看能不能修复这个问题。

首先,停掉相关所有服务。
killall hiawatha
killall nginx
killall varnishd

删除所有旧程序,备份配置文件。

现在,开始安装新版本。首先是hiawatha.
下载源码包(http://www.hiawatha-webserver.org/files/hiawatha-7.6.tar.gz),解压,进入目录:

我的configure:
[root@PowerPC hiawatha-7.6]# ./configure \
> --prefix=/usr/local/hiawatha \
> --exec-prefix=/usr/local \
> --sysconfdir=/etc/sysconfig \
> --localstatedir=/var \
> --disable-largefile \
> --enable-chroot \
> --enable-command \
> --disable-ipv6 \
> --disable-monitor \
> --disable-ssl

检查依赖,没有问题,接下来make && make install安装.一切顺利。之后,覆盖掉新生成的配置文件即可。

便可以启动hiawatha服务器了。

接来下是nginx,下载源码包(http://nginx.org/download/nginx-1.1.1.tar.gz),解压,进入目录:

我的configure:
[root@PowerPC nginx-1.1.1]# ./configure \
> --prefix=/usr/local/nginx \
> --sbin-path=/usr/local/sbin/nginx \
> --conf-path=/etc/sysconfig/nginx/nginx.conf \
> --error-log-path=/var/log/nginx/error.log \
> --pid-path=/var/run/nginx.pid \
> --lock-path=/tmp/nginx.lock \
> --user=http \
> --group=web \
> --with-select_module \
> --with-poll_module \
> --with-http_image_filter_module \
> --with-http_dav_module \
> --with-http_flv_module \
> --with-http_gzip_static_module \
> --without-http_ssi_module \
> --without-http_auth_basic_module \
> --without-http_geo_module \
> --without-http_rewrite_module \
> --without-http_proxy_module \
> --without-http_fastcgi_module \
> --without-http_uwsgi_module \
> --without-http_scgi_module \
> --http-log-path=/var/log/nginx/access.log \
> --http-client-body-temp-path=/tmp/nginx/request \
> --without-mail_pop3_module \
> --without-mail_imap_module \
> --without-mail_smtp_module \
> --without-pcre

检查依赖,没有任何问题。之后configure给出了编译概况,见下:

Configuration summary
+ PCRE library is disabled
+ OpenSSL library is not used
+ md5: using system crypto library
+ sha1 library is not used
+ using system zlib library

nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/sbin/nginx"
nginx configuration prefix: "/etc/sysconfig/nginx"
nginx configuration file: "/etc/sysconfig/nginx/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "/tmp/nginx/request"


确认一下,没有任何问题,make && make install 编译安装至指定目录。然后在恢复下配置文件,即 nginx.conf 文件。便可以启动nginx 服务器了~

最后就是varnish cache 了,下载源码包(http://repo.varnish-cache.org/source/varnish-3.0.1-rc1.tar.gz),解压,进入目录:

我的configure:
[root@PowerPC varnish-3.0.1-rc1]# ./configure \
> --prefix=/usr/local/varnish \
> --exec-prefix=/usr/local \
> --sysconfdir=/etc/sysconfig \
> --localstatedir=/var \
> --disable-largefile

检查依赖,没有问题,之后便编译安装 make && make install.完了之后就是恢复下之前备份的配置文件,即 default.vcl 文件.

一切OK后。便可以启动varnish 服务器了。

试了一下,所有网站访问正常。唯一的问题……就是nginx,肿么时区还是UTC?为神马??晕了~
[ ] ( 1975 次浏览 ) 永久链接 ( 3.1 / 2526 )

<< <上一页 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 下一页> >>