LAMP下SSL设置教程

技术 6592 次围观 18 次吐槽

https(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 http 通道,简单讲是 http 的安全版。即 http 下加入 SSL 层,https 的安全基础是 SSL,因此加密的详细内容就需要 SSL。在各个 Linux 发行版中,实现 SSL 的一般则是 openssl 套件。
默认情况下,LAMP 是没有开启 SSL 的,需要手动配置。本篇教程主要是将手动配置的过程总结一下。
下面将从申请 CSR 开始,一步一步部署 SSL。

1、生成证书请求 CSR 文件

这里需要用到 openssl 命令,需要安装 openssl。
CentOS 下:

yum install -y openssl openssl-devel

Debian 或 Ubuntu 下:

apt-get install -y openssl

以 RSA 2048 私钥举例,命令如下:

openssl req -new -nodes -newkey rsa:2048 -sha256 -keyout server.pem -out server.csr

以 ECC 256 私钥举例,命令如下:

openssl ecparam -out server.pem -name prime256v1 -genkey
openssl req -new -key server.pem -out server.csr

以上命令,在生成 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 []:  // 不填

注意:
这里的 server.pem 即为私钥,需要好好保存,最好你申请下来的证书在配置时,需要用到这个私钥,一旦私钥丢失,该证书就废了,只能重新申请。
一般情况下,申请 RSA 2048 的证书就足够了。

以上步骤全部做完,则会生成两个文件:
server.pem
server.csr

将其下载回本地,妥善保管。用任意文本编辑器打开 server.csr,用里面的内容去申请证书即可。

当然,最好是将这 2 个文件改名为你自己的域名,以方便辨识,比如:
teddysun_com.pem
teddysun_com.csr

2、申请证书

现在市面上应该已经存在 5 种免费 SSL(DV)的提供商了,分别是:
1)letsencrypt (https://github.com/certbot/certbot
2)startssl  (https://www.startssl.com/
3)wosign  (https://buy.wosign.com/free/
4)comodo
5)alphassl
前 3 种都比较容易申请,后 2 种则需要通过一些途径才能免费获取的到。

付费的则五花八门了,这里就不再赘述。

申请过程省略。

最后你会得到一个证书文件(一般后缀名为 crt)。
注意:
有的证书(比如 comodo 及 alphassl)还需要合并证书链,将你得到的证书以及根证书合并到同一个文件中才能使用。
每家的证书链都是不一样的,如果你是用 letsencrypt 申请的话,默认已经是有个完整证书链的证书了。
/etc/letsencrypt/live/<domain>/fullchain.pem

Tips:如何合并证书链?
用任意文本编辑器打开你的证书文件(比如名称为:teddysun_com.crt),在文本的最后面添加根证书(teddysun_com.ca-bundle)里的全部内容,保存。

3、部署证书

在安装完 LAMP 环境后,默认是没有加载 SSL 配置的。
1)这里需要修改一下配置文件
/usr/local/apache/conf/httpd.conf
找到下面的一行
#Include conf/extra/httpd-ssl.conf
将前面的 # 注释去掉,保存。

2)将合并后的证书,比如 teddysun_com.crt 和私钥 teddysun_com.pem 复制到路径 /usr/local/apache/conf/ 下。

3)修改配置文件 /usr/local/apache/conf/extra/httpd-ssl.conf ,内容如下:

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/teddysun_com_error_log"
    TransferLog "/usr/local/apache/logs/teddysun_com_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_com.crt
    SSLCertificateKeyFile /usr/local/apache/conf/teddysun_com.pem

    CustomLog "/usr/local/apache/logs/teddysun_com_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>

注意:
该配置文件是基于 Apache 2.4 而来。
VirtualHost 虚拟主机里的配置是可以更改的。
1)如果你想指定固定 IP 到该 VirtualHost,把 <VirtualHost *:443> 改为 <VirtualHost 12.34.56.78:443>,这里的 12.34.56.78 是举例 IP
2)DocumentRoot 是网站根目录,指定为你自己的目录
3)ServerName 是网站主域名,指定为你自己的
4)ServerAlias 是网站的其他域名,可定义多行,也可不定义。不定义的话,就删除该行
5)ErrorLog 是错误日志,指定具体路径
6)TransferLog 是访问日志,指定具体路径
7)SSLEngine 必须是 on
8)SSLProtocol 是指定 SSL 连接方式,不包含 SSLv2 和 SSLv3,这两种已不安全
9)SSLHonorCipherOrder 必须是 on
10)SSLCipherSuite 是加密套件,这里去除了一些不再安全的一些方式
11)SSLCertificateFile 是证书文件,指定具体路径
12)SSLCertificateKeyFile 是证书的私钥文件,指定具体路径
13)CustomLog 是自定义日志的格式
14)BrowserMatch 是浏览器匹配,这里主要是对微软 IE 旧版本 2-5 进行了定义
15)Directory 是和 DocumentRoot 一致的,是对文件夹一些属性的定义

