首先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窝。

http://www.awaimai.com/126.html

Ubuntu Linux服务器搭建SSL/TLS(https)(在StartSSL可以得到免费证书)的更多相关文章

  1. [亲测]ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  2. [亲测]七步学会ASP.NET Core 2.0怎么发布/部署到Ubuntu Linux服务器并配置Nginx反向代理实现域名访问

    前言 ASP.NET Core 2.0 怎么发布到Ubuntu服务器?又如何在服务器上配置使用ASP.NET Core网站绑定到指定的域名,让外网用户可以访问呢? 步骤 第1步:准备工作 一台Liun ...

  3. [skill][https][ssl/tls] HTTPS相关知识汇总

    结论前置: A 身份验证 证书, 服务器证书 B 密钥协商 RSA   DHE / ECDHE   PSK C 加密通信 加密通信采用对称加密,使用B阶段协商出来的密钥. B 阶段如果使用 RSA 协 ...

  4. Python Web学习笔记之SSL,TLS,HTTPS

    一. SSL 1. SSL简介 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可 ...

  5. ubuntu gitlab服务器搭建

    gitlab服务器搭建 1.安装依赖包 sudo apt-get install curl openssh-server ca-certificates postfix 执行完成后,出现邮件配置,选择 ...

  6. 结合jenkins在Linux服务器搭建测试环境

    何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...

  7. Linux服务器搭建相关教程链接整理

    Linux: Linux 教程 | 菜鸟教程 linux下如何添加一个用户并且让用户获得root权限 - !canfly - 博客园 Git: 在 Linux 下搭建 Git 服务器 - 黄棣-dee ...

  8. LINUX服务器搭建和常用配置介绍

    服务器搭建 : 搭建私有CA服务器 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_011_ca.html搭建samba服务器 : h ...

  9. linux服务器搭建--将win10换成linux

    在这里说记录一下自己装linux的步骤,如果也有需要的朋友可以参看下: 1.目前win10的系统装成inux系统有3个解决办法: 第一:win10装linux子系统,网上已经有很多教程,步骤很简单 第 ...

随机推荐

  1. [Codevs 1107][NOIP 1107]等效表达

    主题连接:http://codevs.cn/problem/1107/ 一道非常奇妙的题目. 对于算术表达式一类的问题,能够採用编译原理里的后缀表达式的方式来做.详细做法是分别维护两个栈,一个栈里保存 ...

  2. 修改NuGet packages目录路径

    在*.sln文件同目录下新建配置文件nuget.config,内容为 <?xml version="1.0" encoding="utf-8"?> ...

  3. centos7 firewall-cmd查看端口是否开放及开放端口

    查询端口号80 是否开启:firewall-cmd /tcp 永久开放80端口号:firewall-cmd --permanent --zone=public /tcp 移除80端口号:/tcp -- ...

  4. JUnit中@Test的运行顺序

    原文链接: Test execution order 原文日期: 2012年12月06日 翻译日期: 2014年10月16日 翻译人员: 百里马 依照设计,Junit不指定test方法的运行顺序. 到 ...

  5. Android Studio教程-创建第一个项目Hello World

    前段时间打开Android studio 在build过程中总会出现以下错误 Error:Execution failed for task ':app:preDebugAndroidTestBuil ...

  6. 高并发场景之RabbitMQ

    高并发场景之RabbitMQ 上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能 ...

  7. Android 在子线程中更新UI的几种方法

    第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...

  8. 阿里云CentOS7系统搭建JavaWeb环境

    一,准备工作 1,安装目录 我们创建如下路径/usr/develop,然后在develop目录下面创建java,tomcat和mysql三个目录即可. 二,配置JDK 1.理解wget命令 wget命 ...

  9. 一组西门子S7 报文

    03 00 00 16 11 E0 00 00 00 01 00 C1 02 10 00 C2 02 03 01 C0 01 0A(第一次握手报文) 03 00 00 16 11 D0 00 01 0 ...

  10. Android Studio:Grade 全局参数定义

    Grade 全局参数定义 实际开发中设置公共的编译依赖参数等. 方法一: 在项目外层的build.gradle文件中定义,格式如下: 文件名:build.gradle ext { sourceComp ...