Module 基礎模組

模組ssl

ssl 模組是fibjs 內建的加密模組,可用於建立網路連線的SSL 超文本傳輸協定。此模組提供加密驗證,客戶端和伺服器可以確保連接是安全的

ssl 模組中包含了多個物件和常數,可以用於一個完整的SSL 用戶端/伺服器通訊流程。常用的類別有:

  1. SslSocket:基於底層Socket封裝的Ssl 套接字對象,可以用來與遠端伺服器端進行雙向驗證等通訊操作。
  2. SslHandler:SSL 協定轉換處理器,用於將資料流轉換為SSL 流協議,適用於建置伺服器端的服務。
  3. SslServer:SSL 伺服器對象,方便搭建標準多纖程SSL 伺服器。

下面以ssl.Server為例,介紹ssl 模組的使用。

ssl.Server是一個基本的SSL 伺服器,它提供了一個基於SSL 的網路服務。使用ssl.Server類別可以快速建立一個基於SSL/TLS 的伺服器,同時相容於TCP/HTTP 服務的基本所有特性。它具有以下特點:

  • 自帶X.509 憑證管理器,支援多個網域憑證、通配符、SAN 憑證等功能。
  • 擁有與TCP 伺服器完全一致的介面和使用方式,上層程式碼無需關心SSL 連線和TCP 連線區別。
  • 使用內建的OpenSSL 函式庫實作了所有SSL/TLS 安全協定。
  • 支援SNI 和ALPN 等協定擴展功能。

下面是一個簡單的範例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
const ssl = require('ssl'); const http = require('http'); const crypto = require('crypto'); // read cert and key let key = crypto.loadPKey('mycert.key'); let cert = crypto.loadCert('mycert.pem'); // create ssl server const svr = new ssl.Server(cert, key, 8080, s => { var data; while (data = s.read()) { console.log(`received data: ${data.toString()}`); s.write(data.toString().toUpperCase()); } }); // start server svr.start();

在上面的程式碼中,我們首先讀取了SSL 憑證和私鑰文件,然後建立了一個SSL 伺服器實例。在伺服器的回呼函數中,接收到客戶端資料後,將資料轉換為大寫,並透過write 函數將資料傳回給客戶。

物件

Socket

創建一個SslSocket對象,參見SslSocket

1
SslSocket ssl.Socket;

Handler

創建一個SslHandler對象,參見SslHandler

1
SslHandler ssl.Handler;

Server

創建一個SslServer對象,參見SslServer

1
SslServer ssl.Server;

靜態函數

connect

創建一個SslSocket物件並建立連接

1 2
static Stream ssl.connect(String url, Integer timeout = 0) async;

呼叫參數:

  • url: String, 指定連線的協議,可以是:ssl://host:port
  • timeout: Integer, 指定超時時間,單位是毫秒,預設為0

回傳結果:


創建一個SslSocket物件並建立連接

1 2 3 4
static Stream ssl.connect(String url, X509Cert crt, PKey key, Integer timeout = 0) async;

呼叫參數:

  • url: String, 指定連線的協議,可以是:ssl://host:port
  • crt:X509Cert, 證書,用於發送給伺服器驗證客戶端
  • key:PKey, 私鑰,用於與客戶端會話
  • timeout: Integer, 指定超時時間,單位是毫秒,預設為0

回傳結果:


創建一個SslSocket物件並建立連接

1 2 3 4 5
static Stream ssl.connect(String url, Integer verification, X509Cert crt, PKey key, Integer timeout = 0) async;

呼叫參數:

  • url: String, 指定連線的協議,可以是:ssl://host:port
  • verification: Integer, 憑證驗證模式
  • crt:X509Cert, 證書,用於發送給伺服器驗證客戶端
  • key:PKey, 私鑰,用於與客戶端會話
  • timeout: Integer, 指定超時時間,單位是毫秒,預設為0

回傳結果:


setClientCert

設定缺省客戶端證書

1 2
static ssl.setClientCert(X509Cert crt, PKey key);

呼叫參數:

  • crt:X509Cert, 證書,用於發送給伺服器驗證客戶端
  • key:PKey, 私鑰,用於與客戶端會話

loadRootCerts

載入自備的缺省根證書,等同於ssl.ca.loadRootCerts

1
static ssl.loadRootCerts();

此憑證內容源自:http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt

靜態屬性

ca

X509Cert, 全域證書,用於ssl 用戶端模式驗證伺服器證書

1
static readonly X509Cert ssl.ca;

verification

Integer, 設定憑證驗證模式,預設為VERIFY_REQUIRED

1
static Integer ssl.verification;

常量

VERIFY_NONE

證書驗證模式,不驗證

1
const ssl.VERIFY_NONE = 0;

VERIFY_OPTIONAL

證書驗證模式,可選驗證,允許驗證不通過

1
const ssl.VERIFY_OPTIONAL = 1;

VERIFY_REQUIRED

證書驗證模式,要求驗證,驗證不通過則中斷

1
const ssl.VERIFY_REQUIRED = 2;

BADCERT_EXPIRED

證書驗證結果,證書逾時

1
const ssl.BADCERT_EXPIRED = 1;

BADCERT_REVOKED

證書驗證結果,證書撤銷

1
const ssl.BADCERT_REVOKED = 2;

BADCERT_CN_MISMATCH

證書驗證結果,證書名稱錯誤

1
const ssl.BADCERT_CN_MISMATCH = 4;

BADCERT_NOT_TRUSTED

證書驗證結果,證書不可信

1
const ssl.BADCERT_NOT_TRUSTED = 8;