網站證書過期導致的一系列問題

前言

谷歌提議將證書有效期縮短到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";
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章