标签: ssl

  • 加密算法简介(含国密)

    国际算法

    • DES 旧的对称加密算法,已废弃
    • AES 新的对称加密算法,用于取代DES
    • AES-GCM 加密的同时提供消息验证,密文和验证码(MAC)一起发送,也就是AEAD,其它不带GCM后缀的AES算法不支持AEAD,ipsec和tls1.2,1.3都支持gcm模式
    • Blowfish 对称加密,已废弃
    • chacha20 流式对称加密,使用256位密钥长,对应AES256,安全性与AES相当或略优于AES,纯软件件计算比AES快3倍,比硬件AES慢1倍。这个算法以后用的会越来越多,在没有AES指令集的设备上chacha20是首选算法。由RFC 8439定义。
    • chacha20-poly1305 chacha20的AEAD版
    • RC4 对称加密,特点是速度非常快,比硬件加速的AES还快,已废弃
    • RSA 非对称加密算法,可用于消息加密,消息签名,密钥交换(低于1024位不安全)
    • ECC 非对称加密算法,另外用于密钥交换时用ECDH,用于消息签名时用ECDSA,一般不直接用于加密,根据不同的密钥长度分为P-192, P-224, P-256, P-384 和 P-521。
    • curve25519 非对称加密算法,蒙哥马利曲线,另一种椭圆曲线,256位的密钥长度,比ECC速度更快,更安全
    • curve448 非对称加密算法,448位的密钥长度,curve25519的加强版,安全性更高,但速度没有curve25519快
    • DSA 非对称加密算法,只能用于消息签名,但是用于签名时相比RSA也没有啥优势,所以使用并不多
    • ECDSA DSA的ECC版,ECC一般不直接用于签名,目前基于ECC的数字签名算法就是ECDSA
    • EDDSA 基于爱德华兹曲线的签名算法,速度更快,更安全,用于取代ECDSA,因为NIST有往算法里掺沙子的前科。
    • ED25519 是EDDSA的curve25519实现,密钥长度是256位
    • ED448 是EDDSA的curve448实现,密钥长度448位
    • DH 非对称加密算法,只能用于密钥交换
    • ECDH DH的ECC版,ipsec中DH group 19,20,21使用的是ECDH,其它使用的是DH
    • X25519,X448 ED版的DH算法,分别对应curve25519,curve448,ipsec中对应dh31和dh32
    • DHE,ECDHE 使用临时公私钥的DH,ECDHE算法,提供PFS能力,TLS1.3上PFS是必选的,IPsec可选支持PFS
    • MD5 散列算法,128位,速度很快,已废弃
    • SHA-1 散列算法,160位,已废弃
    • SHA-2(SHA256-SHA512) 散列算法
    • SHA-3(SHA3-256-SHA3-512) 散列算法,长度与sha2一致但使用了不同的算法,是SHA2的备选。目前并没有消息说SHA3比SHA2更安全,只是没有与SHA2相同的弱点。
    • HMAC 加了密码的散列算法,即可以用于散列,也可以用于身份验证(密码不一样,散列结果不一样),HMAC可以与任意其它散列算法一起使用,这样散列算法也实现了AEAD

    国密算法:

    • SM1 相当于AES128,算法不公开,用于小数据量的加解密
    • SM2 基于ECC,相当于ECC256,ECDH,ECDSA,可用于加密,签名,密钥交换,USG6525E防火墙支持使用sm2进行身份认证
    • SM3 相当于SHA-256,但比sha-256g速度慢,支持MAC的版本为HMAC-SM3,USG6525E防火墙不支持IKEV2的完整性验证,但支持sm3用于IKEV1的完整性验证
    • SM4 与SM1一样都是对称加密,用于大数据量的加解密,也可以支持GCM模式(AEAD),USG6525E防火墙中可用于IPsec的数据加密,但不支持GCM模式,所以还需要另外配置完整性验证(使用GCM模式时esp authentication-algorithm不再生效)
    • SM7 与SM1一样,都是128位密钥和分组,主要用于非接触式IC卡,算法不公开
    • SSF33 对称加密,使用较少,算法不公开
    • SM9 非对称加密,使用用户标识(手机号,姓名,email地址)作为公钥,免去了证书创建,使用更方便,属于轻量级的非对称加密
    • ZUC 流式对称加密,可支持AEAD,已成为LTE标准

    注意:
    ECC256的安全性相当于RSA3072
    ECC256的破解难度相当于AES128,对称密码的破解难度要比非对称密码高
    SECP定义的曲线以r1作为后缀的与NIST定义的曲线是相同的,比如secp256r1等于nist p-256,secp38441等于nist p-384,这个定义secp曲线的seca组织是NIST的马甲吗?
    这里可以查看各个曲线的参数定义
    https://neuromancer.sk/std/secg/secp256r1
    secp256k1不是由nist定义的,比特币用的也是这个算法
    brainpool系列曲线是由rfc5639定义的,比nist的更安全,但是速度要慢得多,所以一般用ed25519的多
    爱德华兹曲线相关的ed25519,x25519,ed448,x448是由IETF定义的
    TLS1.3提供了对cure25519,cure448,AEAD的支持,USG6525E支持AEAD但不支持cure25519和cure448
    sha1,sha2,sha3,dsa,ecdsa,aes,ecc NIST P-xxx,des,hmac等算法都是由nist定义的
    关于ipsec中的dh组应该是由ietf自己定义的,可以参考RFC6071,国密算法中没有定义dh组
    各种椭圆曲线算法中只有国密的SM2是能直接加解密数据的,NIST,SECG,IETF定义的ECC和ED25519都不支持加解密数据,而只能用于签名和密钥交换
    2012年起中国国家密码局陆续发布国密算法,2013发生棱境门事件并爆出了Dual_EC_DRBG后门
    中国国家密码局2014年发布GM/T 0022-2014 IPSec VPN技术规范,2023年发布了GM/T 0022-2023 IPSec VPN技术规范
    中国国家密码局发布的商秘(SM)算法不能用于处理国家秘密,只能用于处理商业秘密
    AEAD把认证数据分为加密数据和非加密数据(关联数据),通过一个MAC保证加密部分和非加密部分均未篡改。通常IP数据包内容是需要加密的数据,IP数据包头是不需要加密的信息。

    Views: 12

  • squid配置SSL Bump缓存HTTPS流量

    默认情况下squid是不能解密https流量的,也就不能缓存https流量。但配置SSL Bump功能可以实现对HTTPS流量进行缓存。

    生成证书

    openssl生成CA和EV SSL证书


    参考这篇文章

    配置squid

    http_port 3128 ssl-bump tls-cert=/opt/web/data/squid/ssl/cert1/squid_ca.pem tls-key=/opt/web/data/squid/ssl/cert1/squid_ca.key dynamic_cert_mem_cache_size=128MB generate-host-certificates=on
    sslproxy_cert_error allow all # 即使原始服务器证书错误仍然进行连接
    ssl_bump stare all #所有域名开启解密,默认配置是不解密的
    

    也可以用ssl_bump bump all配置与stare的区别是bump生成的证书除了域名外没有其它扩展字段,比如国家,单位什么的,stare则复制了原始证书中的甩的字段。
    完了以后重启Squid发现系统自带的squid不支持ssl-bump,然后docker中的squid也不支持ssl-bump,然后只能自己编译了。

    squid编译

    • 源码下载

      http://www.squid-cache.org/Versions/v6/

    • 安装依懒包
      apt-get update && apt-get install -y build-essential libssl-dev openssl libxml2-dev libexpat1-dev libsasl2-dev libpam0g-dev libkrb5-dev pkg-config apache2-utils net-tools libecap3-dev libldap2-dev
    • 编译
    ./configure \
    --prefix /usr \
    --enable-arp-acl \
    --enable-linux-netfilter \
    --enable-linux-tproxy \
    --enable-async-io=100 \
    --enable-err-language="Simplify_Chinese" \
    --enable-poll \
    --enable-gnuregex \
    --build=x86_64-linux-gnu \
    --disable-maintainer-mode \
    --disable-dependency-tracking \
    --disable-silent-rules \
    --enable-build-info="Ubuntu linux" \
    --disable-translation \
    --with-filedescriptors=65536 \
    --with-large-files \
    --with-openssl \
    --enable-ssl \
    --enable-ssl-crtd \
    --enable-inline \
    --disable-arch-native \
    --enable-storeio=ufs,aufs,diskd,rock \
    --enable-removal-policies=lru,heap \
    --enable-delay-pools \
    --enable-cache-digests \
    --enable-follow-x-forwarded-for \
    --enable-auth-basic=DB,fake,getpwnam,LDAP,NCSA,PAM,POP3,RADIUS,SASL,SMB \
    --enable-auth-digest=file,LDAP \
    --enable-auth-negotiate=kerberos,wrapper \
    --enable-auth-ntlm=fake,SMB_LM \
    --enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,SQL_session,unix_group,wbinfo_group \
    --enable-security-cert-validators=fake \
    --enable-storeid-rewrite-helpers=file \
    --enable-url-rewrite-helpers=fake \
    --enable-eui \
    --enable-esi \
    --enable-icmp \
    --enable-zph-qos \
    --enable-ecap \
    --enable-underscore
    make -j4 && make insstall
    

    启动之前需要执行这条命令初始化证书数据库,squid自己执行的security_file_certgen会报错,初始化后squid就不需要再执行了。
    security_file_certgen -c -s /usr/var/cache/squid/ssl_db -M 128
    或者配置

    “`sslcrtd_program /usr/libexec/security_file_certgen -s /usr/var/cache/squid/ssl_db -M 128MB“`
    在/usr/var/cache/squid/ssl_db/certs/目录下可以看到所有生成的证书
    #添加/usr/libexec到环境变量
    “`export PATH=$PATH:/root/.local/bin:/usr/libexec“`

    参考:

    如何熟悉Squid的SSL碰撞?

    Views: 17

  • nexus开启https

    1. 生成证书
      我是用acme.sh申请免费证书,然后转换为java的keystore格式
      转换为pkcs12格式
      openssl pkcs12 -export -inkey example.key -in cert-chain.txt -out nexus.pkcs12
      生成keystore
      keytool -importkeystore -srckeystore nexus.pkcs12 -srcstoretype PKCS12 -destkeystore keystore.jks
    2. 把证书放在${jetty.etc}/ssl/keystore.jks
    3. 编辑nexus.properties
      data-dir/etc/nexus.properties中添加application-port-ssl=8443
      反注释nexus-args,确保它的值里面包含
      {jetty.etc}/jetty-https.xml
      添加ssl.etc={karaf.data}/etc/ssl(如果有这一行ssl目录会放在data目录下面,如果没有则放在{jetty.etc}里面)
    4. 编辑$install-dir/etc/jetty/jetty-https.xml
      有三处需要填写私钥密码
      指定私钥别名(这个不写也可以)
      jetty
    5. 在仓库管理里面把Base URL修改为域名
    6. 重启nexus

    注意:以上证书和配置文件需要权限正确
    参考:
    https://help.sonatype.com/repomanager3/nexus-repository-administration/capabilities/base-url-capability
    https://www.cnblogs.com/Smbands/p/14430775.html

    附件:
    nexus的docker-compose.yaml配置

    services:
      nexus:
        image: sonatype/nexus3
        restart: always
        hostname: nexus
        ports:
          - "8081:8081/tcp"
          - "8082:8082/tcp"
          - "8083:8083/tcp"
          - "8084:8084/tcp"
          - "8085:8085/tcp"
          - "80:8081/tcp"
          - "443:8443/tcp"
        volumes:
          - ./data:/nexus-data
          - ./deploy:/opt/sonatype/nexus/deploy
          - ./ssl:/opt/sonatype/nexus/etc/ssl
          - ./jetty-https.xml:/opt/sonatype/nexus/etc/jetty/jetty-https.xml
          - /etc/localtime:/etc/localtime
    
    

    Views: 174