Archive

Posts Tagged ‘ssl’

生成用于web服务器的openssl证书

June 25th, 2008

启用https,就一定要有ssl证书,MT主机上有一个默认的证书,但是签署给plesk这个域名的,并且没有根证书认证,所以,自己搞个CA,给自己签个假证书用吧,至少好看些。

说实话,关于证书这些我也是一知半解,以前弄过apache的ssl,但那只是简单的处理,没有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上只能使用一个证书,所以合租用户是无法自己上传或者选择其它证书的,不过我现在使用的证书是签给“*”的,也就是所有域名都可以使用,“好看”一点。让我不理解的是,如果在访问一个域名时同意了这个证书,在访问另外一个域名的时候还得再同意一遍,也就是证书和域名是要配套使用的,和我原先的想法不太一致。

参考资料

Related posts

Apache, Hosted , , , , , ,

配置Apache的ssl安全连接

December 27th, 2006

环境:ubuntu 6.06, Apache 2.0.55

第一步:生成ssl certficate文件
首先当然是正常安装apache2了,然后:

sudo apache2-ssl-certificate

生成一个1024位的RSA私钥,并保存为/etc/apache2/ssl/apache.pem,如果你已经有了CA证书,应该也是可以拿过来直接使用,或者用来生成这个私钥的(这应该属于另外一个话题了,我也没有用过)。

apache2-ssl-certificate执行过程中要回答一些问题,如下,注意如果[]里已经给出了默认值,而你又想把这项置空的话,可以输入英文句号“.”:

Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:
Organization Name (eg, company; recommended) []:.
Organizational Unit Name (eg, section) []:.
server name (eg. ssl.domain.tld; required!!!) []:localhost
Email Address []:fwolf@mail.com

一般来说,server name和实际的网站域名还是保持一致比较方便。

第二步:启用ssl mod

sudo a2enmod ssl

或者

:/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/ssl.conf ssl.conf
:/etc/apache2/mods-enabled$ sudo ln -s ../mods-available/ssl.load ssl.load

第三步:添加监听端口,配置虚拟主机
添加端口:在/etc/apache2/ports.conf中增加一行“Listen 443”,显然,如果你想让默认的80端口就使用ssl的话,就可以省略这一步了,并在后面的配置中略微调整。

在apache虚拟主机的配置文件conf中,段,添加SSL的定义,比如:

<VirtualHost *:443>
ServerAdmin Fwolf
ServerName www.fwolf.com

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

DirectoryIndex index.php index.html index.html.var

然后重启apache,就能够使用https访问网站了。

如果想配置成80端口默认就使用https,首先不需要在ports.conf中添加443端口的监听了,其次是在配置VirtualHost的时候也不用带上:443了,但即使这样,配置完成后使用http://www.domain.com访问配置好的网站时,还是会提示:

Bad Request

Your browser sent a request that this server could not understand.
Reason: You’re speaking plain HTTP to an SSL-enabled server port.
Instead use the HTTPS scheme to access this URL, please.

Hint: https://www.fwolf.com/

这是由于使用http协议去访问一个https的端口造成的,最简单的解决方法是使用https://www.domain.com:80/来替代,不过,通过修改apache配置,把到80端口的http访问重定向到443端口的https访问效果会更好一些,就像下面的配置:

NameVirtualHost *:80
<VirtualHost *:80>
Redirect permanent / https://localhost/
</virtualhost>

NameVirtualHost *:443
<VirtualHost *:443>
ServerAdmin Fwolf
ServerName www.fwolf.com
</virtualhost>

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem

这样所有http访问就自动被重定向到https访问上了,不过如果你只能在外网开一个端口的话就比较麻烦了,同时https也只能包含一个站点(无法通过ServerName辨识多个站点)。

如果能够把http和https协议同时绑定到一个端口上,用户访问的时候似乎就更方便了,不过很多地方都说这是不可能的,加密与明文协议不可能同时存在于一个端口上,这里有个讨论给出了一种方案,虽然经过我的实验并不成功,还是把代码贴出来,供有兴趣的朋友继续研究。

<IfDefine !SSL>
RewriteEngine on
RewriteCond %{HTTPS} != on
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=permanent]
</IfDefine>

一个小问题:我生成的pem文件怎么有效期都只有一个月?难道这是默认的?pem文件到期之后会发生什么事情呢?

update @ 20070126

默认生成的pem文件确实只有一个月的有效期,过期之后倒是还能使用,只是在客户端会有一个提示证书无效的确认,所以在生成证书的时候,记得用-day x参数指定有效期限,比如十年什么的。

sudo apache2-ssl-certificate –force -days 3650

(当pem文件已经存在的时候,需要使用–force参数指定覆盖)

参考:
Need Apache2 SSL howto
Apache2 SSL
You’re speaking plain HTTP to an SSL-enabled server port. - HELP PLEASE !

Update @ 2007-07-31

Ubuntu 7.04 feisty中没有apache2-ssl-cerfiticate这个命令,需要自己下载一个包,然后解压,把里面的ssleay.cnf拷贝到/usr/share/apache2/,然后就可以执行解压的另外一个可执行文件apache2-ssl-certificate来生成证书了。

参见:

Related posts

Apache , ,

-->