欢迎访问 SJsir 圣杰博客

A Linux operation and maintenance engineer's Blogs

SSL证书相关知识

1.SSL证书按域名数量分类:

    (1)单域名SSL证书:仅能适用于一个域名;
    (2)多域名SSL证书:可以适用于多个不同的域名;
    (3)通配型SSL证书:也称为泛域名证书,可以适用于读个子域名,可以匹配 *.domain.com,为了配合多域名使用,建议选择通配型SSL证书进行使用。
    (4)万能型SSL证书:支持各种不同混合域名绑定在一张SSL证书之中,不仅支持通配型 *.domain.com,而且还支持1-100个不同的域名;

2.按照SSL证书的类型分类:

    (1)域名型SSL证书DV SSL(Domain Validation SSL):
        申请资料(域名所有权):
        只验证域名所有权,10分钟颁发,保证了网站的机密信息从用户浏览器到服务器之间的传输是高强度加密传输的,是不会被非法窃取和非法篡改的,但是由于只验证域名,从证书仅起到加密传输信息的作用,并不能验证网站的真实身份。
    (2)企业型SSL证书OV SSL(Organization Validation SSL):
        申请资料(OV申请书、公司营业执照扫描件)
        购买者要提交组织机构资料和单位授权信等在官方注册的凭证,认证机构在签发SSL证书前不仅仅要检验域名所有权,还必须对这些资料的真实合法性进行多方查验,只有通过验证的才能颁发SSL证书。
    (3)增强型SSL证书EV SSL(Extended Validation SSL Certificate):
        申请资料(EV授权书、公司营业执照扫描件、律师函)
        与其他SSL证书一样,都是基于SSL/TLS安全协议,都是用于网站的身份验证和信息在网上的传输加密。它跟普通SSL证书的区别也是明显的,安全浏览器的地址栏变绿,如果是不受信的SSL证书则拒绝显示,如果是钓鱼网站,地址栏则会变成红色,以警示用户。

3.SSL的相关的知识:

    (1)SSL协议是介于HTTP协议和TCP协议之前的可选层,介于应用层(Application)和传输层(Transport)。SSL的私钥(xxx.key)要存放在服务器的上面,要求以严格的权限进行控制私钥,SSL的公钥附带在SSL的证书(xxx.crt)信息之中,SSL证书包括:CA名称、电子签名(完整性/真实性)、证书的有效期限。注意:银行USB Key中有客户端的证书,用于和客户端简历起SSL的双向验证。
    (2)SSL工作流程:
        A.客户端–>ClientHello–>服务器
            ①支持的协议版本,如TLS1.0;
            ②客户端生成的随机数,用于生成"对话密钥";
            ③支持的加密算法,如RSA公钥加密;
            ④支持的压缩算法;
        B.服务器–>ServerHello–>客户端
            ①确认加密通信的协议版本(TLS1.0),若不支持则关闭对话;
            ②服务器端生成随机数,用于生成“对话密钥”;
            ③确认使用的加密算法,RSA公钥加密算法;
            ④服务器的证书信息;
            ⑤结束ServerHello会话,ServerHelloDone;
        C.客户端回应–>Cerificate Verify –>服务器
            ①将刚才生成的随机数,用于服务器公钥加密,防止被窃听
            ②编码改变通知,将双方商定的加密方法和生成的密钥进行发送;
            ③客户端结束握手(ClientHelloDone),同时发送所有内容的hash值,用于服务器的校验操作;
            ④切换到Cipher Suite状态,准备开始传输;
        D.服务器信息验证操作;
            使用自己的私钥解密,对数据的完整性进行校验,生成Session Secret,对客户端发送ChangeCipherSpec,使用加密的套件;
        E.传输:
        应用数据传输之前,附加上MAC Secret,对数据包使用write encryption key进行加密,服务器使用 Client write encryption key进行解密,各自使用write MAC key进行数据的完整性校验查看数据是否被修改。
        Master Secret Key Masterial包括:
            Client write MAC key
            Server write MAC key
            Client write encryption key
            Server write encryption key
            Client write IV
            Server wirte IV

4.可选证书的机构:

        GeoTrust、TrustAsia、GlobalSign、RapidSSL、Certum、thawte等,域名价格类型参考网站:https://www.sslcertificateshop.com/

5.证书机构的价格:

    A.GeoTrust:(www.geotrust.com)
        单域名:domain.com,每个子域名都算一个域名;       
                 收费:2578/1/1,4578/1/2,6478/1/3
        多域名:x.domain.com,y.domain.com,z.domain.com。。。保护多个明细域名;
                收费:5000/5/1,9000/5/2,13000/5/3
                           7000/10/1,12500/10/2,18000/10/3
                           11000/20/1,19500/20/2,28000/20/3
        通配符域名:*.domain.com保护一个带通配符域名(该*号同级别的全部明细域名)不支持保护 *.*.domain.com
                收费:6678/1/1,10778/1/2,15578/1/3
    B.TrustAsia:
        域名型(DV)通配符:支持二级泛域名的SSL证书,不支持三级域名;1999/1/1;

