一键生成SSL证书

使用OpenSSL颁发证书,免去了申请证书的费用,使个人网站也可以应用先进的加密技术,保证数据通信安全。

但是Windows下的OpenSSL命令行操作非常繁琐(倒不能说难),生成的文件也比较多,容易混淆。为了方便大家使用,我优化了网上的一份批处理命令,和OpenSSL一起打包。

下载链接 openssl_script.zip

在使用教程前,先解释一下自签名证书到底是怎么回事。

根证书

创建自签名证书的时候,第一步是建立“根证书”。什么是“根证书”呢,顾名思义,是指一套数字身份系统的源头,所有的站点证书都是在“根证书”的名下签发的。换言之,站点证书文件之内都含有“根证书”的识别代码。

证书机构签发的收费SSL证书,就是通过他们自己的“根证书”生成的,这些“根证书”内置在主流浏览器中,故而我们的浏览器能够识别他们名下的自证书。我们自己签发的SSL证书无法被浏览器认可,就是因为自己创建的“根证书”不在浏览器中。

至于怎么让自己的“根证书”搭上浏览器的车,我不太清楚,但是证书机构少不了花费花费。看到这里,你恐怕才知道我们的浏览器还是顺带附了不少赠品。

还要提一下,我们不止可以从“根证书”签发站点证书,还可以签发中级证书。中级证书持有人可以再签发站点证书,或者二级中级证书。比如,A公司拥有内置各大浏览器的根证书,它可以向B签发一个中级证书,B再向客户签发站点证书。我们向B买的证书可能浏览器不认,同样弹出警告,但是你把买来的站点证书和B提供中级证书绑在一起,浏览器就认可你了。这样的证书一般来说会更便宜。

站点证书

这个证书是用来标识你站点身份的证书。通过这个证书,浏览器主要可以做两件事:第一,识别站点的身份,这是通过与根证书对比来实现的,前提是浏览器有与你对应的根证书。第二,加密连接,浏览器通过证书内置的密钥与服务器建立加密的连接。

自签名证书干第二份活,丝毫没有问题,干第一份活却有点吃力。上面说过了,因为你自己写给自己的根证书别人不买账。当然,我们自己可以认可自己,方法后面会说。

创建过程

创建自签名证书的过程大致如下:

创建一个个人私钥,通过它向OpenSSL请求一个根证书,OpenSSL自然爽快地批了。

然后制作一个站点私钥和站点证书,注意,此时站点证书和根证书还不搭边。你手头已经有4个文件了。

第三步用个人私钥加上根证书,给站点证书加盖签名。这会,你就有了5个文件,其中包括未签名的站点证书。

其实这些东西已经可以用了,但一般还要将站点私钥解密,不然服务器每次加载(重启)都要密码。

最后,你手头六个文件,按时间顺序分别是:个人私钥(故事的源头),根证书(大树的根基),站点私钥(未解密,半个废柴),站点证书(未签名,整个废柴),签名的站点证书(主角,金光闪闪,根证书开支散叶),解密的私钥(配角,小有名望)。

我们要在服务器中配置的是最后两个文件:签名的站点证书,以及解密的私钥。

工具教程

废话讲完了,现在讲批处理工具的用法。压缩包已经包含了OpenSSL程序,你不必再找了。

第一步,解压后,点击右键编辑OpenSSLCA.cmd文件,找到证书信息部分:

…-subj “/C=US/ST=California/L=San Francisco/O=Purf.net/OU=Purf NetworksCorporation” …

你需要编辑引号内的部分,略缩字母的含义分别是/C=国家代码/ST=州或省/L=城市/O=机构/OU=部门,请参照实例修改。

第二步,点击右键编辑OpenSSLSite.cmd文件,找到证书信息部分:

…-subj “/C=US/ST=California/L=San Francisco/O=Purf.net/OU=Purf NetworksCorporation/CN=ssl.purf.net” …

此处与第一步略有不同,多了一个CN(CommonName)参数。CN项应填写你的域名,如google.com,mail.google.com。也可以写通配符,如*.google.com。除CN项外,其他信息应与OpenSSLCA.cmd文件内容一致,否则无法成功签名。

第三步,运行OpenSSLCA.cmd,此过程中需要输入个人私钥密码。

第四步,运行OpenSSLSite.cmd,此过程中需要输入站点私钥密码和个人私钥密码。

到这里,你已经成功穿件了自签名根证书和站点证书,在SSLCertificate目录下将会有四个文件,根证书(CACert.crt)、站点证书(myCert.crt)、未解密的站点私钥(myKey.key)和解密的站点私钥(myKey.decrypted.key)。

一般我们需要的是myCert.crt和myKey.decrypted.key文件。如果你对安全性要求稍高,可以用未解密的站点私钥,每次启动Apache或Nginx的时候,服务器软件都会提示你输入密码。

剩下一个CACert.crt,我们可以双击它,手动选择导入目录,选中受信任的根证书颁发机构,Windows会跳出警告信息,点击确认即可。这样,当我们访问CACert.crt签发的所有站点证书,都是被浏览器认可的。

根证书一旦通OpenSSLCA.cmd过生成,可以长期使用,直至有效期结束。当每次我们想要给新站点签发证书时,只需要修改和运行OpenSSLSite.cmd文件。

补充资料

1.如何签发多个域名?

编辑OpenSSLSite.cmd文件,用英文冒号注释自动输入证书信息的命令行,去掉手动输入证书信息的命令行之前的英文冒号。并在命令行后添加“-extensions ca_x509v3_more_cn_ext”。使命令行变成下面这样:

openssl.exereq -new -days 365 -key ./temp/mykey.pem -out ./temp/myreq.pem -extensionsca_x509v3_more_cn_ext

你就可以在手动输入的过程中添加多个域名。

2.额外可能用到的命令

如果要手工去掉站点私钥的密码保护,可以这样做:

openssl rsa -in myKey.key-out  myKey.decrypted.key

如果需要根据站点私钥生成公钥,可以这样做:

openssl rsa -in myKey.key -pubout-out myPublic.key

证书生成后,可以使用如下命令查看详细信息:

openssl x509 -fingerprint -text-in myCert.crt

使用站点证书加密信息:

openssl smime -encrypt -in ptest.txt -outetest.txt myCert.crt

使用站点私钥解密:

openssl smime -decrypt -in etest.txt -outdtest.txt -inkey myKey.key

若需要DER格式的证书,可使用如下命令进行转换:

openssl x509-in myCert.crt -outform DER -out myCert.der

3.如何在Apache2或Nginx中启用SSL证书?

请参阅另外一篇博文。

发表评论

Clicky