电子认证系统和SSL

我们生活在网络的世界中,怎样确保联络的安全并建立一套值得信赖的电子“信誉系统”是至关重要的事情。在网络上加密以及取得身份认证,和每个人的生活并不遥远,比如04年国家出台的“电子签名”法。中国人的思维中缺乏“信用制度”这样一种观念,这是影响社会长远发展的重要问题,而随着网络的普及,电子认证系统也许可以弥补这种缺陷。 这篇文章就要介绍电子认证在技术上的一种实现,Secure Sockets Layer,简称SSL。SSL的基本工作原理和PGP一样,见我的一篇关于PGP的文章(为了能看懂下文的内容,请务必阅读这篇PGP的文章)

http://huichen.org/10

SSL可以用来加密通信,比如Web服务(HTTPS),POPS,SMTPS等,也可以用来给数据文件加密,还可以被政府和商业机构用来进行身份认证。比较常见的是SSL在网站服务的应用,就是HTTPS。几乎所有的电子购物和电子银行系统都使用了SSL以增强安全性,比如

https://www.paypal.com/
https://www.amazon.com/

这样就保证即便用户和网站的通信的数据被黑客窃听,由于数据是加密的,黑客也无法破解通信的内容,从而用户的信用卡和银行帐号等个人信息不会泄露。如果你阅读过我上面的关于PGP的文章,你可能会有一个疑问:

在PGP的公匙和密匙系统中,为了确认某个公匙确实来自某个人,我们需要用打电话,直接面谈等方式得到确认。但我们在访问某个网上购物站点时,如何确认访问的这个站点确实来自某个公司呢(比如如何确认www.amazon.com确实由亚马逊这样有信誉的公司建立的,因而我们可以放心地把自己的信用卡号码输入到这个网站的网页里)?

这种担心不是多余的,因为:1. 比如亚马逊公司又建立了另外一个新的购物网站www.amazonshop.com,但是你从来没有访问过,所以你不确信这个amazonshop是不是打着亚马逊公司的旗号来骗取信用卡号码。2. 如果有人修改了你的DNS信息,把www.amazon.com指向了另外一个IP,你可能错误地信任那个IP,从而泄露了你的信用卡信息。解决方案是这样:你需要一个可以绝对信赖的权威机构(简称”A”),这个机构向亚马逊公司的每个网站都提供一个“认证文件”(certification)。以https://www.amazonshop.com为例,你的浏览器会从这个网站自动下载“认证文件“(简称F)。你的机器中已经有了A的公匙(关于公匙密匙的概念见我上面的PGP文章),而F是通过A的密匙签名的,从而你可以检查F确实是A颁发的。然后浏览器从F中读取信息,检查这个认证颁发给的公司名称和网站名称,如果颁发给的公司名称是“亚马逊”而办法给的网站是“www.amazonshop.com“的话,你就可以信赖www.amazonshop.com确实是亚马逊公司的网站。注意没有人可以伪造或者篡改权威机构A的认证(比如把认证文件F里的www.amazonshop.com改成www.hackershop.com),这是由加密系统的特点决定的(请阅读我上面的关于PGP的文章)。

所以,权威机构(Certificate Authority)的电子认证要比工商执照等纸做的东东要可靠的多,具有不可伪造,无法篡改,可以确认持有人的身份等特点。这些“权威机构“可以是政府机构(比如在04年国内”电子签名“法出台后出现的电子认证机构是政府部门),也可以是一些有授权的信誉良好的商业机构(也就是说具有发放“有权威发放电子认证证书“的权威机构,即root CA)可以给某些机构发放“有权威发放电子认证证书“的电子认证证书,从而使这些机构成为新的CA)。那么,权威机构怎样发放电子认证呢?过程是首先需要认证的人和机构向CA发出申请,申请中包括了自己的机构名称联系方式以及网站名称等,权威机构接到申请后通过物理的方式(比如电话联系,走访等)来核实申请人提供的信息是否完整准确,如果通过那么就发放认证。国内“电子签名”法对提高民众和商业机构的“信誉体系“是非常有帮助的,当然也带来保护个人隐私的问题(比如政府可能就可以通过你的电子签名知道这个商品买主的真实身份,这显然是很糟糕的,特别是当你在购买枪支弹药或者贩运人体器官的时候;即使是在美国,也有很多人宁可用现金也尽量不用信用卡,因为这些人担心FBI等部门知道他们在买什么,虽然也许只是买顿午餐)。但这就是政治话题了,我们这里只谈技术。

