海运的博客

使用acme.sh申请Let’s Encrypt ecc免费证书

发布时间:December 2, 2019 // 分类: // No Comments

之前有记录使用certbot安装Let’s Encrypt证书,但是certbot不支持管理更新ecc证书,功能也没acme强大。
安装acme.sh,成功后会添加crontab定时自动续期。

curl  https://get.acme.sh | sh
source ~/.bashrc 

设置邮件地址,用以续期通知,也可以使用高级安装acme时指定邮箱和证书目录。

acme.sh --update-account --accountemail a@haiyun.me

高级安装:

cd /usr/local/src/
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
./acme.sh --install --home /usr/local/acme --config-home ~/etc/acme \
--accountemail "admin@haiyun.me"

使用dns验证域名,设置dnspod api,运行acme后会自动保存到配置:

export DP_Id="api id"
export DP_Key="api key"

申请ecc证书,renew-hook当证书申请成功后执行的命令,此参数会保存到域名配置文件/etc/acme/haiyun.me/haiyun.me.conf,后续renew更新证书后调用。

acme.sh --issue --dns dns_dp -d haiyun.me -d www.haiyun.me -k ec-256 --renew-hook "systemctl restart nginx"
#使用http server验证
acme.sh --issue --webroot /var/www/ -d haiyun.me -d www.haiyun.me -k ec-256 --renew-hook "systemctl restart nginx"

acme申请泛域名:

acme.sh --issue --dns dns_dp -d haiyun.me -d *.haiyun.me -k ec-256

使用其它dns api:

ls /usr/local/acme/dnsapi/*gandi*
grep KEY /usr/local/acme/dnsapi/*gandi*

在issue时没指定renew-hook可复制申请的证书到指定目录,acme会记录安装的位置,后续更新证书后会自动复制:

acme.sh --installcert -d haiyun.me --ecc --key-file /etc/nginx/ssl/haiyun.me.key \
--cert-file /etc/nginx/ssl/haiyun.me.cert --fullchain-file /etc/nginx/ssl/haiyun.me.fullchain.cer \
--reloadcmd  "systemctl restart nginx"

吊销证书:

acme.sh --revoke -d haiyun.me --ecc

更新证书:

acme.sh --renew -d haiyun.me --ecc

查看证书列表

acme.sh --list

查看指定证书详细信息:

acme.sh --info -d haiyun.me

crontab定时更新:

00 1 * * * /usr/local/acme/acme.sh --cron --home "/usr/local/acme" --config-home "/etc/acme"

golang/openssl加解密速度测试

发布时间:December 2, 2019 // 分类: // No Comments

tls协议当使用ECDHE交换密钥时会使用rsa或ecdsa验证签名,测试rsa2048和ecc256签名验证签名速度:

openssl speed rsa2048 ecdsap256

tls协议传输内容使用aes或chacha20加密,测试chacha20-poly1305和aes-128-gcm加解密速度:

#单核
openssl speed -evp chacha20-poly1305
openssl speed -evp aes-128-gcm
#多核
openssl speed -multi $(cat /proc/cpuinfo |grep processor | wc -l) -evp aes-128-gcm

禁用硬件加速测试aes-128-gcm加解密速度:

OPENSSL_ia32cap="~0x200000200000000" openssl speed -evp aes-128-gcm

golang:

go test -bench=. crypto/cipher
go test -bench=. crypto/aes
go test -bench=. crypto/tls

golang配置tls CipherSuites顺序

发布时间:December 2, 2019 // 分类: // No Comments

tls1.2版本可在tls config中配置:

        tlsconf := &tls.Config{
                InsecureSkipVerify:       true,
                MaxVersion:               tls.VersionTLS13,
                MinVersion:               tls.VersionTLS12,
                PreferServerCipherSuites: true,
        }
        tlsconf.CipherSuites = []uint16{
                tls.TLS_AES_128_GCM_SHA256,
                tls.TLS_CHACHA20_POLY1305_SHA256,
                tls.TLS_AES_256_GCM_SHA384,
                tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
                tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
                tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
                tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
                tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
                tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
                tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
                tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
                tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
                tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
                tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
                tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
        }

tls1.3看官方文档不支持配置CipherSuites,在tls/common.go中initDefaultCipherSuites()会根据cpu是否支持aes硬解设置TLS_AES_128_GCM_SHA256或TLS_CHACHA20_POLY1305_SHA256优先

https://golang.org/src/crypto/tls/common.go
https://golang.org/pkg/crypto/tls/#Config

nginx tcp转发负载均衡及https sni proxy

发布时间:December 1, 2019 // 分类: // No Comments

stream {
  log_format tcp '$remote_addr [$time_local] '
    '$protocol $status $bytes_sent $bytes_received '
    '$session_time "$upstream_addr" '
    '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

  log_format stream_routing '$remote_addr [$time_local] '
    'with SNI name "$ssl_preread_server_name" '
    'proxying to "$upstream_addr" '
    '$protocol $status $bytes_sent $bytes_received '
    '$session_time';

  map $ssl_preread_server_name $name {
    ~^www.haiyun.me haiyun;
    ~^haiyun.me haiyun;
    default nginx;
  }
  upstream haiyun {
    #hash $remote_addr consistent;
    server 1.1.1.1:1111 weight=5 max_fails=1 fail_timeout=10s;
    server 1.1.1.1:1112 weight=5 max_fails=1 fail_timeout=10s;
    server 1.1.1.1:1113 weight=5 max_fails=1 fail_timeout=10s;
  }
  upstream nginx {
    server 127.0.0.1:4443;
  }
  server {
    listen 443 ;
    listen [::]:443 ;
    ssl_preread on;
    proxy_protocol on;
    proxy_pass $name;
    proxy_connect_timeout 10s;
    proxy_timeout 10s;
    access_log /run/log/nginx/access.log tcp;
    error_log /run/log/nginx/error.log;
  }
}

后端获取来源真实IP:

server
{
  listen       1443 default proxy_protocol ssl ;
  server_name www.haiyun.me haiyun.me;

  set_real_ip_from 127.0.0.1;
  real_ip_header proxy_protocol;
}

遇到的一些问题:
1.修改stream内配置后nginx -s reload无效,需重启nginx
2.当开启proxy_protocol后每个后端都要支持proxy_protocol,不然无法正常连接,这点不如haproxy,可以指定后端开启
https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/
https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/

分类
最新文章
最近回复
  • opnfense: 谢谢博主!!!解决问题了!!!我之前一直以为内置的odhcp6就是唯一管理ipv6的方式
  • liyk: 这个方法获取的IPv6大概20分钟之后就会失效,默认路由先消失,然后Global IPV6再消失
  • 海运: 不好意思,没有。
  • zongboa: 您好,請問一下有immortalwrt設定guest Wi-Fi的GUI教學嗎?感謝您。
  • 海运: 恩山有很多。
  • swsend: 大佬可以分享一下固件吗,谢谢。
  • Jimmy: 方法一 nghtp3步骤需要改成如下才能编译成功: git clone https://git...
  • 海运: 地址格式和udpxy一样,udpxy和msd_lite能用这个就能用。
  • 1: 怎么用 编译后的程序在家里路由器内任意一台设备上运行就可以吗?比如笔记本电脑 m参数是笔记本的...
  • 孤狼: ups_status_set: seems that UPS [BK650M2-CH] is ...
归档