Browsed by
Tag: ssl

Bitbucket/Mercurial在Debain8上的一点小问题

Bitbucket/Mercurial在Debain8上的一点小问题

由于Debian 7已经被无情地终结了生命周期,因此不得不将部分生产环境升级到Debian 8。总体上还比较顺利,在mercurial库方面遇到点问题,记录如下:

问题1:UnicodeDecodeError: ‘ascii’ codec can’t decode

这是Python脚本编码的问题。一个好的py脚本,应该在脚本起始处就标明编码方式,可惜mercurial的很多脚本没有这么做。Debian 8采用Python 2.7.9,默认是ascii编码,需要修改为默认utf-8编码。注意,Debian 8安装了多个Python版本,首先要确认默认版本号:

python -V

接着修改“/etc/python2.7/sitecustomize.py”文件(如果没有的话,可以手工创建一个),在文件起始处添加以下代码:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

问题2: [SSL: WRONG_VERSION_NUMBER] wrong version number

Bitbucket网站禁止了有缺陷的TLSv1,TLSv1.1加密方式,奇怪的是mercurial为什么没有根据协商采用SSL或者TLSv1.2? 修改方式也简单,强制mercurial禁止掉TLS。修改“/etc/mercurial/hgrc”,增加以下内容:

[ui]
tls=False
Apache自动输入密钥文件密码

Apache自动输入密钥文件密码

从startSSL申请了证书并成功加载到apache,这些都是通用步骤,具体可以直接参考startSSL的说明文档:http://www.startssl.com/?app=21

然而由于密钥文件是采用访问密码保护,因此重启apache时,读取密钥文件会要求手工输入密码,例如以下提示信息:

Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.
Enter pass phrase:

这样非常不方便,因此需要将密钥的访问密码告诉apache,并自动输入该密码。

以下步骤都是以root身份进行,系统为Debian 7。

创建shell文件:vi /etc/ssl/apache_pass.sh,并输入以下内容,用于输出访问密码:

#!/bin/sh
echo "1234" <-- 这个是密钥文件的访问密码

出于安全的考虑,将这个文件设置为可执行,并且只能由root访问:

chmod 400 apache_pass.sh
chmod +x apache_pass.sh

接下来就是修改/etc/apache2/mods-available/ssl.conf文件,将SSLPassPhraseDialog由默认的builtin修改为以下值(其实就是执行上述shell文件):

SSLPassPhraseDialog exec:/etc/ssl/apache_pass.sh

完成上述步骤后,重启apache2,将自动输入密钥文件的访问密码,不再需要手工操作。

SSLv3漏洞

SSLv3漏洞

这次是Google发现的一个漏洞,而且又是一个很严重的漏洞。现在暂时还没有补丁解决,但是可以关闭apache的SSLv3来屏蔽这个漏洞。修改方法如下(Debian7.x环境):

修改/etc/apache2/mods-enabled/ssl.conf文件, 找到SSLProtocol所在行,去掉SSLv3即可

SSLProtocol all -SSLv2 -SSLv3

最后当然需要重新启动apache。

openssl一二事

openssl一二事

由于工作上的需要,最近两天折腾openssl来实现一些信令加密解密的事情。总体来说,openssl是个很不错的库,也是个很不错的工具。使用openssl做tls客户端编程没有太大问题,而实现tls服务器端则有些地方需要注意。

首先要注意的一点就是:在握手之前(SSL_accept),绝对不能采用非阻塞方式。握手成功之后,才可以将socket修改为非阻塞方式,否则握手不会成功,服务器总是会向客户端返回“Engypted alert”消息并结束握手。

如果是在windows环境生成证书和密钥,建议使用SimpleCA工具,很好用。同时要注意:(1)客户端应安装或者使用该工具生成的根证书,例如ca.crt。(2)服务端需要使用生成的服务端证书和密钥,即.crt和.key文件。(3)生成证书时(无论是根证书还是服务端证书),Common Name都必须要设置为当前服务器的IP地址或者主机名,否则双方握手时,可能产生”certificate name mismatch”等错误。(4)如果需要将证书导入windows系统,必须导入为“受信任的根证书颁发机构”类型。

如果是Ubuntu等linux系统,可以直接安装使用openssl生成证书,如以下命令:

生成根证书:
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

生成服务端证书和密钥
openssl genrsa -out server.key 1024
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

理论上来说,可以将.crt和.key文件合并在一起,设置为.pem文件。不过实践证明,openssl的API是要求SSL_CTX_use_PrivateKey_file函数来加载密钥文件的,否则握手还是会出问题(当然,也可能是需要另外单独的设置)。

Kubuntu12.04中apache2配置上的一些变化

Kubuntu12.04中apache2配置上的一些变化

在以前的版本中,如果需要配置HTTPS访问方式, 只需要修改/etc/apache2/sites-available/default-ssl文件即可。

可是在新版本中,如果仅仅是修改这个问题,还是无法以https方式访问apache2. 在apache的error.log中,会出现以下错误提示:

Invalid method in request \x16\x03\x01

需要多做几个配置来解决:

在/etc/apache2/mods-enabled目录下,添加以下链接:

sudo ln -sf /etc/apache2/mods-available/ssl.conf /etc/apache2/mods-enabled/ssl.conf
sudo ln -sf /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load

在/etc/apache2/sites-enabled目录下,添加以下链接:

sudo ln -sf /etc/apache2/sites-available/default-ssl /etc/apache2/sites-enabled/000-default-ssl

然后重启apache2即可:

sudo service apache2 restart

对比检查Kubuntu10.04以及11.10中的配置,以前的版本中都已经自行创建了上述这些链接,不知道为什么在新版本中没有这么做。

linux系统对比商业操作系统,一个非常大的不足就是兼容性考虑不足,实在是太随意了。兼容性不仅仅是二进制运行程序的兼容性,也包括库,配置,头文件等等。像上面这样的配置上的变化,说大也不大,可是如果是生产环境上的系统进行升级,就不知道有多少这样的“小改动”了。

Apache2打开SSL连接功能

Apache2打开SSL连接功能

以下操作基于Ubuntu10.10,参考随机附带的文档:/usr/share/doc/apache2/README.Debian.gz

Ubuntu确实不错,只需要简单的几个命令就可以了。

sudo a2ensite default-ssl
sudo a2enmod ssl
sudo make-ssl-cert generate-default-snakeoil --force-overwrite

执行上述操作后,apache2的配置文件变更为:/etc/apache2/sites-enabled/default-ssl

使用命令 sudo service apache2 restart 后,就可以以https方式访问apache服务器了。

在google chrome中使用google docs的方法

在google chrome中使用google docs的方法

由于众所周知的原因,首先要修改本机的hosts文件,由本机自己解析google docs对应的IP地址,避免DNS污染。

hosts文件存放位置: C:\WINDOWS\system32\drivers\etc

修改了hosts后,使用chrome登录google docs还可能出错,此时错误原因值是指 protocol error (ERR_SSL_PROTOCOL_ERROR)。这种情况,一般配置SSL2就可以解决:

点击chrome的扳手按钮,然后顺序点击以下菜单:选项 / 高级选项 / 计算机总体SSL设置,在其中选择“使用SSL 2.0”即可。