模組ssl
ssl 模組是fibjs 內建的加密模組,可用於建立網路連線的SSL 超文本傳輸協定。此模組提供加密驗證,客戶端和伺服器可以確保連接是安全的
ssl 模組中包含了多個物件和常數,可以用於一個完整的SSL 用戶端/伺服器通訊流程。常用的類別有:
- SslSocket:基於底層Socket封裝的Ssl 套接字對象,可以用來與遠端伺服器端進行雙向驗證等通訊操作。
- SslHandler:SSL 協定轉換處理器,用於將資料流轉換為SSL 流協議,適用於建置伺服器端的服務。
- 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
19const 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
1SslSocket ssl.Socket;
Handler
創建一個SslHandler對象,參見SslHandler
1SslHandler ssl.Handler;
Server
1SslServer ssl.Server;
靜態函數
connect
創建一個SslSocket物件並建立連接
1
2static Stream ssl.connect(String url,
Integer timeout = 0) async;
呼叫參數:
- url: String, 指定連線的協議,可以是:ssl://host:port
- timeout: Integer, 指定超時時間,單位是毫秒,預設為0
回傳結果:
創建一個SslSocket物件並建立連接
1
2
3
4static 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
5static 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
2static ssl.setClientCert(X509Cert crt,
PKey key);
呼叫參數:
loadRootCerts
載入自備的缺省根證書,等同於ssl.ca.loadRootCerts
1static ssl.loadRootCerts();
靜態屬性
ca
X509Cert, 全域證書,用於ssl 用戶端模式驗證伺服器證書
1static readonly X509Cert ssl.ca;
verification
Integer, 設定憑證驗證模式,預設為VERIFY_REQUIRED
1static Integer ssl.verification;
常量
VERIFY_NONE
證書驗證模式,不驗證
1const ssl.VERIFY_NONE = 0;
VERIFY_OPTIONAL
證書驗證模式,可選驗證,允許驗證不通過
1const ssl.VERIFY_OPTIONAL = 1;
VERIFY_REQUIRED
證書驗證模式,要求驗證,驗證不通過則中斷
1const ssl.VERIFY_REQUIRED = 2;
BADCERT_EXPIRED
證書驗證結果,證書逾時
1const ssl.BADCERT_EXPIRED = 1;
BADCERT_REVOKED
證書驗證結果,證書撤銷
1const ssl.BADCERT_REVOKED = 2;
BADCERT_CN_MISMATCH
證書驗證結果,證書名稱錯誤
1const ssl.BADCERT_CN_MISMATCH = 4;
BADCERT_NOT_TRUSTED
證書驗證結果,證書不可信
1const ssl.BADCERT_NOT_TRUSTED = 8;