Ubuntu Linux服务器搭建SSL/TLS(https)

服务器 1416浏览 0评论

首先SSL/TLS是什么鬼?比如你现在正在看的https://awaimai.com/,前面是https,表明这个是https协议,https就是http + SSL/TLS,在http外面套一个加密层,让第三方难以得到传输的明文数据。如果用chrome访问这个站,在这个URL旁边会显示一个绿色的锁,表明这个连接是安全的。另外境外的https还有一个附加效果就是抵御关键字的审查,同时Google也更喜欢收录https的站点。

其实以上是在说废话,看这文章的乃萌肯定是知道此为何物才会找到这里来的啦,所以就不废话了,以下是搭建步骤:

  1. 生成公钥和私钥对
  2. 公钥提交到CA机构签发一个crt证书(不建议自签发证书)
  3. 配置证书链
  4. 在你的 apache 或 nginx 里开启SSL支持并配置好你的crt证书和私钥
  5. [可选]继续其它配置,如SPDY,HSTS,SSL session resumption 和 Perfect Forward Secrecy。其中,你如果希望你的站点是全 https 的话,建议配置HSTS,这样别人使用 http 访问时会自动转向到 https

由于这里主要讲搭建步骤,去CA机构注册什么的就不介绍了,个人小站推荐 StartSSL AlphaSSL ,前者可以得到免费证书。

1 生成公钥和私钥对

执行以下命令

$ openssl genrsa –out my-private.key 2048

就会在当前目录下生成一个私钥文件:my-private.key,文件名自己随便定义。
如果需要对私钥加密,可以执行

$ openssl genrsa -aes256 –out my-private.key 2048

这时需要输入你的自定义密码来保护这个私钥,之后的步骤若用到私钥,则会要求你输入你的自定义密码,然后再执行

$ openssl req –new –key my-private.key –out www.awaimai.com.csr

这时会要求你输入一些信息,具体如下:

Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
A challenge password []:
An optional company name []:

注意:从 Email Address 开始不要填写。Common Name 填写你要 SSL 支持的域名(你的站的域名),如 www.awaimai.com。如果你申请的是泛域名证书,那么这里应该填写类似 *.awaimai.com
填写完毕后就会生成一个 www.awaimai.com.csr 文件,这样第一步就完成了。

2 公钥提交到CA机构签发一个crt证书

使用任何一个文本编辑器打开刚才生成的csr文件,你将会看到类似如下的内容:

 -----BEGIN CERTIFICATE REQUEST-----
 MIICrjCCAZYCAQAwaTELMAkGA1UEBhMCR0IxDzANBgNVBAgMBkxvbmRvbjEPMA0G
 ......
 -----END CERTIFICATE REQUEST-----

复制里面全部内容,然后在CA机构网站上,在提交csr内容的地方,粘贴。如下是 StartSSL 和 AlphaSSL 的网站地址。