参考链接:
https://httpd.apache.org/docs/current/mod/mod_ssl.html
https://httpd.apache.org/docs/current/mod/mod_setenvif.html
https://httpd.apache.org/docs/current/mod/core.html#directory

4、确认生效

在确认以上步骤全部完成,并且正确的情况下,重启 Apache 后即可生效。

/etc/init.d/httpd restart

查看 httpd 监听的端口,应该会有 443

netstat -anp | grep -v grep | grep httpd

域名解析好后,使用 Chrome 浏览器访问,你就会看到你的网址前有个可爱的小绿锁了。

5、测评

下面就可以来测评一下你的 SSL 部署的得分了。
访问以下网址:
https://www.ssllabs.com/ssltest/index.html

输入你的网站域名,跟上面配置里的 ServerName 的值一致。
稍等片刻,就会看到得分了。

按照以上配置,正常状态下,得分应该是 A

转载请注明:秋水逸冰 » LAMP下SSL设置教程

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

已有评论 (18)

  1. 很不错,用的您的lamp一键脚本,感觉比军哥的好用
    kala3个月前 (2016-12-29)回复
  2. 你好!我看到本站用了CF加速和comodo证书,请问你用的是CF免费版吗?还有 免费版也能使用第三方SSL证书吗?
    Wang3个月前 (2016-12-19)回复
    • 是免费版。 不能使用第三方,默认 CF 会带 SSL。
      秋水逸冰3个月前 (2016-12-20)回复
      • 可是我看你的这个网站使用了CF,SSL用的却是comodo的证书,这不属于第三方证书吗?不明白,求解答,谢谢
        Wang3个月前 (2016-12-24)回复
  3. 你好,咨询一下。部署的lamp,SSL部署之后网站目录改之后打不开网站
    河对岸3个月前 (2016-12-17)回复
  4. 做了测试的,用的StartSSL,还可以!
    山野愚人居5个月前 (2016-10-24)回复
  5. 你好,我想增加 http/2 的支援,lamp 安装包是不是有支持了,还是要重新编译 apache http2_module 谢谢
    mining6个月前 (2016-09-19)回复
    • LAMP 目前还不支持 http2。 安装 http2 需要先安装 libnghttp2 然后在编译 Apache 的时候需加是 --enable-http2 以及 --with-nghttp2=PATH 的参数。
      秋水逸冰6个月前 (2016-09-19)回复
  6. 你好,按照上面的,但是报错了 寻找localhost Making HTTP connection to localhost 警告!:Unable to connect to remote host. lynx: Can't access startfile http://localhost/server-status
    wision7个月前 (2016-09-10)回复
    • 描述不清,也不知你是如何配置的 SSL
      秋水逸冰7个月前 (2016-09-10)回复
      • 按照文章写的来配置的
        wision7个月前 (2016-09-10)回复
        • 那就是配置错误喽,请确认你的每一步配置。 我本人就是用的这个配置。
          秋水逸冰6个月前 (2016-09-11)回复
  7. 你好,请问一下,用你的ShadowsocksR一键安装脚本部署完了服务端,如果ShadowsocksR的代码有更新了,我应该如何更新服务端啊?谢谢!
    saikm9个月前 (2016-06-30)回复
    • 先卸载,再次安装就是最新版了。每次安装都是从 Github 下载最新版代码来安装的。
      秋水逸冰9个月前 (2016-06-30)回复
  8. 秋大你好 按照教程设置ssl之后网站通过http可以正常访问 通过https访问小绿锁可以显示出来 但是提示403 看了下error_log是这样的 请指正是哪里配置有误呢 非常感谢
    灼眼的马哥9个月前 (2016-06-27)回复
    • server certificate does NOT include an ID which matches the server name 配置文件里的 server name 和证书的域名不匹配吧?
      秋水逸冰9个月前 (2016-06-30)回复
  9. 很详细,貌似很多站也都上了HTTPS了
    Nice9个月前 (2016-06-26)回复