获得认证是需要花钱的,因为权威认证机构主要靠人力来核实申请者的信息。但在这个 decentralized 的世界中,人人都可以成为一个小圈子里的权威。所以从技术上讲,每个人都可以成为能颁发认证证书的root CA,虽然其他人不一定认可你。软件 openssl 提供了这样一种实现。openssl 的使用说明请google,下面给出一个ubuntu下使用openssl建立https的具体例子。

1. 安装openssl和建立root CA

安装openssl

sudo apt-get install openssl

建立root CA的密匙,需要你建立一个root CA的密码,这个密码最好足够复杂

openssl genrsa -des3 2048 > rootca.privatekey

通过root CA的密匙建立root CA的自认证 self-certificate,你可以修改3650为你需要的认证有效期

openssl req -new -x509 -key rootca.privatekey -days 3650 -out rootca.cert

建立过程中会需要你输入root CA的组织名称等信息,你可以随便写一个,也可以写你自己的真实信息。然后打开/etc/ssl/openssl.cnf文件,修改其下的变量值

dir = /etc/ssl/CA

保存。建立必要的目录和文件:

sudo mkdir -p /etc/ssl/CA/certs
sudo mkdir -p /etc/ssl/CA/newcerts
sudo touch /etc/ssl/CA/index.txt
sudo echo “01″ > /etc/ssl/CA/serial

将你刚才创建的root CA的密匙和自认证文件复制到合适的地方

sudo cp rootca.privatekey /etc/ssl/CA/private/cakey.pem
sudo cp rootca.cer /etc/ssl/CA/cacert.pem

修改权限禁止非root用户访问

cd /etc/ssl
sudo chmod go-rwx CA -R

这样root CA就建立好了。

2. 为apache2建立ssl认证

首先建立用户的密匙,需要你设置一个密码

openssl genrsa -des3 2048 > my.privatekey

然后由密匙产生认证的申请文件

openssl req -days 3650 -key my.privatekey -new -out my.csr

要求你输入一些信息,其中Orgnization Name要和root CA的一致,Common Name就是你网站的FQDN(fully qualified domain name,比如www.gezhi.org,www.gezhi.org和gezhi.org是不同的,取决你的网站要不要www.)。然后用你的root CA来认证并产生认证文件

openssl ca -out my.pem -days 3650 -infiles my.csr

你可以把3650改成这个认证的有效期。

3. 配置apache2服务器

Ubuntu apache2默认带着mod_ssl,所以只需要启用这个模块

a2enmod ssl

把你的my.privatekey和my.pem合并起来,然后复制到/etc/apache2/ssl/apache.pem

cat my.privatekey my.pem > apache.pem
sudo cp apache.pem /etc/apache2/ssl/apache.pem

你的/etc/apache2/sites-enabled/youdomain.conf(或者/etc/apache2/apache2.conf)中要包括下面的行

<VirtualHost *:443>
ServerName mydomain.com
ServerAdmin webmaster@localhost
SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem
DocumentRoot /directory/to/mydomain/dir/
<Directory />

</Directory>
</VirtualHost>

添加https的443端口,在/etc/ports.conf中加入

Listen 443

最后重启apache2服务器即可

sudo /etc/init.d/apache2 restart

注意,apache2启动时需要你输入你的my.privatekey的密码。

你可以通过https://yourdomain.com来访问你自己的https服务器,浏览器会弹出一个对话框问你要不要接受网站的认证,Firefox只要选择永久接受这个certificate即可,而IE只有三个选项,虽然点查看证书之后可以安装认证,但后面那个“网页部分内容未认证”的警告还是有,而且如果网页中有部分连接(比如图片和计数器等)来自其他非认证网站,按照IE的默认配置这个是无法避免的。建议你使用Firefox 2.0

http://getfirefox.com

你可以把我加为你值得信赖的CA,如果你用Firefox,点击下面的链接

http://huichen.org/rootca.crt

会弹出一个对话框,三个复选框都选中后确认即可。

留下回复


为了防止恶意的垃圾评论脚本,请输入以下图片里面的数学方程式的答案。
防垃圾评论问题