前言
谷歌提議將證書有效期縮短到13個月,被其他CA和瀏覽器廠商無情拒絕,但縮短有效期是人心所向
於是,CAB Forum第193號投票確定最長SSL證書有效期由原來的3年(39個月)改爲2年(825天)
問題描述
這一個項目是物聯網相關的,有app和硬件設備兩種類型的client
因歷史原來,兩種client用的是一個域名,都使用了ssl證書
證書有效期可能很長,但最近到期了
因爲設備沒辦法強制升級,一是設備可能沒聯網,二是有些設備還沒銷售出去,三是設備沒有用ca對證書校驗
於是解決方案是,app強制升級,升級後使用新域名,新證書
但到了域名過期那天,才發現這麼一個問題:
之前宣傳部門印製了許多二維碼,用的是原來老域名
所以這些二維碼現在不可用了
當然,以後二維碼使用專門的短域名、app和設備域名不應該用同一個……
未來如何做是另一碼事,現在要想如何解決問題
要想達到的結果是:
在不影響設備使用的前提下,讓一指定uri可用
舉例說明:
1.如有一個域名www.abc.com,給硬件設備用,也給app用
2.最近域名證書過期了,要換證書,但硬件設備沒法保證用戶升級,於是讓app強制升級啓用新域名
3.但有一批二維碼,已經發出去了,請求地址爲: www.abc.com/a/b/c
現在想有沒有方法,讓:
1.www.abc.com/a/b/c 使用新證書,或不用證書,只要在瀏覽器中打開就行
2.www.abc.com其他地址使用老證書,保證設備的可用
問題解決方案
方案1:雙證書方案
原理:
Nginx支持ECC、RSA雙證書.
ECC籤個最新的,保障較新設備能夠正常訪問
RSA依舊保留過期的舊證書,給未更新的設備訪問
1.設備使用的一般是樂鑫ESP8266或慶科EMW3162的板子實現ssl
而這些板子下的ssl庫一般都不支持ECC
2. 除非很古老的瀏覽器,其他都支持ECC
所以使用Nginx判斷:
如果支持ECC則使用新的ECC證書
如果不支持ECC則使用老的RSA證書
說明:
Windows XP 中,使用 ECC 證書的網站時需要瀏覽器自行 TLS
Android 平臺中,也需要 Android 4+ 才支持 ECC 證書
如果此方案能生效,可以保證:
1.所有的請求都可以完美成功
2.甚至都不需要更換域名
方案2:使用openResty
原理:
1.所有的設備請求第1次失敗後會再次請求
2.證書錯誤時,請求快速失敗
所以在openResty中做一個k/v表
第一次請求給他返回新證書,並以ip爲key插入一條數據,5秒失效
第二次請求過來,一查k/v表,有數據,返回老證書
說明:
此方案會有一定誤殺的情況
結論
我們的設備中有一部分用帶有OS的系統,是支持ECC的
這些設備對我們來說是很重要的,所以最後我們採用了方案2
雙證書的一些簡單操作
生成證書:
openssl ecparam -genkey -name prime256v1 -out 證書名.key
openssl req -new -key 證書名.key -nodes -out 證書名.csr
例:
openssl ecparam -genkey -name prime256v1 -out www.zhaoweiguo.com.key
openssl req -new -sha256 -key www.zhaoweiguo.com.key -nodes -out www.zhaoweiguo.com.csr
Nginx配置雙證書rsa+ecc:
# 它的實現原理是:
# 分析在 TLS 握手中雙方協商得到的 Cipher Suite
# 若支持 ECDSA 就返回 ECC 證書,反之返回 RSA 證書
server{
listen 443 ssl;
server_name www.zhaoweiguo.com;
root /var/www/zhaoweiguo.com/www.zhaoweiguo.com;
index index.php index.html;
ssl_certificate /home/wei64/www.zhaoweiguo.com.crt;
ssl_certificate_key /home/wei64/nginx/ca/www.zhaoweiguo.com.key;
ssl_certificate /home/wei64/nginx/ca/www.zhaoweiguo.com.ecc.crt;
ssl_certificate_key /home/wei64/nginx/ca/www.zhaoweiguo.com.ecc.key;
ssl_prefer_server_ciphers on;
## Cipher Suites 一定要配置好,不然雙證書並不會生效
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES";
}