EMACS-DOCUMENT

=============>集思广益

在Windows平台为Emacs24启用GnuTLS支持

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的值,再进行调试.