一般来说,为了避免敏感信息外泄,涉及密码和敏感信息的页面都必须采用HTTPS连接方式。但由于认证机构的正规SSL根证书非常贵,所以有时只能自己来制作SSL证书。
但是在使用自己生成的SSL证书时,在Apache2的log里会出现如下错误信息
1 |
[ssl:warn] server certificate is a CA certificate (BasicConstraints: CA == TRUE !?) |
出现这样的信息是因为一般网上的教程是直接用服务器的根证书来用作SSL证书的,就像下面这样
1 |
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt |
这样的做法当然没什么问题,但是却不是生成SSL证书的正确方法,因为根证书的目的并不是用作SSL认证的,而是来给其他证书签名的。
正确的生成SSL证书的方法是
1.生成服务器根证书
1 2 3 4 |
openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 openssl rsa -passin pass:x -in server.pass.key -out server.key rm server.pass.key openssl req -new -key server.key -out server.csr |
(Solve You must type in 4 to 1023 characters Error)
1 2 3 4 |
openssl genrsa -des3 -passout pass:gsahdg -out server.pass.key 2048 openssl rsa -passin pass:gsahdg -in server.pass.key -out server.key rm server.pass.key openssl req -new -key server.key -out server.csr |
2.用服务器根证书生成网站SSL证书
1 |
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt |
3.填写证书信息
1 2 3 4 5 6 7 |
Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:NYC Organization Name (eg, company) [Internet Widgits Pty Ltd]:MINIRPLUS Organizational Unit Name (eg, section) []:MINIRPLUS Common Name (e.g. server FQDN or YOUR name) []:*.minirplus.com Email Address []:webmaster@minirplus.com |
注意上面倒数第二行的Common Name,如果想生成的证书是Wildcard SSL,即可以用于所有子域名的,那么这里就不要填写单个域名或根域名,而是填写通配符*.yourDomain。否则在用https访问子域名时浏览器会提示证书与所访问域名不符。
这样生成的证书才是用于HTTPS连接的SSL证书。
另外由于我们之前用的是Wildcard SSL,所以根域名是不在证书的有效域名范围内的,即如果访问https://yourdomain浏览器会提示证书与域名不符。
为了解决这个问题,有两种方法
一种是在apache的conf文件中添加跳转,将所有根域名的访问都跳转到其他地址。
1 2 3 4 |
<VirtualHost *:443> ServerName minirplus.com Redirect "/" "https://www.minirplus.com/" </VirtualHost > |
另外一种是用上面同样的方法再生成一个专门用于根域名的SSL证书。
在生成根证书之后,就可以在conf文件中添加相应的配置信息了
普通HTTP访问的站点配置文件yourWebsite.conf
1 2 3 4 5 6 7 8 |
<VirtualHost *:80> DocumentRoot /var/www/your/sitePath ServerName yourDomain ServerSignature Off <Directory /var/www/your/sitePath > Options -Indexes </Directory> </VirtualHost> |
在原来配置文件的下方增加HTTPS访问的站点配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<IfModule mod_ssl.c> <VirtualHost *:443> DocumentRoot /var/www/your/sitePath ServerName yourDomain ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.crt SSLCertificateKeyFile /etc/apache2/ssl/server.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule> |
运行 service apache2 reload 重新读取配置文件后,就可以通过https访问了。
以上内容基于
- Debian 8.2 Jessie 64-bit
- Apache/2.4.10 (Debian)
- OpenSSL/1.0.1k
There are no comments yet