zoukankan      html  css  js  c++  java
  • Ubuntu Linux服务器搭建SSL/TLS(https)(在StartSSL可以得到免费证书)

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

  • 相关阅读:
    完美数据迁移-MongoDB Stream的应用
    补习系列(3)-springboot中的几种scope
    补习系列(2)-springboot mime类型处理
    hdfs directory item limit
    git-format-patch
    SPARK-18560
    hdfs OutOfMemoryError
    hdfs 路径不支持‘:’
    java.io.UTFDataFormatException: encoded string too long:
    scala-maven-plugin excludes
  • 原文地址:https://www.cnblogs.com/findumars/p/6412053.html
Copyright © 2011-2022 走看看