要[启用https](405),就一定要有ssl证书,MT主机上有一个默认的证书,但是签署给plesk这个域名的,并且没有根证书认证,所以,自己搞个CA,给自己签个假证书用吧,至少好看些。
说实话,关于证书这些我也是一知半解,以前弄过[apache的ssl](273),但那只是简单的处理,没有CA什么的,这次我上网搜集了不少资料,走了一个算是更“高级”一点的方式吧,不过出来的证书使用起来没有大差别。
注:所有操作在/big2/tools/ca
下进行。
准备根证书
准备一些空目录和文件,作用如下:
- certs/ 保存颁发的所有证书的副本
- index.txt 跟踪已颁发的证书,初始为空
- openssl.cnf openssl和根证书的配置文件
- private/ CA证书的私钥
- serial 最后一次颁发的证书的序列号,初始值01,也可以是00等其它值
openssl.cnf
内容如下,我一气儿弄了10年的有效期:
[ ca ]
default_ca = FwolfCA
[ FwolfCA ]
dir = /big2/tools/ca
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/certs
private_key = $dir/private/cakey.pem
serial = $dir/serial
default_crl_days= 7
default_days = 3650
default_md = sha1
policy = FwolfCA_policy
x509_extensions = certificate_extensions
[ FwolfCA_policy ]
commonName = supplied
stateOrProvinceName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName= supplied
organizationalUnitName = optional
[ certificate_extensions ]
basicConstraints= CA:false
# 下面是根证书的配置信息
[ req ]
default_bits = 4096
default_keyfile = /big2/tools/ca/private/cakey.pem
default_md = sha1
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
[ root_ca_distinguished_name ]
commonName = Fwolf CA
stateOrProvinceName = The Earth
# countryName只能是两位字母
countryName = CN
emailAddress = one_mail_of_fwolf@gmail.com
#organizationName = Root Certification Authority
organizationName = Fwolf CA Root
[ root_ca_extensions ]
basicConstraints = CA:true
然后生成根证书:
$ openssl req -x509 -newkey rsa:4096 -out cacert.pem -outform PEM -days 3650 -config openssl.cnf
会提示输入密码以及确认密码。生成好以后可以验证一下(说是验证,其实就是看看内容):
$ openssl x509 -in cacert.pem -text -noout
给自己颁发证书
$ openssl req -newkey rsa:4096 -keyout office.fwolf.com.key.pem -keyform PEM -out office.fwolf.com.req.pem -outform PEM -sha1
按提示输入两次密码,然后输入几项证书信息,注意其中organizationName
必须输入,并且Common Name
要和域名一致,比如:
Common Name (eg, YOUR name) []:*.fwolf.com
就生成了私钥key文件和请求req文件,然后把req文件提交给CA根证书签署(盖章):
$ openssl ca -in office.fwolf.com.req.pem -config openssl.cnf
输入根证书的密码,就会在certs/
目录下生成.pem
证书文件,文件名以serial
中的序号开头,信息会存储在index.txt
中。
这样生成的证书,在apache中配置需要两条语句,分别指定证书和私钥:
SSLEngine On
SSLCertificateFile /big2/tools/ca/certs/office.fwolf.com.cert.pem
SSLCertificateKeyFile /big2/tools/ca/certs/office.fwolf.com.key.pem
其实这两个文件是可以合并为一个文件的:
$ cat office.fwolf.com.key.pem office.fwolf.com.cert.pem > office.fwolf.com.pem
然后在配置apache的时候就只需要一句了:
SSLEngine On
SSLCertificateFile /big2/tools/ca/certs/office.fwolf.com.pem
其它
去掉证书的口令
现在证书基本上就可以使用了,再返回来说一个问题,就是在启动apache的时候会提示输入私钥的口令,要想去掉这个(一般都不会喜欢这样的),就要求在生成私钥的时候不要设置口令:
$ openssl req -newkey rsa:4096 -keyout office.fwolf.com.key.pem -keyform PEM -out office.fwolf.com.req.pem -outform PEM -sha1 -nodes
生成根证书的时候还是建议带上个口令,提高安全性。
index.txt
另外,如果要清空index.txt
的话,一定要清空到字节0,里面有一个字节都会导致openssl ca
错误:
wrong number of fields on line 1 (looking for field 6, got 1, '' left)
证书吊销
$ openssl ca -revoke office.fwolf.com.cert.pem
# 生成CRL列表 $ openssl ca -gencrl -out exampleca.crl # 查看CRL列表信息 $ openssl crl -in exampleca.crl -text -noout # 验证CRL列表签名信息 $ openssl crl -in exampleca.crl -noout -CAfile cacert.pem 可以看到CRL的版本号为1,这是OpenSSL默认的,除非crl_extensions被指定在配置文件ca一节中。
上传到MT主机上应用
首先在Server > Certificates >
中Add New Certificate
,填上Add New Certificate
(自己起),然后选下面的Private key
私钥文件和Certificate
证书文件上传,就存到服务器上了。
然后返回证书列表,选中新上传证书前面的复选框,点上面的链接Make default for Web sites
设置为网站默认证书,也可以通过Secure control panel
将其设置为控制面板所使用的证书。
还没完,证书还得加到ip上才能生效,Server > IP Addresses >
中修改ip地址属性,在SSL Certificate
中选择刚才上传的证书,保存,就立刻生效了。
基于ssl/https协议的特性,一个ip上只能使用一个证书,所以合租用户是无法自己上传或者选择其它证书的,不过我现在使用的证书是签给“*”的,也就是所有域名都可以使用,“好看”一点。让我不理解的是,如果在访问一个域名时同意了这个证书,在访问另外一个域名的时候还得再同意一遍,也就是证书和域名是要配套使用的,和我原先的想法不太一致。
参考资料
- [OpenSSL学习纪要 – 建立自己的CA](http://www.devfront.com/?q=node/19)
- [如何架设一个受信任的SSL网站](http://www.wenquan.name/?p=202)
- [Apache 2.0上 HTTPS 实现CA认证, 不是HTPASSWD的那种](http://www.dedecms.com/web-art/fuwuqi/20060913/26240.html)
- [方便数字证书生成的小工具](https://dream4ever.org/showthread.php?t=32264)
- [用OpenSSL做自签名的证书](http://www.blogjava.net/alwayscy/archive/2006/12/01/84852.html)
- [Setup Apache2 with OpenSSL ](http://www.opensourcehowto.org/how-to/apache/setup-apache2-with-openssl.html)
- [[regression] apache2-ssl-certificate has gone missing since feisty](https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/77675)
- [Re: wrong number of fields on line 1](http://www.mail-archive.com/openssl-users@openssl.org/msg31911.html)
可以用startcom的startssl,这样至少在绝大多数电脑上的浏览器都是可信的