一般可用openssl来自建CA,它可以有两种方式来指定相关参数,一种是用openssl.cnf,一种是命令行交互式输入相关信息。从企业角度来讲,一个PKI系统最好不只是生成个CA,还要有证书管理功能,比如生成新的证书,吊销禁用证书等。openssl虽然命令很强大,但没有管理功能。我们可以用easyrsa来做这个事。
EasyRSA是openvpn项目下的一个开源的PKI管理脚本,它也是用openssl来实现各种基本功能,但命令更为简洁,并且有PKI目录和各种命令来管理生成的证书。
1.下载EasyRSA
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.0/EasyRSA-3.1.0.tgz tar -zxvf ./EasyRSA-3.1.0.tgz cd ./EasyRSA-v3.1.0/
2. 初始化PKI
./easyrsa init-pki
默认地这样就建好pki目录,配置文件vars在该目录下,但新版3.0并不需要这个vars,默认内容为空。接下来就可以创建CA根证书了。
3.创建CA
./easyrsa build-ca nopass
如果在生产环境,一般还是设置密码保护,只需去掉上面nopass,就可交互式输入,但记得把密码并记录到IT文档中,因为将来执行任何签名操作时要用到这个保护密码
上面只需根据提示输入一个Common Name,比如ECCEE CA,即可生成ca.key和ca.crt,分别在pki/private和pki根目录下。
4. 创建服务器和客户端证书
事实上,服务器和客户端证书的创建脚本是差不多的,如果要用在VPN上,服务器和客户端有各自的命令,如下:
创建服务器证书 ./easyrsa build-server-full IP140_37 nopass 创建客户端证书 ./easyrsa build-client-full client1 nopass 创建dh ./easyrsa gen-dh
事实上,并不是所有证书应用都需要区分服务端和客户端证书,因为它们都有常用的X509v3 Key Usage和Extended Key Usage等设置,都可以用作身份认证。不同的是服务器证书多了一些x509 v3扩展的设置,比如把IP地址和域名设置为主题别名等等。因此,因此,一般用./easyrsa build-client-full clientname nopass来生成想用在AWS项目上的客户端证书。
5. 注册CA根证书
向AWSIOT注册证书,需要提交CA和verification证书,这个verification证书同样可以用build-client-full命令来生成,它需要拷贝AWS提供的注册码,在注册CA时,可以直接根据提示复制,我们一般把这个注册码直接作为build-client-full命令的参数:
./easyrsa build-client-full 9dcc0159cca00aa47dfe6d7df6f311dde2ccd07cfdadbd269556e4f748def59c nopass
在AWSIOT中选择注册CA证书,把自建的CA根证书和verification证书一起上传,这样CA根证书就和AWS的Root证书一样有效。
6. 使用客户端证书
经过上面操作,我们就可以用EasyRSA上的CA来生成自己的客户端证书并用在AWS的项目上。比如AWSIOT上添加一个物品,在配置物品的证书时,就可以选择“Use my certificate”,然后选中已注册的CA根证书和本地刚才生成的client1证书,根据提示一步一步创建好物品和上传客户端证书,相应的客户端证书也就可以使用了。
当我们使用AWSIOT时,由于私钥只允许一次下载,而且下载的东西不及时保存的话,也很容易忘记保存位置,这对证书维护和管理相当不利。在实际应用中,像paho的MQTT库连接AWSIOT时,会需要用到相关的私钥,而在EasyRSA中,很容易管理生成的各种证书和密钥,这样就不会因为没有及时下载私钥而无法在项目中应用相关证书的情况。
8. 用EASYRSA3生成带有域名或IP地址信息的证书
用上面的方法创建服务器证书,一些应用可能需要服务器证书带有域名或IP地址的别名主题,可以用下面方式创建: