如何生成用于SSL/TLS的数字证书

今天我们讲的证书不是那种英语四六级证书,也不是各种技能等级证书,那今天我们说的证书是指什么呢?

关于数字证书

当前我们的信息系统中通过加密来安全的传输信息, 其中使用比较广泛的是 SSL 和 TLS。这两种方式都采用了非对称加密技术,所谓非对称加密技术是利用一对密钥(公钥和私钥),这对密钥的特点是通过公钥加密的数据只能用私钥进行解密,而相反的通过私钥加密的数据则只能通过公钥来解密。
假如我有一个网站需要传输一些重要的数据,最好通过加密的方式进行数据交换(HTTPS)。那么我需要生成一对公钥和私钥,然后我用我的私钥对数据加密后发给对方,结果会怎么样?对方由于没有我的公钥,得到的是一堆毫无意义的字符。显然这不是我想要的,所以我要把公钥发给对方,而证书就是用来发送公钥的方式。与此同时证书还用来表明证书拥有者的身份比如说我是 google,我是淘宝或者说我是百度这些信息都会包含在证书里面。

证书的种类

根据证书发行者的身份不同,证书分为两类,一类是通过权威机构(CA)认证的证书;而另一类则是网站自己发行的证书,即自签名证书(self-signed certificate)。 通过权威机构认证的证书都是安全可靠的,用户可以放心的浏览以及交换数据, 而对于另外一种非权威机构发行的证书,用户则需要特别留意除非你非常清楚你访问的网站是安全的。获取 CA 认证的证书流程非常简单:

  1. 首先需要生成一对密钥;
  2. 然后新建一个证书签名请求,该请求中包含了网站的服务器信息以及运行该网站的公司信息;
  3. 接下来把之前签名请求以及表明身份的文档一并发送给 CA,同时包括一定的费用。
  4. 如果 CA 确认你的身份真实可靠,就会发送数字证书给你;
  5. 最后就是安装证书到网站上以及其它将会使用该证书的应用中。

在生产环境中我们需要使用只有权威机构颁发的证书,而在开发环境或者学习环境中我们只需要自己签名的证书就足够了,接下来我们就重点讲如何在 Ubuntu 生成我们自己签名的证书。

生成自签名(self-signed)的证书

我们利用 ubuntu 下的自带的 openssl 工具来生成我们的证书。与上文中提到的获取权威认证机构颁发证书流程相似,首先通过下面命令生成一对密钥。尽管我们只看到了私钥,实际上公钥已经包含在生成的 CSR 中。

1
2
3
4
5
6
mkdir -p ~/keys
cd ~/keys
openssl genrsa -des3 -out server.key 2048
openssl rsa -in server.key -out server.key.insecure
mv server.key server.key.secure
mv server.key.insecure server.key

接下来我们生成证书签名请求 CSR:

1
openssl req -new -key server.key -out server.csr

过程中会要求输入相关站点的信息,如实填写即可。
最后生成证书 - server.crt

1
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

保存好 server.crt 和 server.key 文件,很多需要 SSL/TLS 的服务器或程序都可以使用。