SSL Certification 驗證問題中 Google 提供的改善方法...

Google 在愚人節在 Google Online Security Blog 上發表的方法:「Improving SSL certificate security」,試著提供一些資源幫助解決 SSL certification 目前遇到的問題...

前陣子 Comodo 的下游被破台後 (還不只一家),有不少人又開始在探討現有 SSL certification 所用的 PKI 架構 (公開金鑰基礎建設),也就是 CA (數位證書認證中心) 的問題。

Google 給的方法是拿 SSL certification 的 SHA1 hex string,加上 .certs.googlednstest.com 組合成一個 domain 名稱,接著拿這個 domain 去查 TXT record,Google 會傳回三個數字讓你判斷這個 SSL certification 的可靠度。

這三個數字分別是:

  • Google 的網頁機器人第一次看到這個 SSL certification 的天數。
  • Google 的網頁機器人最近一次看到這個 SSL certification 的天數。
  • Google 的網頁機器人看過的次數。

雖然文章裡面沒提,不過以數字推算,這邊的「天數」應該是指 1970 年 1 月 1 日到現在的天數...

使用 DNS 查詢的好處在於 DNS 有 cache (Google 把 TTL 設為 86400),而資料的正確性可以靠正在推廣的 DNSSEC 建立。

接下來應該會有人實做 extension 測試了,過一陣子再回頭來看看發展。

在 Perl 裡用 LWP::UserAgent (以及繼承它的模組) 時使用 HTTPS 連線處理 CA 認證...

libwww-perl 裡的 LWP::UserAgent 可以處理 HTTPS,並利用 CA 驗證 public key 是否簽過。在 FreeBSD 下安裝 ca_root_nss 後可以在 /usr/local/share/certs/ 下看到檔案,於是可以這樣用:

#!/usr/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;

INIT {
    my $ua = LWP::UserAgent->new;
    $ua->ssl_opts(SSL_ca_file =>
        '/usr/local/share/certs/ca-root-nss.crt');

    my $res = $ua->get('https://mail.google.com/mail/');
    print $res->content;
}

Debian 或是 Ubuntu 下則是透過 ca-certificates 裝到 /etc/ssl/certs/ 下,並且分成很多檔案,這時候本來的 ssl_opts 就要改成 SSL_ca_path => '/etc/ssl/certs/';

PS:FreeBSD 上因為是單檔,依照 SSL_CTX_load_verify_locations(3) 這邊的說明,沒辦法用 CApath...

網路愈來愈不安全,能自救的方式並不多...

這兩件事情加起來會不會太巧合...

首先是有攻擊者成功利用 Comodo CA 產生 www.google.comlogin.yahoo.comlogin.skype.comaddons.mozilla.orglogin.live.com 的 SSL certificate:「Report of incident on 15-MAR-2011」,雖然被 revoke (撤銷),但是我們知道 revoke 機制極度脆弱:「Revocation doesn't work」。

過沒幾天,有人發現 AT&TFacebook 的流量會流經中國 ISP 的網路設備:「Facebook traffic mysteriously passes through Chinese ISP」。

關於這幾件事情,我們能做的並不多,只能僅可能的做:

接下來就是祈禱了...