证书签名方案
使用OpenSSL制作证书其实还蛮简单的,只是证书签名的部分有一点复杂,方法有三:
- 交由受浏览器信任的第三方证书颁发机构签名;
- 自签名;
- 自制CA证书并用其签名。
对于上线运营的网站来说,第一个方案是首选,因为只有这样浏览器才不会报警。过去买证书很贵,现在倒是有免费的了,比如IE和Firefox都内置的StartSSL。
不同的证书颁发机构对于证书生成多少都会有自己的要求,所以本文主要讨论后两种方案。
自签名证书
注:下面提到的很多命令都需要一个openssl配置文件,该文件一般名为openssl.cnf。Linux里一般不用管,Windows可使用参数config指定路径,使用环境变量OPENSSL_CONF也可以。
使用如下命令即可生成自签名证书:
openssl req -x509 -newkey rsa:1024 -nodes -days 365 -out self.pem -keyout self.key
req命令表示创建证书,newkey参数表示创建私钥而不是从已存在的文件中读取,nodes参数表示不加密私钥。如果不添加nodes参数,以后每次使用私钥时都必须输入密码(如Apache每次重启)。
输入证书信息时,Common Name需要写域名,支持通配符,如*.domain.tld。
程序运行完成后,self.pem即为完成签名的证书,self.key则为私钥。
使用上述命令创建的证书只能写一个域名匹配字符串,如写了*.domain.tld之后,访问https://domain.tld仍然会报错。如果想在一个证书中指定多个域名匹配字符串,则需要打开openssl.cnf文件,在末尾处添加如下内容:
[ ca_x509v3_more_cn_ext ] nsComment="OpenSSL Generated Certificate" subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always basicConstraints=CA:true subjectAltName = DNS:domain.tld,DNS:*.domain.tld
将subjectAltName行修改为需要的内容后保存退出,使用如下命令重新生成自签名证书:
openssl req -x509 -newkey rsa:1024 -nodes -days 365 -out self.pem -keyout self.key -extensions ca_x509v3_more_cn_ext
自制CA证书并用其签名
如需要使用多个证书,每一个都自签名则意味着每一个都需要导入浏览器,这样就很麻烦。自制CA证书并用其签名后,无论制作了多少个证书,都只需要将自制的CA证书导入浏览器即可,相对来说方便些。
上例中用一条命令直接生成了私钥和证书,这次换个方法,分解为两步。
首先,生成自己的个人私钥:
openssl genrsa -des3 -out my.key 2048
des3参数表示使用该算法加密生成的私钥,以后每次使用私钥时都必须输入密码,去掉这个参数则不进行加密。
根据个人私钥生成自签名CA证书:
openssl req -x509 -key my.key -days 911 -new -out my.pem
输入证书信息时,Common Name可以写自己的名字。将该CA证书导入浏览器后,该名字会显示在证书管理器中。
接下来生成服务器的私钥和证书:
openssl req -newkey rsa:1024 -nodes -days 365 -out server_unsigned.pem -keyout server.key
再之后,就可以用个人证书签名服务器证书了:
openssl ca -days 365 -md sha1 -in server_unsigned.pem -out server.pem -cert my.pem -keyfile my.key
如该命令报错找不到index.txt之类的,视openssl.cnf中的配置,则需要做点准备工作:
mkdir demoCA mkdir demoCA\newcerts touch demoCA\index.txt echo 11 > demoCA\serial
index.txt为空,serial随便写一个两位的数字进去。
多个域名的支持问题,跟上面说的一样,添加extensions参数:
openssl ca -days 365 -md sha1 -in server_unsigned.pem -out server.pem -cert my.pem -keyfile my.key -extensions ca_x509v3_more_cn_ext
完成后,server.key和server.pem即为已签名的证书及私钥。如果用在Lighttpd中,将两个文件合并即可。
最后,将my.pem导入至浏览器中“受信任的根证书颁发机构”即可。
其他
如果要去掉私钥的密码保护,可以这样做:
openssl rsa -in my.key -out my_plain.key
如果需要根据私钥生成公钥,可以这样做:
openssl rsa -in my.key -pubout -out my_public.key
证书生成后,可以使用如下命令查看详细信息:
openssl x509 -fingerprint -text -in my.pem
使用证书加密信息:
openssl smime -encrypt -in ptest.txt -out etest.txt my.pem
使用私钥解密:
openssl smime -decrypt -in etest.txt -out dtest.txt -inkey my.key
若需要DER格式的证书,可使用如下命令进行转换:
openssl x509 -in my.pem -outform DER -out my.der