软件指南针:专注于软件传播与分享

创建CA、生成服务器和客户端证书(OpenVPN官方文档)

来源:原创 6773次浏览 0条评论
☞ 本文主要介绍软件OpenVPN的相关内容:创建CA、生成服务器和客户端证书(OpenVPN官方文档)

   其下列版本/分支可以参考本文:

  • 全部版本/分支
英文原文:http://openvpn.net/index.php/open-source/documentation/howto.html#pki

创建你自己的CA,并为服务器和客户端生成证书和密钥

概述

构建OpenVPN 2.x 配置的第一步就是建立一个PKI(公钥基础设施)。PKI包括:

  • 一个单独的证书(即我们常说的公钥)以及供服务器和每个客户端使用的私钥。
  • 一个主CA证书和密钥,该密钥用于签名标识服务器和客户端的每个证书。

OpenVPN支持基于证书的双向验证,这意味着在连接双方在建立相互信任之前,客户端必须鉴定服务器证书的有效性,服务器也必须鉴定客户端证书的有效性。

服务器和客户端在鉴定其他证书时,首先就是验证对方的证书是否由主CA签名标识,然后测试该证书的头信息,例如:证书Common Name或者证书类型(客户端或服务器)。

从VPN角度来看,该安全模型具备如下值得称道的功能特性:

  • 服务器端只需要它自己的证书/密钥— —不需要知道可能与之建立连接的每个客户端单独的证书。
  • 服务器端只接收那些由主CA签名的证书(我们将会在下面生成这些证书)。并且,由于服务器端能够在不访问自己的CA私钥的情况下,就能够进行签名校验,这样我们就可以将CA私钥(整个PKI中最敏感的密钥)放在一台完全不同的计算机上,哪怕该计算机没有网络连接。
  • 服务器就可以基于证书中内嵌的字段来控制指定客户端的访问权限,例如Common Name。

注意:服务器和客户端的时钟应该大致同步,否则证书可能无法正常工作。

生成主CA证书和密钥

在这一部分,我们将生成一个主CA证书/密钥,一个服务器端证书/密钥,以及3个单独的客户端的证书/密钥。

对于PKI管理而言,我们将使用easy-rsa,easy-rsa是捆绑在OpenVPN 2.2.x及之前版本的一系列脚本文件。如果你使用的是OpenVPN 2.3.x,你需要点击这里单独下载easy-rsa(Windows安装程序版本则无需下载)。

如果你正在使用Linux、BSD、或者一个类Unix操作系统,请打开shell并跳转到easy-rsa子目录。如果你是通过RPM或DEB文件来安装OpenVPN,easy-rsa目录通常位于/usr/share/doc/packages/openvpn/usr/share/doc/openvpn(在进行任何编辑操作之前,最好将该文件夹复制到另外一个位置,例如:/etc/openvpn,以便于在之后的OpenVPN升级中不会覆盖掉你修改的内容)。如果你通过.tar.gz文件来安装OpenVPN,easy-rsa文件夹将位于解压缩后的顶级目录中。

如果你正在使用Windows,你可以打开命令提示符,然后跳转到OpenVPN安装路径/easy-rsa目录。运行下列批处理文件从而复制相关配置文件到此处(这将覆盖掉任何之前存在的vars.batopenssl.cnf文件):

init-config
现在,我们来编辑vars文件(在Windows中该文件名为:vars.bat),并设置KEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG和KEY_EMAIL参数。不要让其中的任何一个参数留空。

接着,我们来初始化PKI。在Linux/BSD/Unix中:

. ./vars
./clean-all
./build-ca
在Windows中:
vars
clean-all
build-ca
最后一个命令(build-ca)将通过调用交互的openssl命令来创建CA证书和密钥。
ai:easy-rsa # ./build-ca
Generating a 1024 bit RSA private key
............++++++
...........++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KG]:
State or Province Name (full name) [NA]:
Locality Name (eg, city) [BISHKEK]:
Organization Name (eg, company) [OpenVPN-TEST]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:OpenVPN-CA
Email Address [me@myhost.mydomain]:

注意,在上面的序列中,大多数询问的参数都在varsvars.bat文件中设置了缺省值。必须明确输入的唯一一个参数是Common Name。在上面的示例中,我们输入了"OpenVPN_CA"。

生成服务器端证书/密钥

下一步,我们将为服务器端生成证书和密钥。在Linux/BSD/Unix系统中:

./build-key-server server

在Windows系统中:

build-key-server server

在上一步骤中,大多数参数都可以使用默认值。当询问Common Name时,请输入"server"。此外,有两个询问操作必须正面响应:"Sign the certificate? [y/n]"和"1 out of 1 certificate requests certified, commit? [y/n]".。

为3个客户端生成证书&密钥

生成客户端证书的过程与上一步骤非常相似。在Linux/BSD/Unix中:
./build-key client1
./build-key client2
./build-key client3
在Windows系统中:
build-key client1
build-key client2
build-key client3

如果你想使用密码来保护你的客户端密钥,你可以使用脚本build-key-pass来替代。

请记住为每个客户端输入适当的Common Name,例如:"client1"、"client2"、"client3"。每个客户端都始终使用唯一的Common Name。

生成迪菲·赫尔曼参数

我们必须为OpenVPN 服务器端生成迪菲·赫尔曼参数。在Linux/BSD/Unix系统中:

./build-dh
在Windows系统中:
build-dh
输出:
ai:easy-rsa # ./build-dh
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
.................+...........................................
...................+.............+.................+.........
......................................

关键文件

现在我们可以在keys子目录中找到我们新生成的密钥和证书。下面是相关文件的一个说明:

文件名 谁需要 作用 是否需保密
ca.crt 服务器 + 所有客户端 根CA证书 NO
ca.key 密钥签名机 根CA密钥 YES
dh{n}.pem 服务器 迪菲·赫尔曼参数 NO
server.crt 服务器 服务器证书 NO
server.key 服务器 服务器密钥 YES
client1.crt client1 Client1证书 NO
client1.key client1 Client1密钥 YES
client2.crt client2 Client2证书 NO
client2.key client2 Client2密钥 YES
client3.crt client3 Client3证书 NO
client3.key client3 Client3密钥 YES

最后一步就是将所有文件复制到需要它们的计算机上,注意使用安全通道来复制需要保密的文件。

等等,现在你可能会说"没有现有的安全通道,就不可能创建PKI"?

显然,答案为"是"。在上面的示例中,为了简单起见,我们将所有的私钥都生成在了相同的地方。稍加努力,我们也可以不这样做。举个例子,为了不在服务器端生成客户端的证书和私钥,我们应该让客户端在本地生成自己的私钥,并向密钥签名机提交一个证书签名请求(Certificate Signing Request,简称:CSR)。反过来看,密钥签名机就应该处理该证书签名请求,并返回一个签名后的证书给客户端。在不需要一个保密的.key文件离开生成它的计算机的前提下,即可完成该才做。

作者:软件指南针(http://www.softown.cn),转载请保留出处!

用户评论

使用指南 故障排除 0 返回顶部