Http与Https认证

作者: DragonRat | 来源:发表于2018-06-04 19:15 被阅读2次

    作者:烨竹

    HTTP的认证方式

    BASIC 认证(基本认证)
    DIGEST 认证(摘要认证)
    SSL 客户端认证
    FormBase 认证(基于表单认证)

    1.基本认证(basic authentication)


    --> 普通 GET 请求
    <-- 401 响应码拒绝请求,携带响应头 WWW-Authenticate 描述保护区域 和 认证算法
    --> 请求携带 Authorization 头,指明认证算法和用户名密码
    <-- 200 相应

    2.摘要认证


    DIGEST认证同样使用质询/响应的方式(challenge / response),但不会像 BASIC 认证那样直接发送明文密码,但是和 HTTPS 的客户端认证相比仍旧很弱

    基本认证 和 摘要认证 都是一种无状态的认证方式,就是不需要服务器端保存必要的session,所以也没有session失效期。客户端每次都需要将密码和用户名发送给服务器来完成认证,,而且用户名和密码是保存在浏览器进程的内存中的,也就是只有当浏览器关闭的时候,用户名和密码也随之删除,才表示这次服务和认证结束,下一次请求需要重新输入用户名和密码。
    这两种方式都是浏览器产生输入用户名和密码的登录框。Basic认证采用了Base64编码,攻击者很容易获取http请求,然后解码请求就可以获取用户名和密码,没有安全性可言;
    而Digest认证采用一中NONCE随机字符串,用户的每次认证都需要哈希和MD5(用户名和密码),并加入这个盐值,客户端和服务器端每次的NONCE都是不一样的,这样就保证了认证的安全性和不可重放性。
    这里的NONCE并不是Session保存的一个字符串,这样就违背了无状态性特性

    3.SSL 客户端认证

    SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书(详见 HTTPS加密机制以及数字证书)认证,服务器可确认访问是否来自已登陆的客户端。
    SSL 客户端认证步骤:
    为达到 SSL 客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。

    1. 接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书。
    2. 用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。
    3. 服务器验证客户端证书,验证通过后方可领取证书内客户端的公开密钥,然后开始 HTTPS 加密通信。

    4.表单认证

    基于表单的认证方法并不是在 HTTP 协议中定义的,客户端会向服务器上 Web 应用发送登录信息,按登录信息的验证结果认证。

    Https

    1.RSA:对极大整数做因数分解的难度决定了RSA算法的可靠性

    非对称加密算法
    乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
    甲方获取乙方的公钥,然后用它对信息加密。
    乙方得到加密后的信息,用私钥解密。
    公钥可以解密私钥加密的数据私有也可以解密公钥加密的数据

    在线测试 公钥/私钥 的 加密/解密
    在线生成密钥对
    在线 RSA 公钥加密解密
    在线 RSA 私钥加密解密

    Read More
    阮一峰的网络日志 RSA算法原理(一)
    阮一峰的网络日志 RSA算法原理(二)

    2.SSL握手

    生成对话密钥一共需要三个随机数
    握手之后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥"(非对称加密),无其他作用
    服务器公钥放在服务器的数字证书之中

    Read More
    SSL/TLS协议运行机制的概述
    图解SSL/TLS协议

    3.证书申请

    术语

    CA : 电子商务认证授权机构(Certificate Authority)
    CSR : 证书签名请求(Certificate Signing Request) 是签发证书时的重要材料,它可以保证私钥安全的情况下通过远端CA签发证书。
    CRT : 证书文件(Certificate [sərˈtɪfɪkət] )

    制作 CSR 文件

    在申请数字证书之前,必须先生成证书私钥证书请求文件(CSR,Cerificate Signing Request),
    CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心。
    在生成CSR文件时会同时生成私钥文件,需妥善保管和备份

    生成CSR文件时,一般需要输入以下信息(中文需要UTF8编码):
    Organization Name(O):申请单位名称法定名称,可以是中文或英文
    Organization Unit(OU):申请单位的所在部门,可以是中文或英文
    Country Code(C):申请单位所属国家,只能是两个字母的国家码,如中国只能是:CN
    State or Province(S):申请单位所在省名或州名,可以是中文或英文
    Locality(L):申请单位所在城市名,可以是中文或英文
    Common Name(CN):申请SSL证书的具体网站域名

    使用 OpenSSL 制作

    # -new 指定生成一个新的CSR
    # -out certificate.csr 输出文件为 当前目录下 ca.kail.xyz.csr
    # - newkey rsa:2048 指定私钥类型和长度
    # - nodes指定私钥文件不被加密
    # -keyout 生成私钥输出文件为 当前目录下 ca.kail.xyz.key
    $ openssl req -new -out ca.kail.xyz.csr -newkey rsa:2048 -nodes -keyout ca.kail.xyz.key
    
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    Country Name (2 letter code) [XX]:CN
    State or Province Name (full name) []:shanghai
    Locality Name (eg, city) [Default City]:shanghai
    Organization Name (eg, company) [Default Company Ltd]:kail
    Organizational Unit Name (eg, section) []:kail-ca
    Common Name (eg, your name or your server's hostname) []:ca.kail.xyz
    Email Address []:
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:
    
    

    显示 csr 文件内容

    openssl req -in ca.kail.xyz.csr -text
    
    

    使用 Java keytool 工具制作

    使用 Keytool 工具生成 jks(Java Key Store) 文件
    jks 是一个密码保护的文件,存放私钥证书

    # -keyalg 指定密钥类型,必须是 RSA
    # -alias 指定证书别名,可自定义
    # -keysize 指定密钥长度为 2048
    # -keystore 指定证书文件保存路径
    
    keytool -genkey -alias ca.kail.xyz -keyalg RSA -keysize 2048 -keystore ./ca.kail.xyz.jks
    
    

    输入命令后会有下面的交互式操作:

    输入密钥库口令:
    再次输入新口令:
    您的名字与姓氏是什么?
      [Unknown]:  ca.kail.xyz
    您的组织单位名称是什么?
      [Unknown]:  dev
    您的组织名称是什么?
      [Unknown]:  kail
    您所在的城市或区域名称是什么?
      [Unknown]:  Shanghai
    您所在的省/市/自治区名称是什么?
      [Unknown]:  Shanghai
    该单位的双字母国家/地区代码是什么?
      [Unknown]:  CN
    CN=ca.kail.xyz, OU=dev, O=kail, L=Shanghai, ST=Shanghai, C=CN是否正确?
      [否]:  Y
    
    输入 <ca.kail.xyz> 的密钥口令
            (如果和密钥库口令相同, 按回车):
    
    

    通过 jks 文件生成证书请求

    # sigalg指定摘要算法,使用 SHA256withRSA。
    # alias指定别名,必须与 keystore 文件中的证书别名一致。
    # keystore指定证书文件。
    # file指定证书请求文件(CSR)。
    
    keytool -certreq -sigalg SHA256withRSA -alias ca.kail.xyz -keystore ./ca.kail.xyz.jks -file ./ca.kail.xyz.csr
    
    

    从 jks 文件 获取 私钥

    1. 将 JKS 格式证书转换成 PFX 格式
    keytool -importkeystore -srckeystore ./ca.kail.xyz.jks -destkeystore ./ca.kail.xyz.pfx -srcstoretype JKS -deststoretype PKCS12
    
    
    1. PFX 文件转成 pem 文件
    openssl pkcs12 -in ca.kail.xyz.pfx -nodes -out ca.kail.xyz.pem
    
    
    1. pem 文件 中提取出私钥
    openssl rsa -in ca.kail.xyz.pem -out ca.kail.xyz.key
    
    

    主流数字证书都有哪些格式? 介绍了各种格式之间的转换

    自制证书

    keytool

    上面 “从 jks 文件 获取 私钥”中的 第2步,生成的 ca.kail.xyz.pem 文件, 里面包含 私钥和证书信息,编辑删除多余的部分 保留 -----BEGIN CERTIFICATE----------END CERTIFICATE----- 中间的内容,后缀名改为 .csr 即可。
    Windows 下 双击打开,可查看证书内容。

    OpenSSL

    openssl x509 -req -days 365 -in ca.kail.xyz.csr -signkey ca.kail.xyz.key -out ca.kail.xyz.crt
    
    

    申请授信证书

    通过 SSL.md 免费获取
    参见 快速获取免费SSL证书
    X509 文件扩展名

    DER、PEM、CRT和CER这些扩展名经常令人困惑。很多人错误地认为这些扩展名可以互相代替。
    尽管的确有时候有些扩展名是可以互换的,但是最好你能确定证书是如何编码的,进而正确地标识它们。正确地标识证书有助于证书的管理。

    编码 (也用于扩展名)

    .DER 扩展名DER用于二进制DER编码的证书。比较合适的说法是 “我有一个DER编码的证书”,而不是“我有一个DER证书”。
    .PEM 扩展名PEM用于ASCII(Base64)编码的各种X.509 v3 证书。文件开始由一行"—– BEGIN …“开始。

    常用的扩展名

    .CRT 扩展名CRT用于证书证书可以是DER编码,也可以是PEM编码。扩展名CER和CRT几乎是同义词。这种情况在各种unix/linux系统中很常见。
    .CER CRT证书的微软型式。可以用微软的工具把CRT文件转换为CER文件(CRT和CER必须是相同编码的,DER或者PEM)。
    扩展名为CER的文件可以被IE识别并作为命令调用微软的cryptoAPI(具体点就是rudll32.exe cryptext.dll, CyrptExtOpenCER),进而弹出一个对话框来导入并/或查看证书内容。
    .KEY 扩展名KEY用于PCSK#8的公钥和私钥。这些公钥和私钥可以是DER编码或者PEM编码。

    CRT文件和CER文件只有在使用相同编码的时候才可以安全地相互替代。

    来自: http://blog.sina.com.cn/s/blog_a9303fd90101jmtx.html

    Read More
    如何制作CSR文件?
    阿里云证书服务
    快速获取免费SSL证书
    https://ssl.md
    Let's Encrypt,免费好用的 HTTPS 证书
    acme.sh 自动更新证书

    4.Nginx 配置 HTTPS

    证书文件获取:参见 [证书申请]

    判断 Nginx 有没有启动 SSL 模块

    nginx -V
    
    

    查看 configure arguments 中 如果有 with-http_ssl_module 则表明开启了 SSL 模块。

    安装时 启用 SSL 模块

    ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-openssl=/usr/local/openssl-1.1.0g 
    
    make && make install
    
    

    nginx.conf

    nginx/conf 文件夹下新建文件夹 cert , 放入 ca.kail.xyz.crt 证书文件 和 ca.kail.xyz.key 私钥

    server {
        listen       443 ssl;
        server_name  ca.kail.xyz;
        ssl_certificate      cert/ca.kail.xyz.crt;
        ssl_certificate_key  cert/ca.kail.xyz.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        location / {
            root   html;
            index  index.html index.htm;
            autoindex on; 
        }
    }
    
    

    强制 HTTPS

    server {
        listen 80;
        server_name ca.kail.xyz;
        rewrite ^(.*) https://$server_name$1 permanent;
    }
    
    

    Read More
    CentOS 7.4 实例配置 Nginx + HTTPS 服务
    nginx使用ssl模块配置HTTPS支持
    nginx配置ssl加密(单/双向认证、部分https)

    相关文章

      网友评论

        本文标题:Http与Https认证

        本文链接:https://www.haomeiwen.com/subject/peyysftx.html