标签: SSL

  • asme.sh with DNS Alias Mode

    由于 Godaddy 停止了免费的支持ACME SSL 证书签发(DNS 模式),

    不得不改用 DNS Alias 模式, 让阿里云 为Godaddy 管理的域名,代理合作签发SSL证书

    默认的机构,ZEROSSL,一个初创企业,早已超负荷运转,多数时间已经无法正常签发了。改用Google的证书机构,相对门槛较高,需要有Google帐户,而且国内访问受限,所以签发都一直顺畅。

    #!/bin/bash
    #
    #  Godaddy Domain:
    DOMAIN=zhenglei.net
    DNSAPI=dns_gd
    #  Aliyun Domain as Proxy:
    DOMAIN_PROXY=778065.xyz
    DNSAPI_PROXY=dns_ali
    #  Setup CNAME record mapping of _acme-challenge  between ${DOMAIN} and ${DOMAIN_PROXY}
    # _acme-challenge.zhenglei.net       CNAME==>   _acme-challenge.778065.xyz
    # _acme-challenge.blog.zhenglei.net  CNAME==>   _acme-challenge.778065.xyz
    # ...
    # nslookup -type=CNAME _acme-challenge.zhenglei.net
    # nslookup -type=CNAME _acme-challenge.blog.zhenglei.net
    # Aliyun key & secret to generate acme cert
    # dnsapi=dns_ali
    Ali_Key="Your Aliyun Key"
    Ali_Secret="Your Aliyun Secret"
    export Ali_Key=${Ali_Key}
    export Ali_Secret=${Ali_Secret}
    # Godaddy key & secret to generate acme cert
    # dnsapi=dns_gd
    GD_Key="Your Godaddy Key"
    GD_Secret="Your Godaddy Secret"
    #
    #  Using alias dns mode of acme.sh
    M=" --challenge-alias ${DOMAIN_PROXY} "
    N=" --challenge-alias no "
    #
    #
    # IP PROTOCOL
    IP=--listen-v6
    #
    #
    #
    DNSSLEEP=40
    # Init
    source  /root/env.sh
    ACME_SH=/root/.acme.sh/acme.sh
    #
    #
    DSUB=""
    DSUB+=" -d ${DOMAIN} ${M}"
    DSUB+=" -d ${DOMAIN_PROXY} ${N}"
    DSUB+=" -d blog.${DOMAIN} ${M}"
    DSUB+=" -d blog.${DOMAIN_PROXY} ${N}"
    DSUB+=" -d blog1.${DOMAIN} ${M} "
    DSUB+=" -d blog2.${DOMAIN} ${M} "
    DSUB+=" -d gallery.${DOMAIN} ${M} "
    DSUB+=" -d gallery.${DOMAIN_PROXY} ${N} "
    DSUB+=" -d gallery1.${DOMAIN} ${M} "
    DSUB+=" -d gallery2.${DOMAIN} ${M} "
    DSUB+=" -d music.${DOMAIN} ${M} "
    DSUB+=" -d music.${DOMAIN_PROXY} ${N} "
    DSUB+=" -d music1.${DOMAIN} ${M} "
    DSUB+=" -d music2.${DOMAIN} ${M} "
    DSUB+=" -d mpd.${DOMAIN} ${M} "
    DSUB+=" -d mpd.${DOMAIN_PROXY} ${N} "
    DSUB+=" -d mympd.${DOMAIN} ${M} "
    DSUB+=" -d mympd.${DOMAIN_PROXY} ${N} "
    DSUB+=" -d stream.${DOMAIN} ${M} "
    DSUB+=" -d stream.${DOMAIN_PROXY} ${N} "
    DSUB+=" -d video.${DOMAIN} ${M} "
    DSUB+=" -d video.${DOMAIN_PROXY} ${N} "
    DSUB+=" -d *.${DOMAIN} ${M} "
    DSUB+=" -d *.${DOMAIN_PROXY} ${N} "
    P=""
    P+=" --dns ${DNSAPI_PROXY} "
    P+=" --dnssleep ${DNSSLEEP} "
    P+=" -k ec-384 "
    P+=" --force "#  Issue:
    echo "${ACME_SH} --issue  ${P} ${DSUB}"
          ${ACME_SH} --issue  ${P} ${DSUB}
    # Install
    INST_PATH=/opt/local/cert/acme_zhenglei.net
    INST_CER=${INST_PATH}/fullchain.cer
    INST_KEY=${INST_PATH}/zhenglei.net.key
    # P+=" --debug "
    # P+=" --log "
    #  Issue:
    echo "${ACME_SH} --issue  ${P} ${DSUB}"
          ${ACME_SH} --issue  ${P} ${DSUB}
    # Install
    INST_PATH=/opt/local/cert/acme_zhenglei.net
    INST_CER=${INST_PATH}/fullchain.cer
    INST_KEY=${INST_PATH}/zhenglei.net.key
    OPENRESTY=/opt/local/etc/init.d/openresty
    ${ACME_SH} --install-cert -d ${DOMAIN} \
               --key-file ${INST_KEY} \
               --fullchain-file ${INST_CER} \
               --reloadcmd "${OPENRESTY} stop ; ${OPENRESTY} start"

    https://github.com/acmesh-official/acme.sh/wiki/DNS-alias-mode

  • Encrypt WordPress Server with Let’s Encrypt SSL certificate

    # Install acme.sh tool
    git clone https://github.com/Neilpang/acme.sh.git
    
    cd acme.sh
    
    ./acme.sh --install
    
    #install cert
    cd ~/.acme.sh
    
    # issue a RSA cert
    sudo ./acme.sh --issue --d blog.zhenglei.net -w /var/www/html/wordpress
    
    # issue a ECC cert
    ./acme.sh --issue -d blog.zhenglei.net -w /var/www/html/wordpress --keylength ec-256
    
    # Copy the cert into target directory
    sudo mkdir -p /etc/nginx/ssl
    
    sudo ./acme.sh --installcert -d blog.zhenglei.net --key-file /etc/nginx/ssl/blog.zhenglei.net.ecc.key --fullchain-file /etc/nginx/ssl/blog.zhenglei.net.ecc.bundle --ecc
    sudo ./acme.sh --installcert -d blog.zhenglei.net --key-file /etc/nginx/ssl/blog.zhenglei.net.key --fullchain-file /etc/nginx/ssl/blog.zhenglei.net.bundle
    # Update nginx config
    server { #listen 80; listen 443; ssl on; ssl_certificate ssl/blog.zhenglei.net.bundle; ssl_certificate_key ssl/blog.zhenglei.net.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP; ssl_prefer_server_ciphers on; ... }
    server {
    listen 80 default_server; server_name blog.zhenglei.net;

    # Let's Encrypt, http method
    location ~ \.well-known
    {
    root /var/www/html/wordpress/;
    allow all;
    access_log on;
    log_not_found on;
    } return 301 https://$server_name$request_uri; }
  • network test tool: nogotofail /Google

    https://github.com/google/nogotofail

    Nogotofail是一个网络安全测试工具。设计用于帮助开发人员和安全人员,以一个灵活、可扩展、功能强大的方式来识别和修复弱TLS/ SSL连接和应用与设备中的敏感明文流量。它测试包括对于普通SSL证书验证问题,HTTPS和TLS/ SSL库的Bug,SSL和STARTTLS剥离的问题,明文的问题,等等。

    Nogotofail只依赖于Python的2.7和pyOpenSSL>=0.13。

     

  • SSL 3.0 POODLE

    SSL/TLS协议的演化 10–安全问题 – SSLv3的POODLE攻击
    发表回复

    image

    1.有趣的POODLE

    POODLE是Padding Oracle On Downgraded Legacy Encryption的缩写,不知是巧合还是有意,在英文中Poodle的意思是贵宾犬,于是老外在写POODLE攻击相关文字的时候,用这种漂亮的小狗做配图。给人的感觉是,这小狗是SSL的吉祥物。

    老外的一个习惯就是,无论做什么项目,都要事先起一个响亮的名字(伽利略计划之类)或者搞一个缩写(就像SSL)。POODLE既是缩写又是靓名,很容易就扬名天下了。这一招我们很快就学会了,例如百度凤巢的。

    POODLE攻击是Google的研究员14年9月发现的,算是新攻击了,文档是【POODLE】。攻击的研究者也是2011年BEAST攻击的发现者。POODLE仅仅针对SSLv3,但它本质上和BEAST攻击很类似:

    1.针对CBC模式块加密的缺陷。

    2.目的是恢复cookie中的敏感信息

    3.猜测的方式是一个byte一个byte的选择明文注入。

    4.降维打击:利用POODLE缺陷,猜测n个byte需要发送的探测次数是O(n),即每个n byte需要256*n次。如果没有这种缺陷,仅仅bruteforce方式猜测,需要2^(8*n)次。

    但操作更简单,而且没有像BEAST那样的workaround,只能升级协议。

    2.攻击原理

    POODLE仅仅针对SSLv3,而对TLS1.0无效,利用SSLv3加密块的Padding是随机值这一协议设计缺陷。

    RFC6101 SSLv3的5.2.3.2定义了CBC块加密下的SSLv3加密块定义:

    block-ciphered struct {
    opaque content[SSLCompressed.length];
    opaque MAC[CipherSpec.hash_size];————————————->1.对Padding部分没有完整性保护,这里MAC保护content,content length,sequence number。
    uint8 padding[GenericBlockCipher.padding_length];————–>2.padding是随机的。看起来更不容被猜测到,实际上画蛇添足了。随机加上没有完整性保护,意味着无论这部分数据是什么内容,接收方都不会在意。
    uint8 padding_length;
    } GenericBlockCipher;

    下面是一个可能的HTTP Post明文格式的例子,标为蓝色的path和body是上层应用或者说攻击者可以控制的数据:

    “POS T /path C o o ki e : name=value… \ r\ n\ r\ nbody ‖ 20­byte MAC ‖ padding”

    假定加密后得到如下加密快,C1,C2到Cn,(C0是IV我们看不到),对于第i个加密块,处理的流程如下:

    1.Pi = Dk(Ci) ⊕ Ci-1 –>其中k是密钥,Dk是解密函数,Pi是解密后的明文。

    2.检查并移除Pn尾部的padding(Pn也可以完全是padding)。

    3.检测并移除MAC,得到了明文。

    攻击者希望通过选择明文注入,达到如下两个效果:

    1.通过调整“path”的长度,使得cookie中尚未被猜测出来的字节位于上一个块的尾部(假设包括这个字节的加密块是Ci)。

    2.然后调整“body”的长度,使得最后一个块(Cn)都是padding(也就是整个Post长度是block的整数倍)。

    这显然是可以做到的。

    之后攻击者保存Ci,替换最后的Cn,发送到Server。假设padding是随机填充的,只要计算之后最后一个字节碰撞成功,则整个报文可以正确发送出去。假设每个block是16字节,最后一个字节是Ci[15]。则

    Dk(Ci)[15] ⊕ Cn­-1[15] = 15 /*15是padding length*/

    又根据前面的公式:

    Pi = Dk(Ci) ⊕ Ci-1

    15 ⊕ Cn­1[15] ⊕ Ci-­1[15] = Cn­1[15] ⊕ Ci-­1[15] ⊕ Dk(Ci)[15] ⊕ Cn­-1[15] = Ci-­1[15] ⊕ Dk(Ci)[15] = Pi[15]

    —->这样就解出来最后一个字节

    这里因为并不能保证每个数值尝试一次,只能说统计学上讲,256次尝试之后,会碰上一次。

    3.防范措施 – TLS SCVS

    定义了一个空的加密套件TLS_FALLBACK_SCSV {0x56, 0x00},如果Client这次用的版本号低于自己最高支持的版本好,必须携带这个信令。Client利用这个标记告诉Server,我因为上次连接失败,被你要求版本了。Server如果发现,自己没有降低Client的版本,则一定有中间人攻击,人为降低了前面Client发送的版本好,试图攻击。

    什么时候这个扩展不管用:

    1.有一方确实最高仅仅支持SSLv3。

    2.有一方不支持这个扩展。

    看到这种方法,我的第一反应是,如果中间人从两边的协商中全部剥离这个信令怎么办?后来想明白了,前几天被我认为狗血的Session Hash,这里起作用了。因为它检查所有发出去的握手报文的完整性,中间人无法欺骗了(待确认)。

    还有一个问题是为什么不用标准扩展方式而用了一个特殊的加密套件这种Tricky的手段,后来也想明白了,TLS对这种攻击免疫,因此必须要SSLv3支持这种扩展,而又不能修改已有的SSLv3实现,用特殊加密套件这种方式来实现最少代码升级的扩展。

    4.为什么TLS1.0可以免疫

    我们看看TLS1.0协议的那一部分的改动解决了这个问题

    RFC2246 TLS1.0里面相关数据结构没有变化,MAC依然无法保护padding,但是padding的内容有了规定:

    “Each uint8 in the padding data vector must be filled with the padding length value.”

    也就是,padding部分被填充成为padding length的值。假设padding有7byte,则连同padding length的8个bytes的内容是“7,7,7,7,7,7,7,7”,这样替换padding内容会被发现,攻击强度等同于暴力破解。

    【参考】

    1.POODLE, https://www.openssl.org/~bodo/ssl-poodle.pdf

    2.BEAST,火狐浏览器分割HTTPS报文的问题,http://www.unclekevin.org/?p=38

    3.TLS SCVS – TLS Fallback Signaling Cipher Suite Value (SCSV) for Preventing Protocol Downgrade Attacks,draft-ietf-tls-downgrade-scsv-05,https://datatracker.ietf.org/doc/draft-ietf-tls-downgrade-scsv/?include_text=1
    本条目发布于2015年3月6日。属于SSL/TLS、安全、网络协议分类。

    http://support.fortinet.com.cn/uploadfile/2015/0513/20150513020838240.pdf

    SSL 3.0 POODLE SSL 3.0 POODLE SSL 3.0 POODLESSL 3.0 POODLE SSL 3.0 POODLE SSL 3.0 POODLE 漏洞
    版本
    1.0
    时间
    2015年4月
    作者
    张彦龙 (ylzhang@fortinet.com)
    受影响的版本
    FortiOS (4.3.X, 5.0.X, 5.2.X)
    状态
    草稿
    1. 简介
    1.1 SSL 3.0 poodle漏洞介绍
    2014年10月15日,Google研究人员公布SSL 3.0协议存在一个非常严重的漏洞,该漏洞可被黑客用于截取浏览器与服务器之间进行传输的加密数据,如网银账号、邮箱账号、个人隐私等等。SSL 3.0的漏洞允许攻击者发起降级攻击,即欺骗浏览器说“服务器不支持更安全的安全传输层(TLS)协议”,然后强制其转向使用SSL 3.0,在强制浏览器采用SSL 3.0与服务器进行通讯之后,黑客就可以利用中间人攻击来解密HTTPs的cookies,Google将其称之为POODLE攻击,若受到POODLE 攻击,所有在网络上传输的数据将不再加密。目前已被TLS 1.0,TLS 1.1,TLS 1.2替代,因为兼容性原因,大多数的TLS实现依然兼容SSL3.0。
    1.2 SSL 3.0 poodle攻击原理
    为了通用性的考虑,目前多数浏览器版本都支持SSL3.0,TLS协议的握手阶段包含了版本协商步骤,一般来说,客户端和服务器端的最新的协议版本将会被使用。其在与服务器端的握手阶段进行版本协商的时,首先提供其所支持协议的最新版本,若该握手失败,则尝试以较旧的协议版本协商。能够实施中间人 攻击的攻击者通过使受影响版本浏览器与服务器端使用较新协议的协商的连接失败,可以成功实现降级攻击,从而使得客户端与服务器端使用不安全的SSL3.0 进行通信,此时,由于SSL 3.0使用的CBC块加密的实现存在漏洞,攻击者可以成功破解SSL连接的加密信息,比如获取用户cookie数据。这种攻击被称为POODL攻击 (Padding Oracle On Downgraded Legacy Encryption)。 此漏洞影响绝大多数SSL服务器和客户端,影响范围广泛。但攻击者如要利用成功,需要能够控制客户端和服务器之间的数据(执行中间人攻击)。通常用户的浏览器都使用新版本的安全协议与服务器进行连接,为了保持兼容性,当浏览器安全协议连接失败的时候, 就会转而尝试老版本的安全协议进行连接,其中就包括SSL 3.0。Poodle攻击的原理,就是黑客故意制造安全协议连接失败的情况,触发浏览器的降级使用 SSL 3.0,然后使用特殊的手段,从 SSL 3.0 覆盖的安全连接下提取到一定字节长度的隐私信息。
    1.3 SSL协议要点
    SSL协议由美国 NetScape公司开发的, 1996年发布了V3.0版本。SSL 3.0 已经存在 15 年之久,目前绝大多数浏览器都支持该版本。SSL3.0是已过时且不安全
    的协议,SSL(Secure Sockets Layer 安全套接层)是一种基于Web应用的安全通信协议。 SSL介于TCP协议和应用层协议之间,主要作用就是将HTTP、FTP等应用层的数据进行加密然后依托可靠的TCP协议在互联网上传输到目的地,其中最典型的应用就是https。
    1.4 SSL提供3个基本的安全服务:
    1)身份合法性:数据发送方和接收方要确认彼此身份,要确保各自的身份不会被冒充。
    2)数据机密性:所有传输的数据都进行加密,并且要确保即使数据被截获也无法破解。
    3)数据完整性:确保收到的数据与发送方发出的数据一致,没有被篡改。
    1.5 SSL协议主要采用的数据加密算法:
    1)非对称加密算法:数据加密和解密使用不同的密钥,如RSA公钥加密算法。优点是安全级别高,很难被破解;缺点是加密解密的速度慢,因此只适用于小量数据的加密。SSL协议采用非对称加密算法实现数字签名,验证数据发送方(或接收方)的身份,同时也用非对称加密算法交换密钥(用于数据加密的对称加密算法的密钥,以及用于数据完整性验证的MAC算法)。
    2)对称加密算法:数据加密和解密使用同一个密钥,如DES、3DES、RC4等都是对称加密算法。优点是加解密速度快,适用于大数据量的加密,但安全性较差。SSL协议采用对称加密算法对传输的数据进行加密。
    3)MAC算法:Message Authentication Codes,即消息认证码算法,MAC含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加入了密钥。SSL协议采用MAC算法来检验消息的完整性。

  • ssl termination

    http://vincent.bernat.im/en/blog/2011-ssl-benchmark.html

    Hitch (stud) :  one-process-per-core model

    stunnel:             threaded model

    nginx:               https://www.nginx.com/blog/nginx-ssl/

     

  • Where to get SSL certificate ?

    http://qiaodahai.com/cheapest-ssl-certificates.html

    最便宜的SSL证书

    SSL和TLS简介

    安全套接层(Secure Sockets Layer,SSL),一种安全协议,是网景公司(Netscape)在推出Web浏览器首版的同时提出的,目的是为网络通信提供安全及数据完整性。SSL在传输层对网络连接进行加密。

    SSL采用公开密钥技术,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。它在服务器和客户机两端可同时被支 持,目前已成为互联网上保密通讯的工业标准。现行Web浏览器亦普遍将HTTP和SSL相结合,从而实现安全通信。此协议的继任者是TLS。

    IETF(www.ietf.org)将SSL作了标准化,即RFC2246,并将其称为TLS(Transport Layer Security),其最新版本是RFC5246,版本1.2。从技术上讲,TLS1.0与SSL3.0的差异非常微小。

    TLS利用密钥算法在互联网上提供端点身份认证与通讯保密,其基础是公钥基础设施(public key infrastructure,PKI)。不过在实现的典型例子中,只有网络服务者被可靠身份验证,而其客户端则不一定。这是因为公钥基础设施普遍商业运 营,电子签名证书通常需要付费购买。协议的设计在某种程度上能够使主从式架构应用程序通讯本身预防窃听、干扰(Tampering)和消息伪造。

    SSL和TLS证书的主要用途

    一、确认网站真实性(网站身份认证):用户需要登录正确的网站进行在线购物或其它交易活动,但由于互联网的广泛性和开放性,使得互联网上存在着许多假冒、钓鱼网站,用户如何来判断网站的真实性,如何信任自己正在访问的网站,可信网站将帮你确认网站的身份。

    二、保证信息传输的机密性:用户在登录网站在线购物或进行各种交易时,需要多次向服务器端传送信息,而这些信息很多是用户的隐私和机密信息,直接涉及经济利益或私密,如何来确保这些信息的安全呢?可信网站将帮您建立一条安全的信息传输加密通道。

    SSL证书认证等级

    从证书认证的等级来分,ssl证书可以分为DV, OV和EV三种:

    1、DV是Domain Validation 的缩写,意思就是对网站域名所有权进行验证。CA认证机构会向域名持有者的邮箱发送相应的邮件,以确认证书和域名的所有权关系。其特点是简单快捷,价格便 宜,缺点是无法保证网站经营者的身份,因此一般仅用来提供数据加密的功能,属于Class 1验证的证书。

    2、OV是Organization Validation 的缩写,这种证书在颁发的时候会对网站所有单位的身份和域名的所有权进行证实行验证,所以一般电子商务类的网站往往会做OV的认证。价格当然也会比较昂 贵,证书颁发周期也会比较久,属于Class 2或者Class 3 验证的证书。

    3、EV是Extended Validation 的缩写,也是最严格的身份验证,此证书审核证书申请人对域名的所有权,以及详细的企业/组织相关信息审核,当用户在访问通过EV认证的网站时候,浏览器的 显示为绿色,当然价格也是相当的昂贵,属于Class 4 验证的证书。

    以上域名证书一般都支持一个或多个域名,还有一种SSL证书支持泛域名(Multiple Subdomains),就是通配符SSL证书(Wildcard SSL Certificates)。

    国外SSL证书提供商

    (1).StartSSL.comStartCom公司提供免费StartSSL(Class 1)证书,有效期1年,证书到期后可以免费续期,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。

    (2).WoSign.com沃通公司提供免费基础级 (Class 1) DV SSL 证书,有效期1年,证书到期后可以免费续期,免费SSL证书仅支持Windows平台。

    (3).CloudFlare.com提供免费的SSL 证书,支持大部分浏览器。

    (4).SSLs.com专 门代理各大公司的SSL证书,价格比较实惠,最便宜的Comodo PositiveSSL为4.99美元/年(购买五年优惠价24.95美元/5年),GeoTrust RapidSSL为7.99美元/年(购买四年优惠价31.96美元/4年),而且还可以使用10%优惠码 MissedYou

    (5).GoDaddy.com的Standard SSL促销价格为5.99美元/年(购买五年优惠价29.95美元/5年)。

    (6).RapidSSL.comRapidSSL 拥有自己的根证书,是名符其实的 SSL 数字证书发放单位(Certificate Authority)提供全球最具成本效益的单根 (Single Root)且稳定的 128 / 256 位数字证书,最便宜的RapidSSL为49美元/年。

    (7).PositiveSSL.comCOMODO 通过了基于WebTrust标准的严格审查,并且每一次均合格通过,是您值得信赖的SSL证书提供商。只有通过WebTrust国际安全审计认证,根证书 才能预装到主流的浏览器而成为一个全球可信的认证机构。最便宜的Comodo PositiveSSL为49美元/年。

    (8).AlphaSSL (Standard/Wildcard)全 球著名SSL证书颁发机构 GlobalSign 旗下的信息安全产品,是专业的SSL证书提供商,提供超低价格的SSL证书。AlphaSSL 在SSL证书行业拥有多年服务经验,并以低廉的价格和优质的服务向全球SSL证书用户提供服务,满足SSL低端用户市场的需求,同时它也是高可信、支持 256位加密的SSL证书。

     

     

    http://www.v2ex.com/t/96920