6.服务器进行配置:

        Nginx + Tomcat的双层结构,Tomcat的服务器多于一台,后端为tomcat集群;Nginx为静态文件处理和负载均衡。Nginx为前端代理,Tomcat主机不处理自己的https请求且和Nginx主机在同一个局域网内,对于tomcat主机只开放内网可以访问的8080端口。
        用户的访问过程,用户首先应该和Nginx建立起连接,完成SSL建立之后,Nginx作为前端代理和负载均衡器将用户的请求以http协议通过内网转发至tomcat集群进行访问,Tomcat集群数据处理完成之后,再将数据以http协议通过内网转发到nginx调度器上面,再由Nginx进行SSL加密之后发送给用户。
        (1)前期考虑,可在前期重要的数据使用SSL加密后的https协议进行传输,普通的数据使用http协议进行传输。为了用户方便,对用户的访问使用Nginx的rewrite进行端口的重写。对于用户的访问,需要加密访问的内容使用Nginx的rewrite进行重写操作,通过https协议访问443端口调度到后端的Tomcat负载集群上面;不需要加密的内容,静态页面由Nginx主机通过varnish缓存或者memcached进行从缓存中命中访问的内容或者调度到后端的Tomcat服务器集群进行访问。
        (2)后期改变,使用SSL进行全站加密。用户通过80端口访问服务器,对于全部的访问都进行rewrite操作,让用户通过443端口进行访问,对于可缓存的内容使用Nginx+varnish/memcached进行快速调取,对于需要动态获取的内容,再调度到后端的Tomcat集群上面。

7.Nginx+SSL功能实现(本示例为演示示例,根据使用场景去真实灵活配置):

        nginx.conf 中的配置示例
        http {
                upstream cluster{
                        server 172.18.0.33:80 weight=1;
                        server 172.18.0.101:8088 weight=5;
                }
                upstream clusterssl{
                        server 172.18.0.33:8443 weight=1;
                        server 172.18.0.101:8443 weight=5;
                }
                server {
                        listen 80;
                        server_name www.AAA.com;
                        location / {
                                proxy_pass http://cluster;
                                index index.htm;
                                proxy_set_header Host $host;
                                proxy_set_header X-Real-Ip $remote_addr;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                                proxy_set_header X-Forwarded-Proto $scheme;
                                proxy_connect_timeout 10;
                                proxy_read_timeout 120;
                        }
                        location ~* /*login.htm {
                                #rewrite ^(.*) https://host1 permanent;
                                rewrite ^(.*) https://www.BBB.com$1 permanent;
                        }
                        location ~ \.(css|js|gif)$ {
                                #rewrite ^(.*) https://host1 permanent;
                                rewrite ^(.*) https://www.BBB.com$1 permanent;
                        }
                }
                # HTTPS server
                server {
                        listen 443;
                        server_name www.BBB.com;
                        ssl on;
                        ssl_certificate server.pem;
                        ssl_certificate_key server.key;
                        ssl_session_cache shared:SSL:10m;
                        ssl_session_timeout 5m;
                        ssl_protocols SSLv3 TLSv1;
                        ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM;
                        ssl_prefer_server_ciphers on;
                        location / {
                                rewrite ^(.*) http://www.AAA.com$1 permanent;
                        }
                        location ~* /*login.htm {
                                proxy_pass http://cluster;
                                proxy_redirect off;
                                proxy_set_header Host $host;
                                proxy_set_header X-Real-Ip $remote_addr;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                                proxy_set_header X-Forwarded-Proto $scheme;
                        }
                        location ~ .(css|js|gif)$ {
                                proxy_pass http://cluster;
                                proxy_set_header Host $host;
                                proxy_set_header X-Real-Ip $remote_addr;
                                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                                proxy_set_header X-Forwarded-Proto $scheme;
                        }
                }
        }

8.知识细节:

        (1)ssl的证书的私钥需要进行权限的设置,设置用户的私钥为400的权限(r–);
        (2)优化rewrite语句:rewrite复杂而且低效,用return语句代替 rewrite (.*) http://www.example.org1;改为 retrun 301 http://www.example.orgrequest_uri;
        (3)优化SSL配置:在SSL操作中,SSL的握手最消耗CPU资源的SSL操作。
                A.保持客户端的长连接,在一个SSL连接发送多个请求;
                B.被并发的连接或者后续的连接中重用SSL会话参数;避免SSL握手操作;
                C.将SSL会话的内容进行缓存,ssl_session_cache 进行调整;1mb可以缓存4000个会话;
                        ssl_session_cache shared:SSL:10m;
                D.增加SSL会话缓存的超时时长:ssl_session_timeout 10m;

点赞