Apache下部署SSL教程

技术 10576 次围观 22 次吐槽

https(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 http 通道,简单讲是 http 的安全版。即 http 下加入 SSL 层,https 的安全基础是 SSL,因此加密的详细内容就需要 SSL。
个人网站用 SSL 证书,国外这几年开始比较流行起来,尤其是 Google 对使用了 SSL 证书的网站收录良好,越来越多的网站开始使用 https 访问了。但是国内的一众搜索引擎对 SSL 就不那么友好了,而且使用 SSL 后会拖慢网站浏览速度。
不管怎样,安全性越来越受到重视总归不是一件坏事。
那么在 Apache 里配置 SSL 是怎样的,我们一步一步来。

一、使用 OpenSSL 生成证书请求
生成 rsa 私钥(2048位)

openssl genrsa -out teddysun.pem 2048

Generating RSA private key, 2048 bit long modulus
.........................+++
................................................................+++
e is 65537 (0x10001)

生成 csr 证书请求

openssl req -new -sha256 -key teddysun.pem -out teddysun.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN  // 国家代码
State or Province Name (full name) []:Shanghai  // 省
Locality Name (eg, city) [Default City]:Shanghai  // 城市
Organization Name (eg, company) [Default Company Ltd]:Teddysun // 组织或公司名
Organizational Unit Name (eg, section) []:  // 不填
Common Name (eg, your name or your server's hostname) []:*.teddysun.com // 此处演示是通配符域名,一般带 www 前缀即可
Email Address []:[email protected]  // 邮箱地址

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:  // 不填
An optional company name []:  // 不填

查看生成完毕的文件

ll *.pem *.csr

-rw-r--r-- 1 root root 1058 Jan 22 14:30 teddysun.csr
-rw-r--r-- 1 root root 1675 Jan 22 14:25 teddysun.pem

将上述 2 个文件下载到本地,用记事本打开 teddysun.csr,里面的完整内容就是证书请求了。

二、签发证书

如果需要默认受信任的证书,则需要花钱购买了。比如 
https://www.namecheap.com/security/ssl-certificates/comodo/positivessl.aspx 
只需 9 美元/年。
利用第一步生成的 csr 文件,即可申请证书,过程略,网上有一堆图文教程。

另外,证书可以自签,但是使用的时候需要安装根证书,否则便不受信任。
下面说说自签名证书步骤

生成根证书 rsa 私钥(2048位)

openssl genrsa -out ca.pem 2048

Generating RSA private key, 2048 bit long modulus
...............................................+++
.........+++
e is 65537 (0x10001)

利用私钥创建根证书

openssl req -new -x509 -days 3650 -key ca.pem -out ca.crt

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Shanghai
Locality Name (eg, city) [Default City]:Shanghai
Organization Name (eg, company) [Default Company Ltd]:Teddysun
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:teddysun.com Root CA
Email Address []:[email protected]

至此,有效期为 3650 天的根证书 ca.crt 就创建完毕了。
查看生成完毕的文件

ll *.pem *.csr *.crt

-rw-r--r-- 1 root root 1411 Jan 22 15:14 ca.crt
-rw-r--r-- 1 root root 1679 Jan 22 14:48 ca.pem
-rw-r--r-- 1 root root 1041 Jan 22 14:40 teddysun.csr
-rw-r--r-- 1 root root 1675 Jan 22 14:25 teddysun.pem

利用根证书签发 ssl 证书

openssl ca -in teddysun.csr -out teddysun.crt -cert ca.crt -keyfile ca.pem

这一步出错了,错误信息如下

Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt'
140292081481544:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r')
140292081481544:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

提示缺少文件,那我们就生成一个空文件

touch /etc/pki/CA/index.txt

继续执行

openssl ca -in teddysun.csr -out teddysun.crt -cert ca.crt -keyfile ca.pem

又出错了,错误信息如下

Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory
error while loading serial number
140375536244552:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/serial','r')
140375536244552:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

还是缺少文件,这里生成一个内容为 01 的文件

echo '01' > /etc/pki/CA/serial

再次执行

openssl ca -in teddysun.csr -out teddysun.crt -cert ca.crt -keyfile ca.pem

Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan 22 07:35:14 2015 GMT
            Not After : Jan 22 07:35:14 2016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Shanghai
            organizationName          = Teddysun
            commonName                = *.teddysun.com
            emailAddress              = [email protected]
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                E8:7F:9E:BE:12:25:22:48:A2:49:AE:D5:CB:A6:7B:24:EE:A6:E2:5B
            X509v3 Authority Key Identifier: 
                keyid:C7:0C:EF:F2:73:8C:CB:01:7A:8F:9C:30:A7:80:37:FA:E7:B6:88:02

Certificate is to be certified until Jan 22 07:35:14 2016 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

至此,就签发了一个默认有效期为 365 天的通配符域名 *.teddysun.com 的 ssl 证书了。
如果想签发更长有效期的证书,比如 730 天的,则命令如下:

openssl ca -in teddysun.csr -out teddysun2.crt -days 730 -cert ca.crt -keyfile ca.pem

最长不能超过根证书的有效期。

查看最终生成完毕的文件

ll *.pem *.csr *.crt

-rw-r--r-- 1 root root 1411 Jan 22 15:14 ca.crt
-rw-r--r-- 1 root root 1679 Jan 22 14:48 ca.pem
-rw-r--r-- 1 root root 4594 Jan 22 15:35 teddysun.crt
-rw-r--r-- 1 root root 1041 Jan 22 14:40 teddysun.csr
-rw-r--r-- 1 root root 1675 Jan 22 14:25 teddysun.pem

分别解释一下这 5 个文件。
ca.crt 是签发完成的根证书文件
ca.pem 是根证书的私钥文件
teddysun.crt 是签发完成的域名证书文件
teddysun.csr 是证书请求文件
teddysun.pem 是签发域名的私钥

如果要使用自签名的证书,需要在本机导入根证书,步骤如下:
点击“安装证书”,下一步,将所有的证书放入下列存储,浏览,选择“收信任的根证书颁发机构”,下一步,完成。

安装好根证书后,再打开后,就是这个样子的:

自签名证书则是这个样子的:

三、在 Apache 下部署 ssl 证书

首先需要合并一下证书文件,用记事本打开 ca.crt 文件,全选,复制,再用记事本打开 teddysun.crt ,在其内容的最后,回车,粘贴 ca.crt 的全部内容,保存。
当然,如果是在 namecheap 申请到的证书,发到你邮箱的时候都都打包好了,证书也合并好了,直接使用即可。

在安装完 LAMP 环境后,默认是没有加载 https 配置的,这里需要修改一下配置文件 /usr/local/apache/conf/httpd.conf ,找到下面的
#Include conf/extra/httpd-ssl.conf ,将前面的 # 去掉,保存。
将合并后的证书 teddysun.crt 和私钥 teddysun.pem 复制到 /usr/local/apache/conf/ 下。
再修改配置文件 /usr/local/apache/conf/extra/httpd-ssl.conf ,Sample 内容如下:

Listen 443
SSLPassPhraseDialog  builtin
SSLSessionCache  "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300

<VirtualHost *:443>
	DocumentRoot /data/www/default/
	ServerName teddysun.com
	ServerAlias www.teddysun.com
	ErrorLog "/usr/local/apache/logs/lamp_error_log"
	TransferLog "/usr/local/apache/logs/lamp_access_log"

	SSLEngine on
	SSLProtocol All -SSLv2 -SSLv3
	SSLHonorCipherOrder on
	SSLCipherSuite ALL:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

	SSLCertificateFile /usr/local/apache/conf/teddysun.crt
	SSLCertificateKeyFile /usr/local/apache/conf/teddysun.pem

	CustomLog "/usr/local/apache/logs/lamp_ssl_request_log" \
		"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b \"%{Referer}i\" \"%{User-Agent}i\""

	BrowserMatch "MSIE [2-5]" \
		nokeepalive ssl-unclean-shutdown \
		downgrade-1.0 force-response-1.0

	<Directory /data/www/default/>
		Options -Indexes +FollowSymLinks
		AllowOverride All
		Require all granted
	</Directory>
</VirtualHost>

上述配置都修改完毕后,注意防火墙要放行 443 端口。查看防火墙状态:

/etc/init.d/iptables status

然后再重启 Apache ,命令:

/etc/init.d/httpd restart

好了,现在就可以愉快地用 https 访问网站了。

转载请注明:秋水逸冰 » Apache下部署SSL教程

发表评论
取消评论
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
表情

已有评论 (22)

  1. 博主,请问使用letsencrypt获取ssl证书,如何设置apache?我用你的安装包自带的http-ssl.conf配置无效,用了下面的配置重新生成http-ssl.conf,出现403错误,不过浏览器的那个小绿锁出现了: cat >/usr/local/apache/conf/extra/httpd-ssl.conf<<EOF Listen 443 AddType application/x-x509-ca-cert .crt AddType application/x-pkcs7-crl .crl SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProxyCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLHonorCipherOrder on SSLProtocol all -SSLv2 -SSLv3 SSLProxyProtocol all -SSLv2 -SSLv3 SSLPassPhraseDialog builtin SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)" SSLSessionCacheTimeout 300 #SSLMutex "file:/usr/local/apache/logs/ssl_mutex" //这一句出错了,我注释掉了 EOF 在虚拟主机的conf配置里我是这样写的: DocumentRoot /home/wwwroot/www.freehao123.com //网站目录 ServerName www.freehao123.com:443 //域名 ServerAdmin [email protected] //邮箱 ErrorLog "/home/wwwlogs/www.freehao123.com-error_log" //错误日志 CustomLog "/home/wwwlogs/www.freehao123.com-access_log" common //访问日志 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/www.freehao123.com/fullchain.pem //之前生成的证书 SSLCertificateKeyFile /etc/letsencrypt/live/www.freehao123.com/privkey.pem //之前生成的密钥 //网站目录 SetOutputFilter DEFLATE Options FollowSymLinks AllowOverride All Order allow,deny Allow from all DirectoryIndex index.html index.php 请教博主,如今的403错误有可能是什么引起的呢?我的虚拟主机目录什么的配置都是对着的,http可以正常访问,就https不行。
    很好1年前 (2016-06-10)回复
    • 虚拟主机的 conf 配置最好跟 SSL 的配置 conf 分开来写。 https 不行说明你还是没有配置对罢了。
      秋水逸冰1年前 (2016-06-10)回复
  2. 博主你好!能否以你的LAMP一键脚本搭建的环境为范本重新写一篇深入浅出的SSL部署教程吗?现在证书很便宜了,ssl已经变得越来越普及,重新出一篇这个教程也可以让你的LAMP一键脚本应用变得更加完善。 本文主要讲的是如何使用自签证书的SSL,自签证书在网站需要正式运营的情况下意义不大。
    JOHN1年前 (2016-06-05)回复
    • 我刚刚按照本文教程部署了一个9美元的Comodo PositiveSSL证书, 在最后一步我清空配置文件 /usr/local/apache/conf/extra/httpd-ssl.conf 原本默认的所有内容,然后把你的Sample内容粘贴进去并修改成对应我的配置, 接着重启Apache时提示第20行(SSLCACertificateFile /usr/local/apache/conf/root.pem)出现错误,然后我看到该目录下没有root.pem这个文件,于是把这一行内容删掉再次重启Apache却可以了。 最后用HTTPS链接浏览网站和看到证书都正常,请问博主我这样操作是正确的吗?谢谢!
      JOHN1年前 (2016-06-06)回复
      • 是正确的。证书都合并到一个文件里,是不需要 root.pem 的。
        秋水逸冰1年前 (2016-06-06)回复
  3. 请教博主:我有一张网卡绑定 2 组IP, 如何配置 2 个 HTTPS 分别 2 个虚拟主机....
    mining1年前 (2016-02-26)回复
    • 参考这篇教程,修改配置文件 httpd-ssl.conf 里的 VirtualHost 新建一个 VirtualHost ,并指定详细的 IP 到 VirtualHost 即可。 比如现在是 VirtualHost *:443 (*是代表所有的 IP) 改为VirtualHost IP:443 有几个 IP 就可以指定几个 VirtualHost 了。
      秋水逸冰1年前 (2016-02-27)回复
  4. 博主,我用http和https都可以访问,请问要怎么强制使用https访问呢 ?
    nic20132年前 (2015-11-17)回复
    • 方法一,新建虚拟主机,强制 302 到 https; 方法二,网站根目录下,重写 .htaccess 文件。包含以下内容:
      <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] </IfModule>
      秋水逸冰2年前 (2015-11-18)回复
      • 这个语法的确有效。那么http下,带www与不带www全部重定向https://www.***这种效果的语法又怎么写呢?望指教,谢谢!
        JOHN1年前 (2016-06-06)回复
        • 新建个虚拟主机,定义一个目录,下面只放个.htaccess 文件,按照这个格式,抄一遍。 这样不就都搞定了么。
          秋水逸冰1年前 (2016-06-06)回复
          • 找到一个办法可以先用301重定向把无www转到带www即可实现这种效果,或者带www转到无www也可使用此法,反过来写就行了。.htaccess规则写法示例以下(abc.com需要换成自己的域名): RewriteEngine On RewriteCond %{HTTP_HOST} ^abc.com [NC] RewriteRule ^(.*)$ http://www.abc.com/$1 [L,R=301] RewriteCond %{HTTPS} !=on RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
            JOHN1年前 (2016-06-11)回复
  5. 沃通可以申请免费的受信任证书 https://letsencrypt.org/ 这个网站是火狐的免费证书计划,不过现在还没开始运营,页面上说9月开始
    灬莱瓦汀2年前 (2015-07-14)回复
    • 沃通的证书兼容性还是不行,在 Firefox 下不认。 ssl 是大势所趋,迟早有一天,证书行业就跟杀毒行业一样,免费成主流。
      秋水逸冰2年前 (2015-07-14)回复
  6. 试了一下这个页面的HTTPs、显示的是:Windows没有足够信息验证此证书。后面过了一会儿。。。验证了 :!: 最后地址栏还是显示的XXX
    Zhys3年前 (2015-02-28)回复
  7. 求教三级CA怎么发 二级CA会发了 三级CA一直失败。。
    Pt3年前 (2015-02-27)回复
    • 我也只发了二级 CA,三级的话,你还是 google 一下吧。
      秋水逸冰3年前 (2015-02-27)回复
  8. lamp一键的虚机怎么配置?麻烦楼主说明..谢谢
    过客3年前 (2015-02-18)回复
  9. lamp虚机怎么配置?
    过客3年前 (2015-02-18)回复
  10. 开 ssl 后混合内容。。。。。处理很费劲,后来放弃了。。。申请一年的 ssl 也没用。
    漠然3年前 (2015-02-02)回复
    • 混合内容其实没多少东西,全部换成 https 后就好了。
      秋水逸冰3年前 (2015-02-02)回复
  11. 一直在学习,从未超越谁。。。。。。 貌似 StartSSL 可以申请一年的
    漠然3年前 (2015-02-02)回复