在windows平台自动产生OpenVPN证书及定期通过邮件发布

来源:互联网 发布:管家婆进销存软件电话 编辑:程序博客网 时间:2024/05/16 02:02

OpenVPN是一个优秀的开放源码VPN,官网上直接提供windows平台的安装包(http://openvpn.net/index.php/open-source/downloads.html),默认安装之后,既可作为服务器也可作为客户端。

 

OpenVPN使用OpenSSL库加密数据与控制信息,虽然OpenVPN2.0后引入了用户名/口令组合的身份验证方式,它可以省略客户端证书,但是在客户端上仍有一份服务器证书需要被用作加密。因此,我觉得通过用户名/口令的方式也不能省略多少事,还得向客户端发布证书及配置文件,既然如此,还不如使用传统证书验证方式,以保证更高的安全性。

 

在windows下,按照openvpn的默认方式,产生和发布证书的确是一件麻烦的事情,且即便预置了默认值,但每产生一次证书,都要敲入回车进行确认及输入必须的common name。特别是你希望更好的控制安全性的时候,一般我们不会为一个客户端制作一个长达数月甚至几年的许可证书,往往会按月周期性的制作及发布一份新证书,让旧证书失效,以提高安全性。但是这样一来,大大增加了管理员的工作量。

 

让计算机为人类工作,是程序员的责任和义务,因此我就此问题开展研究和讨论。先总结一下我们的需求:在windows平台下,计算机自动产生OpenVPN证书及定期通过邮件发布。这说来是个小问题,还谈不到用特别的编程工具写个程序(然后编译-然后部署)来处理那么周折的地步,利用批处理和VBS便已足够对付了。日后做一些改动也很简单,改动完保存就行了,windows会临时解释执行,不需要编译部署那么多步骤,同时,你(读者)拿来可以直接使用,不必担心里面有什么病毒木马。因为每一行代码对你都是透明的,呵。

 

 

转载需注明出处(http://blog.csdn.net/gulingeagle/archive/2010/12/10/6067120.aspx

开始设计具体步骤及分析解决方案:

1,定期自动执行;

这点通过windows任务计划就行了。

2,开始执行后,不需要用户作任何操作,即可完成任务;

对于需要用户输入的,通过VBS进行模拟。

3,当服务器的密钥生成完后,可单独生成客户端的证书,客户端信息可配置;

单独使用一个bat生成客户端的证书,以使得服务器密钥不变的情况下,可周期性的生成客户端证书;使用单独一个文件存储客户端信息,随时可供更改(如新增、删除用户,或更改邮箱地址等);

4,服务端证书生成后,自动进行部署;客户端证书生成后,经压缩以附件方式一一向指定邮箱发布;

服务端证书生成后,拷贝文件到指定目录启动服务即可;客户端证书生成后,在批处理中使用7Z命令行参数进行压缩,之后通过VBS发送邮件;

5,执行文件可放置于非openvpn安装目录的任何其它目录;

通过在BAT中的pushd和popd可以很方便的切换当前目录。

 

好了,思路清晰以后,下面开始一步一步地实现了。

 

 

一、发送邮件

先说下发送邮件,本来这是最后的步骤,不过因为这个功能比较独立,没有很大的上下文相关性,因此先提出来说明。

 

1,首先,考虑客户端邮件列表,可以放置在数据库中,但为了简单起见,我存储在一个文本文件里,各列之间用tab键分隔,如下所示(clients.txt):

第三列1表示生效,0表示失效,将忽略这列为0的行; (扩展:你可以给这一列更丰富的功能,比如将失效的客户端目前尚在有效期内的证书列为无效

读取clients.txt的语句,可由下列批处理完成(完整内容请见后文build-key-clients.bat):

 

2,有收件人信息,固然还需要发件人信息,我也将这部分信息放置在一个INI文件中,供随时更改(smtp.ini):

MailBody是邮件内容,支持HTML格式。

读取smtp.ini的语句,可由下列批处理完成(完整内容请见后文build-key-clients.bat):

 

3,使用VBS借助CDO可以轻松实现发送邮件功能,不过必须建立一个可接受参数的VBS,使之接受发件人、收件人、附件等相关信息,代码如下所示(mail.vbs):

在批处理中,可以直接调用此vbs发送邮件(完整内容请见后文build-key-clients.bat):

 

 

将上面代码放置在上文读取clients.txt的for循环中,就可以实现了发送邮件的功能了。

 

 

二、制作及部署服务端密钥证书

安装完openvpn,在程序目录中(如C:/Program Files/OpenVPN/easy-rsa),可以看到openvpn自带的一些批处理,用来生成服务器及客户端的密钥证书等。

 

 

简要说明一下我们要用到的bat的功能:

1),build-ca:产生ca.srt,用于服务器和客户端;

2),build-dh:产生hd.pem,用户服务器;

3),build-key-server:产生服务器所需的密钥和证书;

4),build-key:产生客户端所需的密钥和证书,因为我需要更改客户端证书有效期、路径等,因此我改写这个文件后,放到我们自己的目录;

5),clean-all:清除之前生成证书时产生的旧文件;

