在Windows平台为Emacs24启用GnuTLS支持
Table of Contents
Emacs 24开始允许直接使用GnuTLS库来创建TLS网络链接,而无需再调用命令行工具了. 这对Windows平台的Emacs用户是个重大利好消息,因为Windows平台上缺少这种命令行工具.
不过要在Windows上启用原生GnuTLS支持还需要经过以下几个步骤:
1 Get a GnuTLS-enabled Emacs
GNU网站上提供下载的Windows版Emacs是支持GnuTLS的, 不过如果你是自己编译Emacs,请参照Emacs源码目录下的 nt/INSTALL
的说明来编译.
2 Find the GnuTLS DLLs
在google上搜索"emacs gnutls windows"的结果中,第一个页面就是这个页面. 上面说:
There's one way to find out if GnuTLS is available, by calling gnutls-available-p. This is a little bit trickier on the W32 (Windows) platform, but if you have the GnuTLS DLLs (available from http:// sourceforge.net/projects/ezwinports/files/ thanks to Eli Zaretskii) in the same directory as Emacs, you should be OK.
在那个网页上,我找到了这个:
gnutls-3.0.9-w32-bin.zip 2012-01-02 7.2 MB
3 Extract the GnuTLS DLLs
我一开始想用Explorer来打开zip文件,然后将文件拷贝出来,结果失败了. 文件拷贝不出来而且也没有任何错误提示. 我只好解压该zip文件然后将解压出来的所有DLL文件拷贝到Emacs安装路径的 bin
目录下. 在我的电脑上就是 C:\Program Files (x86)\emacs-24.3\bin
.
4 Restart Emacs and try it
一切做完之后,重启Emacs并输入 M-: (gnutls-available-p) RET
,你应该能在echo area中看到显示了一个t,这表示Emacs找到了GnuTLS库了.
5 Configure trust files
不过,如果你现在尝试创建一个TLS链接,会提示证书验证失败. 这时因为GnuTLS需要一些CA证书来验证它所连接的服务器.
它会在变量 gnutls-trustfiles
所指定的位置搜索CA证书, 不过该变量的默认值并不适用于Windows环境.
我不清楚怎么让GnuTLS使用Windows系统自带的那些证书,没办法,只能从其他地方获取证书集了. 好在cURL项目 提供了线程的证书集 可以下载.
将下载下来的 cacert.pem
文件放在合适的目下,然后设置 gnutls-trustfiles
指向它就行了.
注意,传递给GnuTLS的文件名不会被扩展,因此你不能用 ~
来表示你的home目录,你需要使用绝对路径的文件.
6 See if it works
将下列代码拷贝到 *scratch*
buffer:
(condition-case e (delete-process (gnutls-negotiate :process (open-network-stream "test" nil "www.google.com" 443) :hostname "www.google.com" :verify-error t)) (error e))
将光标放在代码后面然后按下 C-j
. 如果在buffer中插入一个 nil
,则表示验证通过了,你的配置生效了.
否则你应该会看到如下错误:
(error "Certificate validation failed www.google.com, verification code 66")
如果出现这种错误,那么可以试试将变量 gnutls-log-level
的值设置成大于0的值,再进行调试.