您现在的位置是:首页 > 其他

李清波 2017-08-02 其他 1761 复制当前网址

LAMP下SSL设置教程

ssl.png


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 []:admin@teddysun.com  // 邮箱地址(一定要有个域名邮箱,用以验证域名所有权)

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


文章来源:https://liqingbo.com/blog-1430.html

评论