签发成功后,你就能下载回来一个.crt文件,可能通过网页上下载,也可能通过邮件方式发送给你。如果是邮件方式的话,要注意最好是使用gmail邮箱。邮件方式的话需要自行复制里面crt文件的部分自行保存为crt文件。crt文件类似以下的格式:

 -----BEGIN CERTIFICATE-----
 MIIETTCCAzWgAwIBAgILBAAAAAABRE7wNjEwDQYJKoZIhvcNAQELBQAwVzELMAkG
 A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
 b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw
 MDBaFw0yNDAyMjAxMDAwMDBaMEwxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
 YWxTaWduIG52LXNhMSIwIAYDVQQDExlBbHBoYVNTTCBDQSAtIFNIQTI1NiAtIEcy
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2gHs5OxzYPt+j2q3xhfj
 kmQy1KwA2aIPue3ua4qGypJn2XTXXUcCPI9A1p5tFM3D2ik5pw8FCmiiZhoexLKL
 dljlq10dj0CzOYvvHoN9ItDjqQAu7FPPYhmFRChMwCfLew7sEGQAEKQFzKByvkFs
 MVtI5LHsuSPrVU3QfWJKpbSlpFmFxSWRpv6mCZ8GEG2PgQxkQF5zAJrgLmWYVBAA
 cJjI4e00X9icxw3A1iNZRfz+VXqG7pRgIvGu0eZVRvaZxRsIdF+ssGSEj4k4HKGn
 kCFPAm694GFn1PhChw8K98kEbSqpL+9Cpd/do1PbmB6B+Zpye1reTz5/olig4het
 ZwIDAQABo4IBIzCCAR8wDgYDVR0PAQH/BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8C
 AQAwHQYDVR0OBBYEFPXN1TwIUPlqTzq3l9pWg+Zp0mj3MEUGA1UdIAQ+MDwwOgYE
 VR0gADAyMDAGCCsGAQUFBwIBFiRodHRwczovL3d3dy5hbHBoYXNzbC5jb20vcmVw
 b3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2NybC5nbG9iYWxzaWdu
 Lm5ldC9yb290LmNybDA9BggrBgEFBQcBAQQxMC8wLQYIKwYBBQUHMAGGIWh0dHA6
 Ly9vY3NwLmdsb2JhbHNpZ24uY29tL3Jvb3RyMTAfBgNVHSMEGDAWgBRge2YaRQ2X
 yolQL30EzTSo//z9SzANBgkqhkiG9w0BAQsFAAOCAQEAYEBoFkfnFo3bXKFWKsv0
 XJuwHqJL9csCP/gLofKnQtS3TOvjZoDzJUN4LhsXVgdSGMvRqOzm+3M+pGKMgLTS
 xRJzo9P6Aji+Yz2EuJnB8br3n8NA0VgYU8Fi3a8YQn80TsVD1XGwMADH45CuP1eG
 l87qDBKOInDjZqdUfy4oy9RU0LMeYmcI+Sfhy+NmuCQbiWqJRGXy2UzSWByMTsCV
 odTvZy84IOgu/5ZR8LrYPZJwR2UcnnNytGAMXOLRc3bgr07i5TelRS+KIz6HxzDm
 MTh89N1SyvNTBCVXVmaU6Avu5gMUTu79bZRknl7OedSyps9AsUSoPocZXun4IRZZ
 Uw==
 -----END CERTIFICATE-----

(以上其实就是AlphaSSL的crt证书,下文会用到)保存好了后,第二步就完成了。

3 配置证书链

这一步被很多其它的教程忽略,因为这一步在某些情况下不是必需的,比如有的会直接给你返回证书链文件,但是在前面推荐的两家机构所签发的证书使用这个步骤的话,会简化不少麻烦事。
首先,打开这个证书,你会发现你的网站与根证书中间差了一级,比如窝的这个的父证书是AlphaSSL,再上一级才是根证书GlobalSign。而浏览器和操作系统里面保存的均是可信任的根证书,中间那一层AlphaSSL很可能是没有的,直接使用刚才保存的crt证书会导致浏览器提示这是不可信的网站。怎么办呢?这就需要配置证书链。其实配置这个证书链非常的简单,首先还是使用文本编辑器打开你的crt证书,然后把你的父级crt证书的内容粘贴到后面,如这样子:

 -----BEGIN CERTIFICATE-----
 自己的crt证书
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
 父级的crt证书
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
 父级的父级crt证书
 -----END CERTIFICATE-----

有多少层就做多少层(除了根证书那一层),然后保存为新的crt文件,就完成了证书链的配置了。
这样做可以简化后面的配置。
不过这个时候问题来了,父级的crt证书怎么得到呢?比如这里窝的父级证书是AlphaSSL,直接用firefox访问它的网站,然后查看证书信息,导出为crt就行了。

4 在Apache里开启SSL支持并配置crt证书和私钥

