再次更新https证书之startssl与let's Encrypt

2021年11月26日 阅读数:4
这篇文章主要向大家介绍再次更新https证书之startssl与let's Encrypt,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

一年一度的startssl证书更新时间到了。去年的帖子在这里html

今年原本应该正常更新startssl证书的,可是,遇到一个大坑,就是有些浏览器不支持startssl了,主要是firefox,chrome是能够的,iPad上的Safari也能够,iphone的Safari有问题,mac上的Safari也没问题。python

官方说法是:nginx

1. Mozilla and Google decided to distrust all StartCom root certificates as of 21st of October, this situation will have an impact in the upcoming release of Firefox and Chrome in January. Apple's decision announced on Nov 30th of distrusting all StartCom root certificates as of 1st of December will have an impact in their upcoming security update.
2. Any subscribers that paid the validation fee after Oct. 21st can get full refund by request.
3. StartCom will provide an interim solution soon and will replace all the issued certificates with issuance date on or after Oct 21st in case of requested. Meanwhile StartCom is updating all systems and will generate new root CAs as requested by Mozilla to regain the trust in these browsers.git

用谷歌翻译了一下就是:github

1.Mozilla和Google决定不信任全部StartCom根证书,截至10月21日,这种状况将对即将发布的Firefox和Chrome在1月的影响。苹果公司决定于11月30日宣布,再也不信任12月1日的全部StartCom根证书,这将对他们即将到来的安全更新产生影响。
2.任何在10月21日以后支付验证费的用户能够根据请求得到全额退款。
3.StartCom将尽快提供一个临时解决方案,并将在10月21日或以后的发布日期替换全部已颁发的证书。同时,StartCom正在更新全部系统,并将根据Mozilla的要求生成新的根CA,以从新得到对这些浏览器的信任。web

看时间点,应该是2016年发的通知。不过有一点,新证书的有效时间是3年。没办法,这个证书就是为了提供给内部的plist下载的, iOS要求用https协议,因此对于我这边来讲就无法用了。chrome

只能再次在网上找其余解决方案,很顺利找到了Let's Encrypt。网上有不少篇帖子,不一样的作法,我是参照这篇帖子作的,由于看到其余帖子说python2.7如下可能会有问题,直接把python升级到2.7,过程略过。浏览器

好像这个网址访问会失效,内容整理以下:tomcat

#下载acme-tiny的源码
sudo git clone https://github.com/diafygi/acme-tiny.git

#建立Let's Encrypt私钥
openssl genrsa 4096 > account.key

#建立CSR(Certificate Signing Request,证书签名请求) 文件,填本身要申请的域名
openssl genrsa 4096 > domain.key     
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr

#证实你拥有该域名
acme-tiny脚本会生成验证文件并写入到你指定的目录下,而后经过 ".well-known/acme-challenge/" 这个URL来访问到验证文件. 注意: Let's Encrypt 会对你的服务器作一次http请求来进行验证,所以你须要保证80端口可以访问.

server {
    listen 80;
    server_name yoursite.com www.yoursite.com;
    if ( $request_uri !~ "/.well-known/acme-challenge/*" ) { # 让 Let's Encrypt 成功访问到验证文件不受 301 影响
        return 301 https://yoursite.com$request_uri; # 注意进行301重定向到https,不然经过http仍能访问你的站点
    }
    location /.well-known/acme-challenge/ {
        alias /var/www/challenges/;
        try_files $uri =404;
    }

    #...你的其余配置
}

#获取签名证书
sudo chmod +x acme_tiny.py  
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt

#安装证书
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem  
cat signed.crt intermediate.pem > chained.pem

server {
    listen 443;
    server_name yoursite.com www.yoursite.com;

    ssl on;
    ssl_certificate /path/to/chained.pem;
    ssl_certificate_key /path/to/domain.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
    ssl_session_cache shared:SSL:50m;
    ssl_prefer_server_ciphers on;

    #...你的其余配置
}

须要注意的是,若是没有强制要求全部的连接都用https,就屏蔽这段,git上的说明也没有这段nginx配置。安全

    if ( $request_uri !~ "/.well-known/acme-challenge/*" ) { # 让 Let's Encrypt 成功访问到验证文件不受 301 影响
        return 301 https://yoursite.com$request_uri; # 注意进行301重定向到https,不然经过http仍能访问你的站点
    }

很顺利就配置完成经过测试了。这里是有nginx配合,tomcat里面就不用配置https。若是没有nginx呢?那就是直接支持.well-known/acme-challenge/* 这个请求,能够参考这篇帖子,里面用的是Spring MVC的框架,直接加一段代码就能够了。由于考虑到要加代码,仍是直接用nginx,挺简单的。

由于Let's Encrypt的证书有效时间只有90天,因此要设置自动更新,脚本帖子里已经有了,明天我再试试效果。→测试自动更新证书没问题,已经正常运行了。

后续漏洞检查的时候提示公共密钥过弱,解决办法就是:

openssl dhparam -out dhparams.pem 2048

而后在nginx的https里面加上ssl_dhparam /xxx/dhparams.pem  就能够了

完。