6),vars:其实是vars.bat.sample,定义了生成证书所需的变量值,这个文件我们不直接使用,而是对它进行扩充然后,放到我们自己的目录,命名为vars.bat;

7),init-config:拷贝openssl.cnf.sample和vars.bat.sample成openssl.cnf和vars.bat,因我们有自己的vars.bat,因此我将拷贝openssl.cnf.sample成openssl.cnf也写到我们自己的批处理程序里,忽略init-config。

 

可见,上面每一个bat文件都完成一个特定的功能,只要将它们串联起来执行,就可以生成openvpn所有的所需文件。

 

1,首先,我们需要设定生成证书所需的变量值(vars.bat):

扩展:可以将这个文件制作成ini文件

 

2,制作服务端密钥证书(build-key-all.bat):

 

3,生成服务端配置文件(build-cfg-server.bat):

这里将根据vars.bat中设置好的值写进服务端配置文件中,但只有一些常用的配置在vars.bat中进行了初始化,比如协议、端口等。(扩展:可以将全部配置都预先设置在vars.bat中,需要修改某些值时,只需要更改vars.bat一个文件即可

 

4,部署服务端密钥证书,部署之前,应先停止openvpn服务,以防止文件覆盖失败,同时上文将目录改为了%HOME%目录(pushd %HOME%),因此需popd回到当前目录(在build-key-all.bat加上下列代码):

 

5,到此,服务器密钥和证书可以一气生成及部署了,不过在生成证书的时候,需要我们手动按回车键以及输入common name,那么接下来,我们解决这个问题,看看刚才我们按了那些键,然后用vbs来模拟按键就行了(input-ast-main.vbs):

VBS只能对获得焦点的窗口发送按键,为了防止生成证书的窗口(build-key-all.bat)当前没有获得焦点,在build-key-all.bat启动之初我们就一气把全部消息都向它发送完,让它自己慢慢消化去吧!并且在发按键消息之前,我们再次尝试激活这个窗口。VBS可以通过窗口标题激活窗口,因此在原文的@title %Title_All%后启动上面的VBS:

不过,当build-key-all.bat启动时获得了焦点但在WshShell.AppActivate这句代码执行前,用户恰巧将焦点重新定位到其它窗口去了的情况下WshShell.AppActivate也无法使build-key-all.bat窗口获得焦点。好在从build-key-all.bat启动到发送完这些按键时间非常短,但如果你碰巧遇到这种情况,按键将被发送到其它窗口,你只能重新启动build-key-all.bat了。

 

到这里,我们可以尝试运行一下程序,已经可以感受到计算机自动为我们工作的乐趣了!

 

 

三、制作客户端密钥证书及通过邮件发布

1,产生服务器所需的密钥和证书我们可以直接使用openvpn自带的build-key-server.bat,无需做任何的更改即可,但因为需要更改客户端证书有效期、路径等还需要将客户标识做为参数传递进来,因此我们必须改写build-key.bat,改写后的文件如下(命名为build-key-client.bat):

 

2,和服务端配置一样,客户端配置也由批处理自动生成出来(build-cfg-client.bat):

 

3,结合开篇提到的读取clients.txt客户端邮件列表,smtp.ini发件人信息文件生成客户端证书及通过邮件发布的代码如下(build-key-clients.bat):

代码中还通过7Z对多个文件压缩成一个,便于邮件发送。

 

4,和生成服务端证书时模拟按键一样,在产生客户端证书时也通过下列VBS模拟按键(input-ast-clients.vbs):

 

 

四、整合

1,为了使启动一个程序即可完成服务端及客户端的密钥、证书的制作和部署必须将这两个功能整合到一个批处理中,为了使模拟按键更少机会发送到其它窗口,在这个整合后的批处理启动之初,就把生成客户端证书的按键也发送出去;在制作和部署完服务端密钥、证书后启动build-key-clients.bat制作客户端密钥证书及通过邮件发布即可,因此完整的build-key-all.bat文件如下所示:

 

2,服务端证书有效期一般比较长,在这里利用openvpn默认的build-key-server.bat生成出来为10年,然而客户端证书只有35天(在vars.bat中可设置,建议一个月左右),因此服务端证书和密钥生成一次即可,我们建立一个单独的批处理文件用于生成客户端证书密钥(build-key-clients-only.bat):

至此,所有的设计均已完成。

程序运行时的效果图如下所示:

收到证书的邮件效果图:

 

 

五、应用

利用windows的任务计划就可以应用了,如图所示:

假设我们现在(2010-12-15 01:56)刚好执行完了一次build-key-all.bat,推算10年,我们将下次执行的时间定为:2020-12-14 06:00,而build-key-clients-only.bat则每月的14日07:00均会被执行一次:

 

六、说明

本文中的方法不见得是最优的,甚至有不曾考虑到的问题,欢迎发现问题和有更好建议的朋友提出更好的见解。如果我找到更好的方法,也会抽空贴出来。

转载需注明出处(http://blog.csdn.net/gulingeagle/archive/2010/12/10/6067120.aspx)

原创粉丝点击