因为nginx里配置这个比apache容易多了,这里就只介绍 Apache 的。
注明一下,窝用的linux发行版为ubuntu 12.04,部分命令或路径可能因不同的发生版略有差别。
首先开启apache中SSL模块:

# a2enmod ssl

进入路径 /etc/apache2/sites-enabled,看一下是不是只有一个default,而同时 /etc/apache2/sites-available/ 下存在 default-ssl,是的话在 sites-enabled下创建一个链接

/etc/apache2/sites-enabled# ln -s ../sites-available/default-ssl 001-ssl

在 001-ssl 配置文件中,除了SSL配置部分,其他的保持和原本的http的站一致就好了(可别做出直接整个文件内容覆盖这么二的事情)。如果漏做这个步骤,Apache会报 ssl_error_rx_record_too_long 错误。然后开始配置SSL部分,注意以下三行:

SSLCertificateFile /home/root/awaimai.com.crt
SSLCertificateKeyFile /home/root/awaimai.com.key
SSLCertificateChainFile /home/root/awaimai.com.crt

其中,

  • SSLCertificateFile:crt文件路径(必需)
  • SSLCertificateKeyFile :私钥路径(必需)
  • SSLCertificateChainFile:证书链文件路径(可选)

如果已经把证书链直接配置到 crt 文件里的话,SSLCertificateChainFile 就直接填写crt文件的路径。如果签发机构把证书链文件也发给你的话,保存为.pem文件然后在这里引用即可。如果你的证书的父级证书是根证书,或已经被主流浏览器或操作系统广泛支持,那么此段可注释忽略。

最后检查是否 SSLEngine on,对了以后执行

# service apache2 restart

重启服务即可。

5 配置HSTS (可选)

这里只介绍HSTS的配置,因为这个很可能会用到,SPDY什么的参阅别人的配置文章吧。执行以下命令

# a2enmod headers

开启headers模块,然后编辑文件 /etc/apache2/sites-enabled/001-ssl (如果你刚才设置的文件名是001-ssl的话,若不是就自己换)
在VirtualHost里面加入一行:

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"

其中 preload 那一段是可选的,加不加均可,加了的话可以去 google 申请 Chromium 的 Preload HSTS 列表。而 63072000 那个是有效期的秒数,63072000 是两年的秒数,在有效期里面,浏览器会记着这个站是应该用 https 访问的。

6 总结

最后嘛,为啥窝会想到弄成https呢?因为窝知道很多路由器可以开启网站访问log,会记录下访问者IP、所访问的url、以及get/post参数内容。你知道这表示什么吗?

这表示如果你通过这个路由器上网,然后在普通 http 网页上做登陆操作,那么路由器的管理员可以通过查 log 得到你对应网站的登陆信息,这是非常危险的,因为绝大多数的网站在传输登陆信息的时候,均使用明文发送密码,这样你的帐号密码就被看得一清二楚了。但是 https 的话,路由器根本无法知道你所访问的 url 是什么,更别说具体的参数内容了,只能知道访问者的IP和目标IP,安全性自然大大提高。

比如窝在知乎上的密码会经常性的更换,为什么呢?因为只要登陆知乎,比如你在麦当劳用免费 wifi,那么那边的路由管理员就知道你的帐号密码了。或者电信联通什么的也会知道,因为它们在政策下必须保留至少3个月的路由数据,而你的帐号密码就在那里保存至少三个月,想要抓你只要把你的登陆记录找到,然后登陆你的帐号,查你的个人信息就知道你到底是谁了。也就是说,任何非https连接下做登陆或其它敏感操作是非常危险的,所有的操作被完整的记录了下来。窝完全不明白知乎这种大站为啥都不支持https,用户私隐如此不值钱?

本文除了介绍SSL/TLS的配置外,还简要的介绍了一下其必要性,科普一下网络安全方面的东西。如对这方面还有疑问,欢迎留言或mail窝。

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址