• 了解 Azure 的限額以及如何增加配額

    原文發佈於 Understanding Azure Limits and Increases

    最近 Azure 團隊發佈了一篇新文章「Azure Subscription and Service Limits, Quotas, and Constraints」。如果您目前有使用 Azure,或許你已經遇到一些預設的限制。例如,每個訂閱預設最多僅能使用 20 個核心。在 Azure 管理界面中,查詢核心的使用量,可能會如下圖所示:

    但是,這是能夠透過客戶支援服務來增加最多能使用的核心數(在下一段,您可以看到我們如何從管理界面中發出需求的實際操作)。如果您在設計一個需要 75 個核心的應用程式,您可能會好奇 Azure 是否支援。但您可以在限制額度這一頁中有提到 Azure 最大可以支援到10,000 個核心!

    核心的限制額度只是 Azure 眾多運算資源的一個例子而已,不同的應用程式在 Azure 上需要的儲存空間和服務吞吐量也會有所不同。或者,大規模的 IaaS 解決方案,可能需要限制可以在單一虛擬網路的虛擬機器的數量。在 Azure Subscription and Service Limits, Quotas, and Constraints 這篇文章中,有詳細說明各種限制的預設值與最大值。您應該要參照這些限制來規劃程式,尤其是大規模的應用程式。

    如何申請增加配額

    Azure 支援常見問題集頁面有線上以及電話的聯絡方式。這篇文章中,您可以看到直接從 Azure 管理界面來提高限額也是很容易的!下面的截圖是由 George Moore, Principal Group Program Manager 所整理出來的步驟。

    1. 進到管理入口網站中,點擊右上方您的用戶名稱,然後點選連絡 Microsoft 支援服務:
    2. 支援類型中選擇帳務,按下建立票證
    3. 問題類型中選擇配額增加或核心數量增加要求
    4. 類別中選擇您想要增加配額的類型:
    5. 填寫您需要配額增加的詳細資訊,還有其他資訊,例如 deadline 或對公司業務的影響(這有助於讓您優先申請)。
    6. 按下提交,送出申請。

    Azure的限額:請告訴我們您需要什麼

    請密切注意訂閱限額的公告,我們不會同時發布所有 Azure 服務的限制。在不久的將來,我們將增加對其它服務和連接到其它服務的特定資源來做限制。

    我們希望聽到您的意見!

    如果有其他您想要瞭解的限制、配額,或是 Azure 服務,請在 limits article 底下回應。

    我們希望這個參考頁是一個寶貴的資源,我們將努力擴充它,並保持它的準確性。

  • 微軟持續拓展雲端服務的全球佈局

    原文發表於 Microsoft Continues Global Expansion of Cloud Services

    在今年稍早的 //BUILD/ 2014 以及北美 TechEd 2014 大會上,我們宣佈了今年會持續拓展我們的雲端服務,帶領我們的客戶前往「雲端優先」的世界,所以我們提供了一些 Microsoft Azure 的更新、線上服務,以及增加資料中心,我們期望能夠幫助我們的客戶,不論是建立新的應用程式,還是基於現有機房架構的投資,都能利用這個世界級雲端平台的威力。而我們最近的更新有下面幾點:

    啟用 Microsoft Azure 巴西南區的資料中心

    在前些日子,我們已經在 Microsoft Azure 上公開預覽了巴西南部的資料中心,而現在,巴西南部的資料中心已經正式營運,這使得 Microsoft Azure 的用戶可以運用這個資料中心,提供給南美洲用戶有更快的網路傳輸效能,當然,巴西南部的這座資料中心與微軟在全球其它地方的資料中心有一樣的服務品質。

    總計今年到目前為止,Microsoft Azure 陸續正式營運了在日本、中國到巴西的資料中心,顯示了 Microsoft Azure 全球佈局的承諾,持續為全球的用戶提供世界級、符合企業標準的雲端平台服務。關於巴西資料中心的正式營運公告,可以參考微軟官方部落格的這篇文章

    服務更新

    除了新的資料中心正式營運之外,我們最近也在 Microsoft Azure 的 IaaS 及 PaaS 上有一些更新:

    1. 虛擬網路及虛擬機器的更新:現在開始,虛擬網路(Virtual Network)已經能夠延伸至整個區域,提供更高的彈性及更廣的使用情境。而虛擬機器(Virtual Machines)的部份,A8 及 A9 虛擬機器提供了更快的 CPU 處理器、更快的頻寬、以及更多的核心數供用戶使用。這兩項更新讓用戶可以在 Microsoft Azure 上更容易實現運算、或網路繁重的計算工作,像是工業設計、模擬、基因研究、影音編碼等等。
    2. 為 Xamarin 提供行動服務的離線操作功能:Microsoft Azure 行動服務(Mobile Services)提供了跨平台行動裝置 app 開發的雲端平台,並且也加入了可以在 app 離線時操作的功能。這項功能也加入了 Xamarin.iOSXamarin.Android 的支援。

    Gartner Magic Quadrant 報告中的雲端服務

    上週 Gartner 出了一份針對雲端平台業者做的 Magic Quadrant 報告,這份報告將 Microsoft Azure 定位在 Cloud IaaS 中的 Leader Quadrant (領導者象限),Gartner 將 cloud compute IaaS 定義為提供虛擬資料中心、儲存體、以及網路資源服務,所以這項肯定也一併地肯定了我們所提供的應用程式平台即服務 (aPaaS) 是一個領導者服務。Microsoft Azure 是唯一一家雲端平台業者,同時在 IaaS 及 PaaS 服務上得到 Gartner 的領導者肯定,這也鞭策我們要持續加強雲端平台服務,讓我們的客戶能更容易地在 Azure 上建立系統或平台服務。

    最後,我們建議您可以參考世界上其它的企業是如何成功地運用 Microsoft Azure 來建立他們的服務。來自澳洲的 Kordia 目前正在 Azure 上使用他們用 SAP 建立的核心業務;而韓國的 SK Telecom 也正在運用 Azure 建立新的商業機會。

    如果您已經在使用 Azure 的服務,我們感謝您的支持,並希望您能持續提供給我們寶貴的建議;若您還沒開始使用 Azure,我們建議您可以立即開始瞭解 Azure 如何幫助您及您的事業迅速地走入雲端世界。

  • 15 分鐘將 ASP.NET MVC Movie 範例程式導入 Azure Redis Cache

    原始文章發佈於 MVC movie app with Azure Redis Cache in 15 minutes

    最近公開預覽的 Azure Redis Cache 很容易就能整合進您的 Azure 網站應用程式中,這裡我將 MVC Movie 範例程式整合 Azure Redis Cache 然後部署到 Azure 網站服務(Websites)上,大約只花了 15 分鐘左右。

    在導入快取(cache)之後,程式的速度比起純用資料庫來說快了將近 100 倍,因為經常被存取的資料就可以直接從快取中取得,而不必再到資料庫中撈資料,如此一來你也可以降低資料庫的存取次數,讓資料查詢的動作變得更迅速。

    整合完畢的範例程式碼可以在這裡下載

    接下來我會說明我是如何把 Azure Redis Cache 整合進我的 ASP.NET MVC Movie 範例之中。

    1. 在預覽中新的 Azure 管理界面,我們可以如圖所示建立一個新的 Redis Cache 服務。

      建立 Cache 服務大概會花個 15 分鐘左右,不過同一時間我不會在這裡等著,而是去修改我的程式。如果你需要完整的參考手冊,可以參考 How to Use Azure Redis Cache 這篇文章,不過要記得的是,Redis Cache 服務必須要跟你的網站服務是在同樣的資料中心,不同的資料中心可能速度會相差到 25 倍左右,建立的步驟可以參考 Create a Redis Cache 這一頁,你可以下載原始的 MvcMovie 範例程來改,或是直接下載我修改後的範例,但是要記得修改 cache 服務的 URL 及認證資料才會正常運作。
    2. 當 Cache 服務建立完成後,記下 Cache 名稱像是 <yourName>.redis.cache.windows.net 以及密碼(點擊 keys 按鈕就可以取得名稱及密碼)。
    3. 在你的 MVC 專案中,使用 NuGet 套件管理工具安裝 StackExchange.Redis 這個套件,如果您下載的是修改後的範例,那專案中已經安裝並參考了這個套件。
    4. 打開套件管理主控台(package manager console)中輸入 Update-Database 的指令。
    5. 在相關的 controller 中加入連結快取服務的程式碼:
      public class MoviesController : Controller
         {
            private MovieDBContext db = newMovieDBContext();
            private static ConnectionMultiplexer connection;
            private static ConnectionMultiplexer Connection
            {
               get
               {
                  if (connection == null || !connection.IsConnected)
                  {
                     connection = ConnectionMultiplexer.Connect(
                     ".redis.cache.windows.net,ssl=true," +
                     "password=");
                  }
                  return connection;
               }
            }

    注意:一般來說都不建議你把帳號密碼的資料直接寫在程式碼中,這裡只是為了方便瞭解程式碼才這麼做。請參考 Windows Azure Web Sites: How Application Strings and Connection Strings Work 這篇文章介紹的方法來處理帳號密碼這些敏感資料。

    在上述的程式碼中,我已經將連結快取服務的部份用靜態成員的方式儲存,所以你不必在每一次 request 都重新建立一個快取服務的連結,你只需要在使用時檢查連結是否還在,若已經失去連結再重新建立連結就好。

    新增一個類別,並包含這個 SampleStackExchangeRedisExtension 類別:

    public static class SampleStackExchangeRedisExtensions
    {
       public static T Get<T>(this IDatabase cache, string key)
       {
          return Deserialize<T>(cache.StringGet(key));
       }
    
       public static object Get(this IDatabase cache, string key)
       {
          return Deserialize<object>(cache.StringGet(key));
       }
    
       public static void Set(this IDatabase cache, string key, object value)
       {
          cache.StringSet(key, Serialize(value));
       }
    
       static byte[] Serialize(object o)
       {
          if (o == null)
          {
             return null;
          }
          BinaryFormatter binaryFormatter = new BinaryFormatter();
          using (MemoryStream memoryStream = new MemoryStream())
          {
             binaryFormatter.Serialize(memoryStream, o);
             byte[] objectDataAsStream = memoryStream.ToArray();
             return objectDataAsStream;
          }
       }
    
       static T Deserialize<T>(byte[] stream)
       {
          BinaryFormatter binaryFormatter = new BinaryFormatter();
          if (stream == null)
             return default(T);
    
          using (MemoryStream memoryStream = new MemoryStream(stream))
          {
             T result = (T)binaryFormatter.Deserialize(memoryStream);
             return result;
          }
       }
    }

    SampleStackExchangeRedisExtensions 類別可以讓你很輕易就將任何可序列化(serializable)的類別做快取。你可以在你的模型(model)上加上 [Serializable] 屬性。

    [Serializable]
    public class Movie

    然後將所有 Movie movie = db.Movies.Find(id); 的部份都修改成:

    //Movie movie = db.Movies.Find(id);
    Movie movie = getMovie((int)id);

    在 POST 呼叫的 EditDelete 方法中,記得要清除快取。

    ClearMovieCache(movie.ID);

    在 controller 中加入下面這段程式碼,其中 getMovie 是一個很標準的快取操作:

    Movie getMovie(int id)
    {
       Stopwatch sw = Stopwatch.StartNew();
       IDatabase cache = Connection.GetDatabase();
       Movie m = (Movie)cache.Get(id.ToString()); 
    
       if (m == null)
       {
          Movie movie = db.Movies.Find(id);
          cache.Set(id.ToString(), movie);
          StopWatchMiss(sw);
          return movie;
       }
       StopWatchHit(sw); 
    
       return m;
    } 
    
    private void ClearMovieCache(int p)
    {
       IDatabase cache = connection.GetDatabase();
       if (cache.KeyExists(p.ToString()))
          cache.KeyDelete(p.ToString());
    } 
    
    void StopWatchEnd(Stopwatch sw, string msg)
    {
       sw.Stop();
       double ms = sw.ElapsedTicks / (Stopwatch.Frequency / (1000.0));
       ViewBag.cacheMsg = msg + ms.ToString() +
           ” PID: ” + Process.GetCurrentProcess().Id.ToString();
    } 
    
    void StopWatchMiss(Stopwatch sw)
    {
       StopWatchEnd(sw, “Miss – MS:”);
    } 
    
    void StopWatchHit(Stopwatch sw)
    {
       StopWatchEnd(sw, “Hit – MS:”);
    }

    另外,在 Views\Shared\_Layout.cshtml 檔案中加入 ViewBag.cacheMsg 的程式碼,這是為了在頁面上顯示快取的資訊。

    <div class="container body-content">
      @RenderBody()
      <hr />
      <footer>
        <h2>@ViewBag.cacheMsg</h2>
      </footer>
    </div>
    
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
    </body>
    </html>

    現在你可以在開發環境中測試快取的效果了,不過如果你的資料庫很小,而快取服務又是在雲端,效果可能不會太明顯,部署到 Azure 上應該就可以感受到明顯的差異。

    在管理介面中監控快取服務

    在管理介面中,你可以看到快取服務的 hit/miss 的統計資料:

    你可以加上其它的相關資訊來監控,像是自訂時間範圍、被清除的鍵值、過期的鍵值、使用的 CPU 或記憶體等。

    當然,你也可以加入警告通知(Add Alert)來幫助你監控快取服務的使用狀況,像是下圖我就加入了一個警告通知,在 15 分鐘內,清除的鍵值過多時,可能要使用更大的快取。

    從 Visual Studio 將網站部署到 Azure 是十分容易的,只要在 Web 專案上按右鍵,選擇發行就可以了,再次提醒,網站服務跟快取服務一定要在同一個資料中心,否則網路傳輸的延遲會拖垮快取的效能。而在發行時別忘了勾選 Execute Code First Migrations

    部署完成後,你就可以試試看有沒有快取的效能是不是有明顯的差異。

    壓力測試快取服務

    預設的快取操作時間是 1000ms (1秒),你可以試著用下面這段程式碼,將 time out (強制清除快取)改成更長或更短的時間,測試你的快取服務是否正常。當 #define NotTestingTimeOut 這段程式碼被註解掉時,timeout 便會被設定為 150ms,讓快取在很短的時間被清掉。

    #else
          #region StressTest
          private static ConnectionMultiplexer Connection
          {
    
             get
             {
                if (connection != null && connection.IsConnected)
                {
                   return connection;
                }
                var config = new ConfigurationOptions();
                config.EndPoints.Add(Keys.URL);
                config.Password = Keys.passwd;
                config.Ssl = true;
                config.SyncTimeout = 150;
    
                connection = ConnectionMultiplexer.Connect(config);
                return connection;
             }
          }
          #endregion
    #endif

    在壓力測試時,最好將 session 快取關閉,簡單的作法是到 web.config 檔案中把整個應用程式的 session 快取關閉。

    <sessionState mode="Off" />

    或是在你的 controller 中使用 [SessionState(SessionStateBehavior.Disabled)] 來做。以下這個更新後的 getMovie 方法可以運作得更穩定,因為當 time out 例外發生時會重試 3 次。

          Movie getMovie(int id, int retryAttempts = 0)
          {
             IDatabase cache = Connection.GetDatabase();
             if (retryAttempts > 3)
             {
                string error = "getMovie timeout with " + retryAttempts.ToString()
                   + " retry attempts. Movie ID = " + id.ToString();
                Logger(error);
    
                ViewBag.cacheMsg = error + " Fetch from DB";
                // Cache unavailable, get data from DB
                return db.Movies.Find(id);
             }
             Stopwatch sw = Stopwatch.StartNew();
             Movie m;
    
             try
             {
                m = (Movie)cache.Get(id.ToString());
             }
    
             catch (TimeoutException tx)
             {
                Logger("getMovie fail, ID = " + id.ToString(), tx);
                return getMovie(id, ++retryAttempts);
             }
    
             if (m == null)
             {
                Movie movie = db.Movies.Find(id);
                cache.Set(id.ToString(), movie);
                StopWatchMiss(sw);
                return movie;
             }
             StopWatchHit(sw);
    
             return m;
          }

    這個範例程式中還有很多方法可以測試快取服務。

    像 WriteCache 或 ReadCache 方法會預設寫入或讀取 1,000 筆資料,你可以在 URL 後加上 "/n" 讓它們變成讀寫 n * 1000 筆的資料,像上圖的例子 http://<your site>.azurewebsites.net/Movies/ReadCache/3 就會讀取 3,000 筆快取的資料。

    在這個 150ms timeout 的環境下,我的程式就會很容易碰到 timeout 的狀況而去存取資料庫,這是因為我的程式有正確處理這個 timeout 的例外才能順利去讀取資料庫。所以建議您上線的應用程式也要能處理好這個例外,因為根據雲端平台的服務水準,如果您選擇的是基本方案,那一個月中可能會有幾分鐘無法存取(比如正在更新 VM),除非選擇了標準方案,並且建立好 master-slave 的架構備援,不過還是建議您在程式碼中預先處理這個可能發生的例外狀況。

    Azure Redis Cache (Preview) ASP.NET Session State Provider

    ASP.NET 預設的 In-memory Session State Provider 無法同時被多個網站��體使用,而 SQL Server session state 雖然可以同時讓不同的網站使用相同的 session state,但這會受限於資料庫查詢的延遲時間,進而影響效能。而 Redis session state cache provider 則是另一個選擇,如果你的網站只會用到不是很大的 session state,則可以利用 Redis Cache 來快取這些 session state data。

    您可以參考這篇文章,在你的網站應用程式中加入 RedisSessionStateProvider,然後修改 Web.config 檔案來設定 Redis Cache 服務:

     <system.web>
         <customErrors mode="Off" />
         <!--<sessionState mode="Off" />-->
        <authentication mode="None" />
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      <sessionState mode="Custom" customProvider="RedisSessionProvider">
                   <add name="RedisSessionProvider" 
                  type="Microsoft.Web.Redis.RedisSessionStateProvider" 
                  port="6380"
                  host="movie2.redis.cache.windows.net" 
                  accessKey="m7PNV60CrvKpLqMUxosC3dSe6kx9nQ6jP5del8TmADk=" 
                  ssl="true" />
          <!--<add name="MySessionStateStore" type="Microsoft.Web.Redis.RedisSessionStateProvider" host="127.0.0.1" accessKey="" ssl="false" />-->
          </providers>
        </sessionState>
      </system.web>
      <system.webServer>

    如此一來你就可以在你的網站應用程式中使用 Redis Cache 來處理 session state。在範例程式中也提供了測試的方法,你可以透過 http://<your site>.azurewebsites.net/SessionTest/WriteSession/Hello_joe 來存取,如此便會將 "Hello_joe" 寫入 session state,你可以試著增加網站服務實體,看看這個 session state 是否會在多個實體間共用。

    如果你對於 Redis Cache 有任何問題,可以在 twitter 上跟隨 @RickAndMSFT 並且向他發問。

    參考資料

  • Azure HDInsight 公開預覽 HBase 叢集做為 Azure Blobs 上的 NoSQL 資料庫

    原文發表於 Azure HDInsight previewing HBase clusters as a NoSQL database on Azure Blobs

    2014 年 6 月 3 日,Azure HDInsight 公開了一項更新消息,Azure HDInsight 將支援 Hadoop 2.4,並提升查詢資料的效能 100 倍。而今天,我們宣佈在 HDInsight 產品中,開始預覽 Apache HBase 叢集(cluster)。

    HBase 是一個低延遲的 NoSQL 資料庫,適合用來做大數據的線上交易處理(OLTP, online transactional processing)。我們在 Azure 中提供 HBase 叢集,而叢集的資料直接儲存於 Azure Blob 之中,如此一來便能在成本及效能的考量上,取得最大的存取效能以及擴充彈性。這個產品讓我們的客戶能擁有一個大型資料庫來建立高互動性的網站、或是儲存從百萬個感測器回傳的遙測資料等等,並且能在 Hadoop 中分析這些資料。

    如何建立 HBase 叢集

    由於目前 Azure HDInsight 上的 HBase 還在預覽階段,所以操作上需要利用 PowerShell。

    1. 安裝為 Azure 環境優化的 PowerShell
    2. 按照文章步驟設定環境
    3. 利用下列指令將認證資料存在變數中:
      PS C:\> $creds = Get-Credential
    4. 建立 HBase 叢集(可根據需求修改資料中心位置,以及修改 Blob 帳號的資料):
      PS C:\> New-AzureHDInsightCluster -Name yourclustername -ClusterType HBase -Version 3.0 -Location "West US" -DefaultStorageAccountName yourstorageaccount.blob.core.windows.net -DefaultStorageAccountKey "yourstorageaccountkey" -DefaultStorageContainerName hbasecontainername -Credential $creds -ClusterSizeInNodes 4

    在 HBase 叢集中操作資料

    應用程式開發人員可以透過 REST APIs 、HBase shell 或是不同的 map/reduce 工具如 Hive 及 Pig 來存取 HBase 的資料,HBase shell 提供了一個互動式的主控台(console)讓您可以管理 HBase 叢集、建立或刪除資料表(table)、以及操作資料。

    1. 要使用 HBase shell,首先您必須開啟建立的 HBase 叢集的遠端桌面連線(RDP)來連上它。
      在叢集建立完成時,你可以在 Azure 管理介面上設定(CONFIGURATION)的頁面中,在最下方按下 ENABLE REMOTE 的按鈕來開啟 RDP,最後可以利用 CONNECT 按鈕來進行連線。
    2. 連結進叢集後,按下桌面上 Hadoop command prompt的捷徑,然後輸入下列指令來開啟 HBase shell:
      cd %HBASE_HOME%\bin
      hbase shell
    3. 下面的指令則是建立一個範例資料表,並且加入一列資料、以及列出資料表的所有資料:
      create ‘sampletable’, ‘cf1′
      put ‘sampletable’, ‘row1′, ‘cf1:col1′, ‘value1′
      scan ‘sampletable’

    如果您想瞭解更多關於 Azure HDInsight 上的 HBase,下面是一些參考資料:

  • Azure 網站服務已經搭載下一代加密技術

    原文發表於 Next Generation Cryptography now available with Azure Web Sites

    沒有什麼事情,比使用 SSL 來提升您網站的安全性來得更重要了,然而,即使加密不是什麼新的技術,密碼學家仍然不斷地尋找能讓加密技術更安全的作法。而我們 Azure 網站服務團隊也一直不斷地支援最新最安全的加密運算,今天要跟各位介紹我們已經支援很棒、使用橢圓曲線加密法(ECC, Elliptic Curve Cryptography)的憑證。

    橢圓曲線加密技術,是基於在有限場(finite field)中橢圓曲線的代數結構,聽不懂了嗎?別擔心,很多人都聽不懂這玩意兒。要畫出橢圓曲線的圖,都是根據 y2 = x3 + ax + b 這個代數方程式,當你將 X 及 Y 對應的值畫出來時,你會發現它是一個對稱的橢圓曲線,舉例來說,若是畫出 y2=4x3-4x+4 這個代數方程式,就會像下面這張圖一樣:

    為了不讓這篇文章變成艱深的數學課,我們簡單地說,當一個代數方程式有這樣複雜且對稱性質,那就可以用來產生一個函數,有效地產生不容易攻破的公鑰(public key)及私鑰(private key)來做加解密。我們先產生一把私鑰,選定一個橢圓曲線來產生出對應的公鑰,要從公鑰反推回私鑰(也就是我們俗稱的攻擊、破解)是出了名地難,而且運用當今科技也無法在合理的時間內破解成功,這個方式相較於現在常見的一些公鑰私鑰加解密系統大概可以提升 10 倍以上的難度(確定你真的想瞭解為什麼,再讀這篇文章),換句話說,使用 256 位元的橢圓曲線加密法,它的安全指數相當於使用 2600 位元的 RSA 加密法,而現今業界常使用的標準不過是 2048 位元的 RSA 加密法,這已經是很難攻破的加密法了,由此可知,若使用相同位元的橢圓曲線加密法,要用現在的超級電腦破解它簡直是天方夜譚。

    說了這麼多,我們只是想讓您知道,現在您不只可以購買市面上常見的 SSL 憑證,還可以購買更安全、使用 ECC 的 SSL 憑證來確保您網站服務的安全性。ECC 憑證目前還是一項很新的技術,市場上還沒有很多家業者有提供,不過若您有需要,現在可以向 Symantec 或是 Entrust 來購買,不過相信很快很多憑證業者就會跟進了。

    你知道嗎?Azure 網站服務最近已經通過 ECC 憑證的測試了!所以您也可以在 Azure 網站服務上安裝 ECC 憑證,就跟過去安裝憑證一樣,上傳您購買的 .pfx 憑證檔案就可以立即運作了!不過要注意的是,不是所有的用戶端都支援 ECC 憑證,但如果您是使用 Windows Vista 之後的電腦,那就可以不必經過特殊設定,也能使用瀏覽器來瀏覽使用 ECC 憑證做 SSL 加密的網站!