2016/01/26

https一些事项记录


因为现在开发的职评网项目关系到人才数据比较重要,加上里面涉及到支付方面,所以后期必须用上https保证传输不被截取破解。网上有很多概念性的说明和讲解,例如下面这几篇:

HTTPS那些事(一)HTTPS原理

HTTPS那些事(二)SSL证书

HTTPS那些事(三)攻击实例与防御

为什么在12306买火车票要装根证书?

数字签名是什么?

RSA算法原理(一)

RSA算法原理(二)

什么是证书吊销列表(CRL)?吊销列表起什么作用

在这里记录下一些自己觉得比较关键的内容。


https涉及到加密算法有:

对称性加密:aes, rc4, des3
非对称加密:rsa, dsa/dss
Hash算法:md5, sha1, sha256

CA: (Certificate Authority) 数字证书认证机构

SRCA: (Sinorial Certificate Authority) 中铁数字证书认证机构,12306用的证书就是有此CA签发的

CRL: (Certificate Revocation List) 证书吊销列表

CDP: (CRL Distribution Point) 证书吊销列表分发点,是含在数字证书中的一个可以供各种应用下载的最新CRL的位置信息

/blog/img/https_01.png

OCSP: (Online Certificate Status Protocol) 证书状态在线查询协议, 是 IETF 颁布的用于实时查询数字证书在某一时间是否有效的标准。一般 CA 都只是 每隔一定时间 ( 几天或几个月 ) 才发布新的吊销列表,可以看出: CRL 是 不能及时反映证书的实际状态的。而 OCSP 就能满足实时在线查询证书状态的要求。它为电子商务网站提供了一种实时检验数字证书有效性的途径,比下载 和处理 CRL 的传统方式更快、更方便和更具独立性。请求者发送查询请求, OCSP 服务器会返回证书可能的三个状态:正常、吊销和未知。


使用openssl生成证书

1.生成RSA秘钥

$ openssl genrsa -des3 -out yangxg.key 2048

Generating RSA private key, 2048 bit long modulus
...................................+++
.................................................................+++
e is 65537 (0x10001)
Enter pass phrase for yangxg.key:
Verifying - Enter pass phrase for yangxg.key:

2.生成证书请求文件(CSR : Cerificate Signing Request)

$ openssl req -new -key yangxg.key -out yangxg.csr

Enter pass phrase for yangxg.key:
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) [AU]:cn
State or Province Name (full name) [Some-State]:gd
Locality Name (eg, city) []:gz
Organization Name (eg, company) [Internet Widgits Pty Ltd]:yangxg
Organizational Unit Name (eg, section) []:yangxg
Common Name (e.g. server FQDN or YOUR name) []:yangxg
Email Address []:yangxuguangvip@163.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

$ ls
yangxg.csr  yangxg.key

3.前往 CA 申请颁发证书,以下是知乎查到的一些结果:SSL 证书服务,大家用哪家的?

如果是个人用户,可以选择便宜甚至免费的DV证书。

1、Let's Encrypt:免费,快捷,支持多域名(不是通配符),三条命令即时签署+导出证书。缺点是暂时只有三个月有效期,到期需续签。

2、StartSSL免费DV证书:免费,有效期是一年,比Let's Encrypt长。

3、Comodo PositiveSSL:便宜,单年9美刀,如果签三年大概每年4至5美刀。可签署ECC SSL证书。

4、RapidSSL:单年签署价格同PositiveSSL,并没有什么优缺点。

5、沃通(Wosign)免费DV证书:免费,签发快,界面和官方资料都是中文。问题是上次CNNIC的二级CA冒签Gmail的证书引起争议,在国内有些人预防性拉黑所有国内CA的证书,包括沃通的。他们浏览你的站点时会被拦截和警告。

我这边在沃通里申请了2年的免费ssl证书

/blog/img/https_02.png

下载回来的压缩包里有对应不同代理服务器使用的证书

/blog/img/https_03.png


4.配置nginx

server
{
    listen 80;
    server_name www.yangxg.com;
    #80端口跳转到443端口
    rewrite ^(.*) https://$server_name$1 permanent;
}

server
{
    listen 443;
    root /data/www;
    index index.html index.htm index.php;

    server_name www.yangxg.com;

    ssl on;
    ssl_certificate /data/ssl/yangxg.crt;
    ssl_certificate_key /data/ssl/yangxg.key;

    location / {
        try_files $uri $uri/ =404;
        if (-f $request_filename/index.php) {
            rewrite (.*) $1/index.php;
        }
        #如果没有找到指定目录文件,那么重写路由加上index.php
        #如果找到,这表明它是一个资源,无需经过web php处理直接返回
        #如果把资源统一放到另外一台服务器管理, 那么web这边不应该存在任何资源文件给客户端访问到
        if (!-f $request_filename) {
            rewrite (.*) /index.php;
        }
    }

    #调用php web服务器
    location ~ .*\.(php|php5)?$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # With php5-fpm:
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    #图片缓存时间设置
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
        expires 10d;
    }

    #JS和CSS缓存时间设置
    location ~ .*\.(js|css)?$ {
        expires 5h;
    }
}

第3步我们还是可以自己给自己颁发证书,但浏览器访问时会给予警告,表示此证书来源不明。

openssl x509 -req -days 365 -in yangxg.csr -signkey yangxg.key -out yangxg.crt