檢視原始碼 ssl (ssl v11.2.6)
用於 TLS (傳輸層安全性) 和 DTLS (資料包傳輸層安全性) 的介面函式。
注意
此應用程式的名稱仍然是 SSL,因為 TLS 協定的最初版本被命名為 SSL (安全通訊端層)。但是,此應用程式不支援舊版 SSL 協定的任何版本。
範例
1> ssl:start(), ssl:connect("google.com", 443, [{verify, verify_peer},
{cacerts, public_key:cacerts_get()}]).
{ok,{sslsocket, [...]}}
有關詳細用法和更多此 API 的範例,請參閱範例。
有關應用程式的特殊 Erlang 節點組態,請參閱SSL 應用程式。
摘要
類型:Socket
以主動模式傳遞給 TLS/DTLS 通訊端擁有者的訊息類型。
因安全因素而預設不再支援的 DTLS 協定版本。
DTLS 協定版本。
如果 TLS 連線失敗,將會傳送/接收 TLS 協定 ALERT。
主機的名稱或位址。
用戶端 Hello 擴充功能。
TLS 或 DTLS 協定版本。
用於除錯目的的錯誤原因。
在 TLS-1.3 之前識別 TLS 工作階段。
可用於執行所謂的「START-TLS」的通訊端,這表示使用先前用於純 TCP 流量且升級為使用 TLS 的已連線通訊端。
傳輸通訊端的選項。
TLS/DTLS 連線的不透明參考。
TLS Alert 協定原因。
可以提供給 TLS 用戶端的選項。
因安全因素而預設不再支援的 TLS 協定版本。
與 TLS/DTLS 協定相關的選項。
可以提供給 TLS 伺服器的選項。
TLS 協定版本。
傳輸選項定義回呼模組和訊息標籤,以處理底層傳輸通訊端。
類型:演算法
可用於酬載加密的加密演算法。
允許您自訂密碼套件清單的篩選器。
應支援的密碼套件清單。
密碼套件格式。
Erlang 密碼套件表示法
TLS-1.3 金鑰交換組態。
與簽署和加密函式一起使用的雜湊演算法。
密碼套件金鑰交換演算法在 TLS-1.3 中將為 any
,因為金鑰交換不再是 TLS-1.3 中密碼套件組態的一部分。
TLS-1.3 之前的金鑰交換組態。
在 TLS-1.3 和 TLS-1.2 中支援。
SHA2 雜湊演算法。
簽章演算法。
由 TLS-1.3 定義的簽章配置,取代了 TLS-1.2 中的簽章演算法。
以慣用順序列出憑證和交握訊息的可接受簽章演算法。
TLS-1.3 之前的 SRP 密碼套件組態。
類型:舊版演算法
因安全因素而預設不再支援的加密演算法。
因安全因素而預設不再支援的雜湊演算法。
TLS-1.3 之前的金鑰交換組態。
因安全因素而預設不再支援的簽章演算法。
僅當協商 TLS-1.2 時,才用於憑證簽章,這表示對等方僅支援 TLS-1.2,但我們也支援 TLS-1.3。
僅用於回溯相容性;請勿使用。
類型:已棄用
用戶端和伺服器 API
關閉 TLS/DTLS 連線。
關閉或降級 TLS 連線。
為 SSL 通訊端指派新的控制程序。
以嚴重錯誤 USER_CANCELED
警示取消交握。
繼續 TLS 交握,可能使用新的、額外的或變更的選項。
以被動模式從通訊端接收封包。
將 Data
寫入 SslSocket
。
根據 Options
為通訊端 SslSocket
設定選項。
立即單向或雙向關閉通訊端。
公用程式函式
使 Deferred
套件成為最不慣用的套件。
列出對應於 Description
的所有可用密碼套件。
等同於 cipher_suites/2
,但列出 RFC 或 OpenSSL 字串名稱,而不是 erl_cipher_suite()
。
清除 PEM 快取。
傳回關於連線的最相關資訊。
如果已定義,則傳回關於連線的請求資訊項目。
使用 TLS 連線的偽隨機函數 (TLS-1.3 之前的 PRF) 或金鑰衍生函數 (TLS-1.3 中的 HKDF) 來產生和匯出金鑰材料。
如果任何篩選函數針對密碼套件的任何部分返回 false
,則移除該密碼套件。
將 SSL 函數返回的錯誤呈現為可列印的字串。
取得指定 socket 選項的值。
取得底層 socket 的統計資訊。
取得底層 socket 的一個或多個統計值。
返回透過 ALPN 或 NPN 擴展協商的協定。
對等憑證會以 DER 編碼的二進位形式返回。
返回對等的位址和埠號。
使 Preferred
套件成為最優先的套件。
列出對應於 Description
的所有可用簽章演算法。
返回 socket SslSocket
的本機位址和埠號。
等同於 start(temporary)
。
啟動 SSL 應用程式。
停止 SSL 應用程式。
將 RFC 或 OpenSSL 名稱字串轉換為 erl_cipher_suite/0
將 erl_cipher_suite()
值轉換為 OpenSSL 名稱字串。
將 erl_cipher_suite()
值轉換為 RFC 名稱字串。
列出用於偵錯和測試目的的執行階段資訊,主要是有關 TLS/DTLS 版本。
已棄用的 API
使用 TLS 工作階段的偽隨機函數 (PRF) 來產生額外的金鑰材料。
類型:Socket
-type active_msgs() :: {ssl, sslsocket(), Data :: binary() | list()} | {ssl_closed, sslsocket()} | {ssl_error, sslsocket(), Alert :: error_alert() | (Reason :: any())} | {ssl_passive, sslsocket()}.
以主動模式傳遞給 TLS/DTLS 通訊端擁有者的訊息類型。
如果連線建立後發生 TLS 協定警示,ssl_error
原因可能會傳達該警示。當 TLS-1.3 伺服器請求客戶端憑證,並且伺服器在傳送最後的握手訊息後驗證提供的憑證不被接受時,最常見的情況會發生在客戶端。
只有當 socket 處於 {active, N}
模式且計數器已降至 0 時,才會傳送 ssl_passive
訊息。它表示 socket 已轉換為被動模式 ({active, false}
)。
-type dtls_legacy_version() :: dtlsv1.
因安全因素而預設不再支援的 DTLS 協定版本。
-type dtls_version() :: 'dtlsv1.2' | dtls_legacy_version().
DTLS 協定版本。
如果 TLS 連線失敗,將會傳送/接收 TLS 協定 ALERT。
將返回一個反映根據 TLS 協定引發的警示的原子,以及一個帶有一些詳細資訊的描述字串。
-type host() :: inet:hostname() | inet:ip_address().
主機的名稱或位址。
-type protocol_extensions() :: #{renegotiation_info => binary(), signature_algs => signature_algs(), alpn => binary(), srp => binary(), next_protocol => binary(), max_frag_enum => 1..4, ec_point_formats => [0..2], elliptic_curves => [public_key:oid()], sni => inet:hostname()}.
用戶端 Hello 擴充功能。
-type protocol_version() :: tls_version() | dtls_version().
TLS 或 DTLS 協定版本。
-type reason() :: term().
用於除錯目的的錯誤原因。
不可比對。
-type session_id() :: binary().
在 TLS-1.3 之前識別 TLS 工作階段。
-type socket() :: gen_tcp:socket().
可用於執行所謂的「START-TLS」的通訊端,這表示使用先前用於純 TCP 流量且升級為使用 TLS 的已連線通訊端。
雙方都需要同意升級。
-type socket_option() :: gen_tcp:connect_option() | gen_tcp:listen_option() | gen_udp:option().
傳輸通訊端的選項。
預設 socket 選項為 [{mode, list}, {packet, 0}, {header, 0}, {active, true}]
。
如需有效的選項,請參閱 Kernel 中的 inet
、gen_tcp
和 gen_udp
。請注意,諸如 packet
之類的串流導向選項僅適用於 TLS,而不適用於 DTLS。
-type sslsocket() :: any().
TLS/DTLS 連線的不透明參考。
請注意,儘管 sslsocket()
實例是不透明的,但允許比對。
-type tls_alert() ::
close_notify | unexpected_message | bad_record_mac | record_overflow | handshake_failure |
bad_certificate | unsupported_certificate | certificate_revoked | certificate_expired |
certificate_unknown | illegal_parameter | unknown_ca | access_denied | decode_error |
decrypt_error | export_restriction | protocol_version | insufficient_security |
internal_error | inappropriate_fallback | user_canceled | no_renegotiation |
unsupported_extension | certificate_unobtainable | unrecognized_name |
bad_certificate_status_response | bad_certificate_hash_value | unknown_psk_identity |
no_application_protocol.
TLS Alert 協定原因。
-type tls_client_option() :: client_option() | common_option() | socket_option() | transport_option().
可以提供給 TLS 用戶端的選項。
-type tls_legacy_version() :: tlsv1 | 'tlsv1.1'.
因安全因素而預設不再支援的 TLS 協定版本。
-type tls_option() :: tls_client_option() | tls_server_option().
與 TLS/DTLS 協定相關的選項。
-type tls_server_option() :: server_option() | common_option() | socket_option() | transport_option().
可以提供給 TLS 伺服器的選項。
-type tls_version() :: 'tlsv1.2' | 'tlsv1.3' | tls_legacy_version().
TLS 協定版本。
-type transport_option() :: {cb_info, {CallbackModule :: atom(), DataTag :: atom(), ClosedTag :: atom(), ErrTag :: atom()}} | {cb_info, {CallbackModule :: atom(), DataTag :: atom(), ClosedTag :: atom(), ErrTag :: atom(), PassiveTag :: atom()}}.
傳輸選項定義回呼模組和訊息標籤,以處理底層傳輸通訊端。
可用於自訂傳輸層。標籤值應該是底層傳輸在其主動模式訊息中使用的值。
TLS 的預設值為 {gen_tcp, tcp, tcp_closed, tcp_error, tcp_passive}
。
注意
為了向後相容,大小為四的元組將轉換為大小為五的元組,其中
PassiveTag
是附加了_passive
的DataTag
元素。
對於 TLS,回呼模組必須實作可靠的傳輸協定,行為如 gen_tcp
,並且具有對應於 inet:setopts/2
、inet:getopts/2
、inet:peername/1
、inet:sockname/1
和 inet:port/1
的函數。回呼 gen_tcp
會被特殊處理,並直接呼叫 inet
。對於 DTLS,此功能被視為實驗性功能。
類型:演算法
-type cipher() :: aes_256_gcm | aes_128_gcm | aes_256_ccm | aes_128_ccm | chacha20_poly1305 | aes_256_ccm_8 | aes_128_ccm_8 | aes_128_cbc | aes_256_cbc | legacy_cipher().
可用於酬載加密的加密演算法。
-type cipher_filters() :: [{key_exchange | cipher | mac | prf, fun((kex_algo() | cipher() | hash() | aead | default_prf) -> true | false)}].
允許您自訂密碼套件清單的篩選器。
-type cipher_suites() :: ciphers().
應支援的密碼套件清單。
函數 ssl:cipher_suites/2 可用於尋找預設支援的所有密碼套件,以及可以設定的所有密碼套件。
如果您撰寫自己的 cipher_suites/0
,請確保使用 ssl:filter_cipher_suites/2 對其進行篩選,以符合加密程式庫的支援。
以下函數可協助建立自訂的密碼套件清單
- ssl:append_cipher_suites/2
- ssl:prepend_cipher_suites/2
- ssl:suite_to_str/1
- ssl:str_to_suite/1
- ssl:suite_to_openssl_str/1
注意
請注意,TLS-1.3 和 TLS-1.2 使用不同的密碼套件集。為了支援這兩個版本,需要包含兩組的密碼套件。如果提供的清單不符合設定的版本或加密程式庫,也就是說,導致清單為空,則該選項將回退到其設定版本的適當預設值。
為了向後相容和測試目的,支援非預設密碼套件,包括匿名密碼套件(在 TLS 1.3 之前)。可以將它們新增到您的密碼套件清單中來使用它們。請注意,它們也需要對等端支援和啟用才能實際使用,並且可能需要額外的設定;請參閱 srp_param_type()
。
-type ciphers() :: [erl_cipher_suite()] | string().
密碼套件格式。
為了向後相容,密碼套件可以設定為以冒號分隔的密碼套件 RFC 名稱字串(甚至是舊的 OpenSSL 名稱)。但是,如果需要自訂密碼套件選項,更彈性的方法是將實用函數與 cipher_filters()
一起使用。
-type erl_cipher_suite() :: #{key_exchange := kex_algo(), cipher := cipher(), mac := hash() | aead, prf := hash() | default_prf}.
Erlang 密碼套件表示法
警告
強烈建議不要啟用使用 RSA 作為金鑰交換演算法的密碼套件(僅在 TLS-1.3 之前可用)。對於某些設定,可能存在軟體防護,如果它們有效,可以使其可用,但依賴它們工作是危險的。存在更可靠的密碼套件可以改用。
-type group() ::
x25519 | x448 | secp256r1 | secp384r1 | secp521r1 | ffdhe2048 | ffdhe3072 | ffdhe4096 |
ffdhe6144 | ffdhe8192.
TLS-1.3 金鑰交換組態。
-type hash() :: sha2() | legacy_hash().
與簽署和加密函式一起使用的雜湊演算法。
-type kex_algo() ::
ecdhe_ecdsa | ecdh_ecdsa | ecdh_rsa | rsa | dhe_rsa | dhe_dss | srp_rsa | srp_dss | dhe_psk |
rsa_psk | psk | ecdh_anon | dh_anon | srp_anon | any.
密碼套件金鑰交換演算法在 TLS-1.3 中將為 any
,因為金鑰交換不再是 TLS-1.3 中密碼套件組態的一部分。
-type named_curve() :: x25519 | x448 | secp521r1 | brainpoolP512r1 | brainpoolP384r1 | secp384r1 | brainpoolP256r1 | secp256r1 | legacy_named_curve().
TLS-1.3 之前的金鑰交換組態。
-type rsassa_pss_scheme() ::
rsa_pss_rsae_sha512 | rsa_pss_rsae_sha384 | rsa_pss_rsae_sha256 | rsa_pss_pss_sha512 |
rsa_pss_pss_sha384 | rsa_pss_pss_sha256.
在 TLS-1.3 和 TLS-1.2 中支援。
-type sha2() :: sha512 | sha384 | sha256.
SHA2 雜湊演算法。
-type sign_algo() :: eddsa | ecdsa | rsa | legacy_sign_algo().
簽章演算法。
-type sign_scheme() :: eddsa_ed25519 | eddsa_ed448 | ecdsa_secp521r1_sha512 | ecdsa_secp384r1_sha384 | ecdsa_secp256r1_sha256 | ecdsa_brainpoolP512r1tls13_sha512 | ecdsa_brainpoolP384r1tls13_sha384 | ecdsa_brainpoolP256r1tls13_sha256 | rsassa_pss_scheme() | legacy_sign_scheme().
由 TLS-1.3 定義的簽章配置,取代了 TLS-1.2 中的簽章演算法。
以偏好順序列出可接受的簽章方案。
覆寫 signature_algs
選項中為憑證提供的演算法。除了 TLS 1.2 中的 signature_algorithms
擴展之外,TLS 1.3 (RFC 5246 Section 4.2.3) 還新增了 signature_algorithms_cert
擴展,該擴展可以對憑證中使用的簽章具有與整個數位簽章要求不同的特殊要求。如果不需要,則不需要此擴展。
如果使用 TLS 版本 1.2(在 24.1 中向後移植到 TLS 1.2)或更高版本,並且明確指定了 signature_algs_cert 選項,則客戶端將傳送 signature_algorithms_cert
擴展(在客戶端 hello 訊息中)。預設情況下,只會傳送 signature_algs 擴展,但當未明確指定 signature_algs 選項時除外,在這種情況下,它會將 rsa_pkcs1_sha1 演算法附加到 signature_algs 的預設值,並將其用作 signature_algs_cert 的值,以允許憑證具有此簽章,但仍然不允許在 TLS 協定中使用 sha1,因為從 27.0.1 和 26.2.5.2 開始。
注意
請注意,TLS-1.2 支援的簽章方案為
legacy_sign_scheme()
和rsassa_pss_scheme()
。
-type signature_algs() :: [{hash(), sign_algo()} | sign_scheme()].
以慣用順序列出憑證和交握訊息的可接受簽章演算法。
客戶端將在 TLS-1.2 中引入的客戶端 hello signature_algorithm
擴展中傳送其清單;請參閱 RFC 5246 中的第 7.4.1.4.1 節。在 TLS-1.2 之前,這些演算法是隱式選擇的,並且部分從密碼套件衍生而來。
在 TLS-1.2 中,可以使用 {HashAlgo, SignAlgo}
元組的清單來進行稍微更明確的協商。
在 TLS-1.3 中,這些演算法配對被與密碼套件完全分離的簽章方案取代。
用於憑證的簽章演算法可以由 signature_algs_cert
選項提供的 簽章方案覆寫。
TLS-1.2 的預設值是與 rsa_pss_schemes
交錯的 Default_TLS_12_Alg_Pairs
,因為從 ssl-11.0 (Erlang/OTP 25) 開始。pss_pss
比 pss_rsae
更優先,而 pss_rsae
又比 rsa
更優先。
Default_TLS_12_Alg_Pairs
的清單定義如下
[
{sha512, ecdsa},
{sha512, rsa},
{sha384, ecdsa},
{sha384, rsa},
{sha256, ecdsa},
{sha256, rsa}
]
變更
- 從 ssl-8.0 (Erlang/OTP 22) 的 TLS-1.2 預設值中刪除了對
{md5, rsa}
的支援。- 從 ssl-11.0 (Erlang/OTP 26) 的 TLS-1.2 預設值中刪除了對
{sha, _}
(SHA1) 和{sha224, _}
的支援。
rsa_pss_schemes
的清單定義如下
[rsa_pss_pss_sha512,
rsa_pss_pss_sha384,
rsa_pss_pss_sha256,
rsa_pss_rsae_sha512,
rsa_pss_rsae_sha384,
rsa_pss_rsae_sha256]
TLS_13_Legacy_Schemes
的清單定義如下
[
%% Legacy algorithms only applicable to certificate signatures
rsa_pkcs1_sha512, %% Corresponds to {sha512, rsa}
rsa_pkcs1_sha384, %% Corresponds to {sha384, rsa}
rsa_pkcs1_sha256, %% Corresponds to {sha256, rsa}
]
Default_TLS_13_Schemes
的清單定義如下
[
%% EDDSA
eddsa_ed25519,
eddsa_ed448
%% ECDSA
ecdsa_secp521r1_sha512,
ecdsa_secp384r1_sha384,
ecdsa_secp256r1_sha256] ++
%% RSASSA-PSS
rsa_pss_schemes()
變更
在 ssl-10.8 (Erlang/OTP 25) 中,EDDSA 被設定為最高優先順序。
TLS-1.3 的預設值是 Default_TLS_13_Schemes
。
如果同時支援 TLS-1.3 和 TLS-1.2,則預設值為
Default_TLS_13_Schemes ++ TLS_13_Legacy_Schemes ++
Default_TLS_12_Alg_Pairs %% not represented in TLS_13_Legacy_Schemes
以確保可以為協商的版本選擇適當的演算法。
注意
TLS-1.3 不會協商 TLS-1.2 的演算法,但 TLS-1.3 RSASSA-PSS (
rsassa_pss_scheme()
) 簽章方案也可以從 Erlang/OTP 24.1 開始為 TLS-1.2 進行協商(從 Erlang/OTP 24.1.3 開始完全運作)。但是,如果同時支援 TLS 1.3 和 TLS 1.2 使用預設值,並且協商了 TLS 1.3,則 TLS 1.3 舊版簽章方案的對應 TLS 1.2 演算法將被視為舊版方案,並且僅應用於憑證簽章。
-type srp_param_type() :: srp_8192 | srp_6144 | srp_4096 | srp_3072 | srp_2048 | srp_1536 | srp_1024.
TLS-1.3 之前的 SRP 密碼套件組態。
類型:憑證
-type anchor_fun() :: fun().
聲明鏈中的中繼 CA 為受信任的。
fun(Chain::[public_key:der_encoded()]) ->
{trusted_ca, DerCert::public_key:der_encoded()} | unknown_ca.
然後,TLS 使用 public_key:pkix_path_validation/3
,並以選定的 CA 作為信任錨點,來驗證鏈中的其餘部分。
-type cert_key_conf() :: #{cert => public_key:der_encoded() | [public_key:der_encoded()], key => key(), certfile => file:filename(), keyfile => file:filename(), password => iodata() | fun(() -> iodata())}.
實體憑證及其對應金鑰的組態。
憑證(或可能包含憑證及其鏈憑證的清單,其中實體憑證必須是清單中的第一個元素或檔案中的第一個條目)及其關聯的密鑰。對於 PEM 檔案格式,還可能有一個與包含密鑰的檔案關聯的密碼。
為了獲得最大的互通性,鏈中的憑證應該按照正確的順序排列,因為鏈將原封不動地發送給對等方。如果未提供鏈憑證,則將使用配置的受信任 CA 憑證來構建鏈。有關更多資訊,請參閱 client_option_cert()
和 server_option_cert()
。
使用內建 CRL 快取支援的選項。
指定如何執行憑證撤銷列表(CRL)的查找和快取。Module
預設為 ssl_crl_cache
,DbHandle
為 internal
,Args
為 []
。
有兩種可用的實作方式
ssl_crl_cache
- 實作方式 1此模組維護 CRL 的快取。可以使用
ssl_crl_cache:insert/1
將 CRL 新增到快取中,並且如果指定了以下參數,則可以選擇通過 HTTP 自動提取{http, timeout()}
啟用提取在 X.509 憑證擴展中指定為 http URI 的 CRL。需要 Inets 應用程式。
ssl_crl_hash_dir
- 實作方式 2此模組使用一個目錄,其中 CRL 以發行者名稱的雜湊值命名的檔案儲存。
檔案名稱由八個十六進位數字組成,後跟
.rN
,其中N
是一個整數,例如1a2b3c4d.r0
。對於 CRL 的第一個版本,N
從零開始,對於每個新版本,N
遞增一。OpenSSL 實用程式c_rehash
根據此模式建立符號連結。對於給定的雜湊值,此模組會找到從零開始的所有連續
.r*
檔案,並且這些檔案合在一起構成撤銷列表。排除nextUpdate
欄位在過去或由恰好具有相同名稱雜湊值的不同 CA 發行的 CRL 檔案。需要以下參數
{dir, string()}
指定可以在其中找到 CRL 的目錄。
-type key() :: {'RSAPrivateKey' | 'DSAPrivateKey' | 'ECPrivateKey' | 'PrivateKeyInfo', public_key:der_encoded()} | #{algorithm := sign_algo(), engine := crypto:engine_ref(), key_id := crypto:key_id(), password => crypto:password()} | #{algorithm := sign_algo(), sign_fun := fun(), sign_opts => list(), encrypt_fun => fun(), encrypt_opts => list()}.
使用者的私密金鑰。
密鑰可以直接以 DER 編碼的實體提供,也可以間接使用加密引擎/提供者(帶有密鑰參考資訊)或作為 Erlang 函式(帶有可能的自訂選項)提供。後兩個選項可以用於使用硬體安全模組(HSM)或可信賴平台模組(TPM)進行自訂簽章。
- DER 編碼的密鑰將需要指定用於建立編碼的 ASN-1 類型。
- 引擎/提供者需要指定支援此概念的特定資訊,並且可以選擇使用密碼保護;另請參閱 crypto:engine_load/3 和 加密使用者指南。
- 函式選項應包含一個模仿
public_key:sign/4
的函式,如果必須支援舊版本的 TLS-1.0 和 TLS-1.1,則可能包含 public_key:private_encrypt/4。
類型:舊版演算法
-type legacy_cipher() :: '3des_ede_cbc' | des_cbc | rc4_128.
因安全因素而預設不再支援的加密演算法。
-type legacy_hash() :: sha224 | sha | md5.
因安全因素而預設不再支援的雜湊演算法。
-type legacy_named_curve() ::
sect571r1 | sect571k1 | sect409k1 | sect409r1 | sect283k1 | sect283r1 | secp256k1 |
sect239k1 | sect233k1 | sect233r1 | secp224k1 | secp224r1 | sect193r1 | sect193r2 |
secp192k1 | secp192r1 | sect163k1 | sect163r1 | sect163r2 | secp160k1 | secp160r1 | secp160r2.
TLS-1.3 之前的金鑰交換組態。
這些曲線已被 RFC 8422 棄用。
-type legacy_sign_algo() :: dsa.
因安全因素而預設不再支援的簽章演算法。
-type legacy_sign_scheme() ::
rsa_pkcs1_sha512 | rsa_pkcs1_sha384 | rsa_pkcs1_sha256 | ecdsa_sha1 | rsa_pkcs1_sha1.
僅當協商 TLS-1.2 時,才用於憑證簽章,這表示對等方僅支援 TLS-1.2,但我們也支援 TLS-1.3。
-type old_cipher_suite() :: {kex_algo(), cipher(), hash()} | {kex_algo(), cipher(), hash() | aead, hash()}.
僅用於回溯相容性;請勿使用。
類型:客戶端選項
類型:伺服器選項
類型:客戶端和伺服器選項
類型:Info
-type connection_info() :: [{protocol, protocol_version()} | {session_resumption, boolean()} | {selected_cipher_suite, erl_cipher_suite()} | {sni_hostname, term()} | {ciphers, [erl_cipher_suite()]}] | connection_info_pre_tls13() | security_info().
關於已建立連線的一些資訊的金鑰值清單。
-type connection_info_keys() ::
[protocol | selected_cipher_suite | sni_hostname | session_resumption | ciphers |
client_random | server_random | master_secret | keylog | session_id | session_data | ecc |
srp_username].
可以擷取資訊的 TLS 連線金鑰。
-type connection_info_pre_tls13() :: [{session_id, session_id()} | {session_data, binary()} | {ecc, {named_curve, term()}} | {srp_username, term()}].
TLS-1.3 之前相關的 TLS 連線資訊。
-type security_info() :: [{client_random, binary()} | {server_random, binary()} | {master_secret, binary()} | {keylog, term()}].
可用於 NSS 金鑰記錄的 TLS 連線資訊。
類型:已棄用
用戶端 API
-spec connect(TCPSocket, TLSOptions) -> {ok, sslsocket()} | {error, Reason} when TCPSocket :: socket(), TLSOptions :: [tls_client_option()], Reason :: closed | {options, any()} | error_alert() | reason().
-spec connect(TCPSocketOrHost, TLSOptionsOrPort, TimeoutOrTLSOptions) -> {ok, sslsocket()} | {ok, sslsocket(), Ext :: protocol_extensions()} | {error, Reason} when TCPSocketOrHost :: socket() | host(), TLSOptionsOrPort :: [tls_client_option()] | inet:port_number(), TimeoutOrTLSOptions :: [tls_client_option()] | timeout(), Reason :: closed | timeout | {options, any()} | error_alert() | reason().
開啟 TLS/DTLS 連線。
connect(TCPSocket, TLSOptions, Timeout).
通過執行客戶端 TLS 交握,將已連線的 gen_tcp
(或等效)socket 升級為 TLS socket。
connect(Host, Port, TLSOptions).
開啟與 Host
、Port
的 TLS/DTLS 連線。此呼叫等同於
connect(Host, Port, TLSOptions, infinity).
-spec connect(Host, Port, TLSOptions, Timeout) -> {ok, sslsocket()} | {ok, sslsocket(), Ext :: protocol_extensions()} | {error, Reason} when Host :: host(), Port :: inet:port_number(), TLSOptions :: [tls_client_option()], Timeout :: timeout(), Reason :: closed | timeout | {options, any()} | error_alert() | reason().
開啟到 Host
, Port
的 TLS/DTLS 連線。
當 verify
選項設定為 verify_peer
時,除了通常的 X.509 路徑驗證檢查外,還會執行 public_key:pkix_verify_hostname/2
檢查。如果檢查失敗,則錯誤 {bad_cert, hostname_check_failed}
將會傳播到路徑驗證函式,您可以在其中使用 public_key:pkix_verify_hostname/3
API 的完整功能進行自訂檢查。當提供 server_name_indication
選項時,其值(DNS 名稱)將用作 public_key:pkix_verify_hostname/2
的 ReferenceID
。當未提供 server_name_indication
選項時,Host
參數將用作伺服器名稱指示擴充功能。Host
參數也將用於 public_key:pkix_verify_hostname/2
檢查。如果 Host
參數是 inet:ip_address()
,則用於檢查的 ReferenceID
將為 {ip, Host}
;否則將假設為 dns_id
,如果失敗則會回退至 ip
。
注意
根據良好實務,憑證不應使用 IP 位址作為「伺服器名稱」,尤其是在封閉網路之外。
如果使用 {handshake, hello}
選項,則在收到伺服器 hello 訊息後,交握會暫停,且成功回應為 {ok, SslSocket, Ext}
而非 {ok, SslSocket}
。之後,透過呼叫 handshake_continue/3
或 handshake_cancel/1
來繼續或取消交握。
如果 active
選項設定為 once
、true
或整數值,則擁有 SSL socket 的程序將會收到 active_msgs()
類型的訊息。
伺服器 API
-spec handshake(HsSocket) -> {ok, SslSocket} | {ok, SslSocket, Ext} | {error, Reason} when HsSocket :: sslsocket(), SslSocket :: sslsocket(), Ext :: protocol_extensions(), Reason :: closed | timeout | error_alert().
-spec handshake(HsSocket, OptionsOrTimeout) -> {ok, SslSocket} | {ok, SslSocket, Ext} | {error, Reason} when HsSocket :: sslsocket(), OptionsOrTimeout :: timeout() | [server_option()], SslSocket :: sslsocket(), Ext :: protocol_extensions(), Reason :: closed | timeout | error_alert().
執行 TLS/DTLS 伺服器端交握。
如果第二個參數是逾時值
handshake(HsSocket, Timeout).
此呼叫等同於
handshake(HsSocket, [], Timeout).
否則,如果第二個參數是選項列表
handshake(HsSocket, Options).
此呼叫等同於
handshake(HsSocket, Options, infinity).
-spec handshake(Socket, Options, Timeout) -> {ok, SslSocket} | {ok, SslSocket, Ext} | {error, Reason} when Socket :: socket() | sslsocket(), SslSocket :: sslsocket(), Options :: [server_option()], Timeout :: timeout(), Ext :: protocol_extensions(), Reason :: closed | timeout | {options, any()} | error_alert().
執行 TLS/DTLS 伺服器端交握。
如果交握成功,則傳回新的 TLS/DTLS socket。
如果 Socket
是普通的 socket()
,則通過執行 TLS 伺服器端交握並傳回 TLS socket,將 gen_tcp
或等效的 socket 升級為 SSL socket。
注意
普通的
Socket
必須在呼叫此函式之前,以及客戶端嘗試使用 TLS 連線之前,處於被動模式 ({active, false}
);否則,此函式的行為是未定義的。確保這一點的最佳方法是在被動模式下建立普通的監聽 socket。
如果 Socket
是 sslsocket()
,則提供在 listen/2
中指定的額外 TLS/DTLS 選項,然後執行 TLS/DTLS 交握。如果交握成功,則傳回新的 TLS/DTLS socket。
警告
不設定逾時會使伺服器更容易受到阻斷服務 (DoS) 攻擊。
如果指定選項 {handshake, hello}
,則在收到客戶端 hello 訊息後,交握會暫停,且成功回應為 {ok, SslSocket, Ext}
而非 {ok, SslSocket}
。之後,透過呼叫 handshake_continue/3
或 handshake_cancel/1
來繼續或取消交握。
如果選項 active
設定為 once
、true
或整數值,則擁有 sslsocket()
的程序將會收到 active_msgs()
類型的訊息。
-spec listen(Port, Options) -> {ok, ListenSocket} | {error, Reason} when Port :: inet:port_number(), Options :: [tls_server_option()], ListenSocket :: sslsocket(), Reason :: {options, any()} | reason().
建立 SSL 接聽通訊端。
-spec transport_accept(ListenSocket, Timeout) -> {ok, SslSocket} | {error, Reason} when ListenSocket :: sslsocket(), Timeout :: timeout(), SslSocket :: sslsocket(), Reason :: reason().
接受接聽通訊端上的連入連線請求。
ListenSocket
必須是從 listen/2
傳回的 socket。傳回的 socket 將傳遞至 handshake/1,2,3
,以完成交握並建立 TLS/DTLS 連線。
警告
大多數 API 函式都要求已建立 TLS/DTLS 連線才能按預期工作。
接受的 socket 會繼承在 listen/2
中為 ListenSocket
設定的選項。
Timeout
的預設值為 infinity
。如果指定 Timeout
,且在指定的時間內未接受任何連線,則會傳回 {error, timeout}
。
客戶端和伺服器 API
關閉 TLS/DTLS 連線。
-spec close(SslSocket, How) -> ok | {ok, port()} | {ok, port(), Data} | {error, Reason} when SslSocket :: sslsocket(), How :: timeout() | {NewController :: pid(), timeout()}, Data :: binary(), Reason :: any().
關閉或降級 TLS 連線。
在後一種情況下,在收到來自對等的 TLS 關閉警示後,傳輸連線將移交給 NewController
程序。傳回的傳輸 socket 將設定以下選項:[{active, false}, {packet, 0}, {mode, binary}]
。
在降級的情況下,關閉函式可能會傳回一些二進位資料,使用者應將其視為在降級連線上收到的第一個位元組。
-spec controlling_process(SslSocket, NewOwner) -> ok | {error, Reason} when SslSocket :: sslsocket(), NewOwner :: pid(), Reason :: any().
為 SSL 通訊端指派新的控制程序。
控制程序是 SSL socket 的擁有者,並接收來自 socket 的所有訊息。
以嚴重錯誤 USER_CANCELED
警示取消交握。
-spec handshake_continue(HsSocket, Options) -> {ok, SslSocket} | {error, Reason} when HsSocket :: sslsocket(), Options :: [tls_client_option() | tls_server_option()], SslSocket :: sslsocket(), Reason :: closed | timeout | error_alert().
-spec handshake_continue(HsSocket, Options, Timeout) -> {ok, SslSocket} | {error, Reason} when HsSocket :: sslsocket(), Options :: [tls_client_option() | tls_server_option()], Timeout :: timeout(), SslSocket :: sslsocket(), Reason :: closed | timeout | error_alert().
繼續 TLS 交握,可能使用新的、額外的或變更的選項。
-spec recv(SslSocket, Length, Timeout) -> {ok, Data} | {error, reason()} when SslSocket :: sslsocket(), Length :: non_neg_integer(), Data :: binary() | list() | HttpPacket, Timeout :: timeout(), HttpPacket :: any().
以被動模式從通訊端接收封包。
關閉的 socket 由傳回值 {error, closed}
指示。參數 Length
僅在 socket 處於 raw
模式時才有意義,並表示要讀取的位元組數。如果 Length
為零,則會傳回所有可用的位元組。如果 Length
大於零,則會傳回剛好 Length
個位元組,或者發生錯誤;當 socket 從另一端關閉時,可能會捨棄少於 Length
個位元組的資料。
可選參數 Timeout
指定以毫秒為單位的逾時。預設值為 infinity
。
-spec send(SslSocket, Data) -> ok | {error, reason()} when SslSocket :: sslsocket(), Data :: iodata().
將 Data
寫入 SslSocket
。
一個值得注意的傳回值是 {error, closed}
,表示 socket 已關閉。
-spec setopts(SslSocket, Options) -> ok | {error, reason()} when SslSocket :: sslsocket(), Options :: [gen_tcp:option()].
根據 Options
為通訊端 SslSocket
設定選項。
-spec shutdown(SslSocket, How) -> ok | {error, reason()} when SslSocket :: sslsocket(), How :: read | write | read_write.
立即單向或雙向關閉通訊端。
How == write
表示關閉 socket 進行寫入,但仍然可以從中讀取。
為了處理對等方已在寫入端執行關閉的情況,選項 {exit_on_close, false}
非常有用。
僅限 TLS-1.3 API
-spec groups() -> [group()].
傳回 TLS 1.3 中所有支援的群組。
自 OTP 22.0 起存在;自 OTP 27 起記錄。
-spec groups(Description) -> [group()] when Description :: default.
傳回 TLS 1.3 中預設支援的群組。
自 OTP 22.0 起存在;自 OTP 27 起記錄。
-spec update_keys(SslSocket, Type) -> ok | {error, reason()} when SslSocket :: sslsocket(), Type :: write | read_write.
建立新的工作階段金鑰。
在給定的一組金鑰下,可以安全加密的明文數量存在密碼學限制。如果資料量超過這些限制,則會觸發金鑰更新並安裝一組新的金鑰。另請參閱 common_option_tls13/0
中的 key_update_at
選項。
此函式可用於在 TLS-1.3 連線上明確啟動金鑰更新。金鑰更新有兩種型別:如果 Type
為 write
,則只更新寫入金鑰;如果 Type
為 read_write
,則更新讀取和寫入金鑰。
TLS-1.3 前 API
-spec eccs() -> NamedCurves when NamedCurves :: [named_curve()].
傳回所有 TLS/DTLS 1.3 之前版本的所有支援橢圓曲線清單,包括舊版曲線。
-spec eccs(Version) -> NamedCurves when Version :: 'tlsv1.2' | 'tlsv1.1' | tlsv1 | 'dtlsv1.2' | dtlsv1, NamedCurves :: [named_curve()].
傳回 Version
預設支援的橢圓曲線。
這是 eccs/0
傳回值的一個子集。
啟動新的交握。
一個值得注意的回傳值是 {error, renegotiation_rejected}
,表示對等端拒絕重新協商,但連線仍使用先前協商的會期保持活動狀態。
TLS-1.3 移除了早期 TLS 版本中的重新協商功能,並新增了一個稱為金鑰更新的新功能,該功能取代了重新協商最重要的部分:刷新會期金鑰。這會在達到純文字限制後自動觸發,並且可以使用 common_option_tls13/0
中的 key_update_at
選項進行設定。
實用函數
-spec append_cipher_suites(Deferred, Suites) -> ciphers() when Deferred :: ciphers() | cipher_filters(), Suites :: ciphers().
使 Deferred
套件成為最不慣用的套件。
延遲的密碼套件(Deferred
)將被放置在密碼套件列表 Suites
的末尾,如果它們存在於 Suites
中,則會將其移除。Deferred
可以是密碼套件的列表,也可以是篩選器的列表。在後者的情況下,篩選器會被用在 Suites
上以提取延遲的密碼列表。
-spec cipher_suites(Description, Version) -> ciphers() when Description :: default | all | exclusive | anonymous | exclusive_anonymous, Version :: protocol_version().
列出對應於 Description
的所有可用密碼套件。
exclusive
和 exclusive_anonymous
選項會獨佔地列出 Version
中首次支援的密碼套件,而其他選項則會包含從最低可能版本到 Version
的所有密碼套件。all
選項包含所有套件,但匿名套件除外。預設情況下不支援匿名套件。
注意
TLS-1.3 與先前的 TLS 版本沒有重疊的密碼套件,這表示
cipher_suites(all, 'tlsv1.3')
的結果包含一組可與 TLS-1.3 搭配使用的單獨套件,以及另一組可在協商較低版本時使用的套件。所謂的PSK
和SRP
套件(在 TLS-1.3 之前)需要額外的設定才能運作;也就是user_lookup_function
選項。TLS-1.3 不支援匿名套件。另請注意,此函數返回的密碼套件是 OTP SSL 應用程式可以支援的密碼套件,前提是它們受到與 OTP Crypto 應用程式連結的 crypto 函式庫支援。使用
ssl:filter_cipher_suites(Suites, [])
來篩選清單,以取得目前的 crypto 函式庫。請注意,密碼套件可能會因為太舊或太新而遭到篩除,這取決於 crypto 函式庫。
-spec cipher_suites(Description, Version, StringType) -> [string()] when Description :: default | all | exclusive | anonymous, Version :: protocol_version(), StringType :: rfc | openssl.
等同於 cipher_suites/2
,但列出 RFC 或 OpenSSL 字串名稱,而不是 erl_cipher_suite()
。
-spec clear_pem_cache() -> ok.
清除 PEM 快取。
SSL API 函數使用的 PEM 檔案會為了效能因素而進行快取。快取會定期自動檢查,以判斷是否應使任何快取項目失效。
此函數提供了一種無條件清除整個快取的方法,從而強制重新載入先前快取的 PEM 檔案。
-spec connection_information(SslSocket) -> {ok, Result} | {error, reason()} when SslSocket :: sslsocket(), Result :: connection_info().
傳回關於連線的最相關資訊。
一些未定義的項目將被篩除。不會返回任何會影響連線安全性的值。
注意
舊版
cipher_suite
項目已在 OTP 23 中移除。先前它以其(未記載的)舊版格式返回密碼套件。它已被selected_cipher_suite
取代。
-spec connection_information(SslSocket, Items) -> {ok, Result} | {error, reason()} when SslSocket :: sslsocket(), Items :: connection_info_keys(), Result :: connection_info().
如果已定義,則傳回關於連線的請求資訊項目。
請注意,client_random
、server_random
、master_secret
和 keylog
的值會影響連線的安全性。
為了從 TLS 1.3 連線中檢索 keylog
和其他機密資訊,必須預先設定 keep_secrets
選項並將其設定為 true
。
注意
如果僅請求未定義的選項,則產生的列表可能是空的。
-spec export_key_materials(SslSocket, Labels, Contexts, WantedLengths) -> {ok, ExportKeyMaterials} | {error, reason()} when SslSocket :: sslsocket(), Labels :: [binary()], Contexts :: [binary() | no_context], WantedLengths :: [non_neg_integer()], ExportKeyMaterials :: [binary()].
等同於 export_key_materials(TLSSocket, Labels, Contexts, WantedLengths, true)
。
export_key_materials(SslSocket, Labels, Contexts, WantedLengths, ConsumeSecret)
檢視原始碼 (自 OTP 27.0 起)-spec export_key_materials(SslSocket, Labels, Contexts, WantedLengths, ConsumeSecret) -> {ok, ExportKeyMaterials} | {error, exporter_master_secret_already_consumed | bad_input} when SslSocket :: sslsocket(), Labels :: [binary()], Contexts :: [binary() | no_context], WantedLengths :: [non_neg_integer()], ConsumeSecret :: boolean(), ExportKeyMaterials :: [binary()].
使用 TLS 連線的偽隨機函數 (TLS-1.3 之前的 PRF) 或金鑰衍生函數 (TLS-1.3 中的 HKDF) 來產生和匯出金鑰材料。
在 TLS-1.3 中,使用 no_context
等同於指定一個空的上下文(空的二進位資料)。在 TLS-1.3 之前,no_context
和空的上下文會產生不同的結果。
ConsumeSecret
引數僅在 TLS-1.3 中相關,它會導致 TLS-1.3 的 exporter_master_secret
被使用,從而使其不可用並提高安全性。進一步嘗試呼叫此函數將會失敗。
-spec filter_cipher_suites(Suites, Filters) -> Ciphers when Suites :: ciphers(), Filters :: cipher_filters(), Ciphers :: ciphers().
如果任何篩選函數針對密碼套件的任何部分返回 false
,則移除該密碼套件。
如果沒有為某些部分提供篩選函數,則預設行為會將其視為返回 true
的篩選函數。有關範例,請參閱自訂密碼套件。此外,此函數還會篩選密碼套件以排除 OTP Crypto 應用程式使用的加密庫不支援的密碼套件,這表示 ssl:filter_cipher_suites(Suites, [])
等同於僅套用加密庫支援的篩選器。
-spec format_error(Error) -> ReasonStr when Error :: {error, reason()} | reason(), ReasonStr :: string().
將 SSL 函數返回的錯誤呈現為可列印的字串。
-spec getopts(SslSocket, OptionNames) -> {ok, [gen_tcp:option()]} | {error, reason()} when SslSocket :: sslsocket(), OptionNames :: [gen_tcp:option_name()].
取得指定 socket 選項的值。
-spec getstat(SslSocket) -> {ok, OptionValues} | {error, inet:posix()} when SslSocket :: sslsocket(), OptionValues :: [{inet:stat_option(), integer()}].
取得底層 socket 的統計資訊。
-spec getstat(SslSocket, Options) -> {ok, OptionValues} | {error, inet:posix()} when SslSocket :: sslsocket(), Options :: [inet:stat_option()], OptionValues :: [{inet:stat_option(), integer()}].
取得底層 socket 的一個或多個統計值。
如需更多詳細資訊,請參閱 inet:getstat/2
。
-spec negotiated_protocol(SslSocket) -> {ok, Protocol} | {error, Reason} when SslSocket :: sslsocket(), Protocol :: binary(), Reason :: protocol_not_negotiated | closed.
返回透過 ALPN 或 NPN 擴展協商的協定。
-spec peercert(SslSocket) -> {ok, Cert} | {error, reason()} when SslSocket :: sslsocket(), Cert :: public_key:der_encoded().
對等憑證會以 DER 編碼的二進位形式返回。
可以使用 public_key:pkix_decode_cert/2
解碼憑證。有關憑證的建議進一步閱讀內容為Public_Key 使用者指南和SSL 使用者指南。
-spec peername(SslSocket) -> {ok, {Address, Port}} | {error, reason()} when SslSocket :: sslsocket(), Address :: inet:ip_address(), Port :: inet:port_number().
返回對等的位址和埠號。
-spec prepend_cipher_suites(Preferred, Suites) -> ciphers() when Preferred :: ciphers() | cipher_filters(), Suites :: ciphers().
使 Preferred
套件成為最優先的套件。
偏好的套件(Preferred
)將被放置在密碼套件列表 Suites
的開頭,如果它們存在於 Suites
中,則會將其移除。Preferred
可以是密碼套件的列表,也可以是篩選器的列表。在後者的情況下,篩選器會被用在 Suites
上以提取偏好的密碼列表。
-spec signature_algs(Description, Version) -> signature_algs() when Description :: default | all | exclusive, Version :: protocol_version().
列出對應於 Description
的所有可用簽章演算法。
exclusive
選項會獨佔地列出該協議版本的演算法或演算法方案,而 default
和 all
選項則會列出組合列表,以支援從 (D)TLS-1.2(第一個支援設定簽名演算法的版本)到 Version
的協議範圍。
範例
1> ssl:signature_algs(default, 'tlsv1.3').
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,
{sha512,ecdsa},
{sha384,ecdsa},
{sha256,ecdsa}]
2> ssl:signature_algs(all, 'tlsv1.3').
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,
{sha512,ecdsa},
{sha384,ecdsa},
{sha256,ecdsa},
{sha224,ecdsa},
{sha224,rsa},
{sha,rsa},
{sha,dsa}]
3> ssl:signature_algs(exclusive, 'tlsv1.3').
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256]
注意
一些 TLS-1-3 方案名稱與 TLS-1.2 演算法元組對名稱重疊,然後會使用 TLS-1.3 名稱,例如
rsa_pkcs1_sha256
而不是{sha256, rsa}
。這些是 TLS-1.3 中的舊版演算法,僅適用於此協議版本中的憑證簽名。
-spec sockname(SslSocket) -> {ok, {Address, Port}} | {error, reason()} when SslSocket :: sslsocket(), Address :: inet:ip_address(), Port :: inet:port_number().
返回 socket SslSocket
的本機位址和埠號。
-spec start() -> ok | {error, reason()}.
等同於 start(temporary)
。
-spec start(permanent | transient | temporary) -> ok | {error, reason()}.
啟動 SSL 應用程式。
-spec stop() -> ok.
停止 SSL 應用程式。
-spec str_to_suite(CipherSuiteName) -> erl_cipher_suite() | {error, {not_recognized, CipherSuiteName}} when CipherSuiteName :: string().
將 RFC 或 OpenSSL 名稱字串轉換為 erl_cipher_suite/0
如果密碼套件不受支援或名稱不是有效的密碼套件名稱,則返回錯誤。
-spec suite_to_openssl_str(CipherSuite) -> string() when CipherSuite :: erl_cipher_suite().
將 erl_cipher_suite()
值轉換為 OpenSSL 名稱字串。
在 TLS-1.3 之前,這些名稱與 RFC 名稱不同
-spec suite_to_str(CipherSuite) -> string() when CipherSuite :: erl_cipher_suite().
將 erl_cipher_suite()
值轉換為 RFC 名稱字串。
-spec versions() -> [VersionInfo] when VersionInfo :: {ssl_app, string()} | {supported | available | implemented, [tls_version()]} | {supported_dtls | available_dtls | implemented_dtls, [dtls_version()]}.
列出用於偵錯和測試目的的執行階段資訊,主要是有關 TLS/DTLS 版本。
app_vsn
- SSL 應用程式的應用程式版本。supported
- 目前應用程式環境和加密函式庫配置所支援的 TLS 版本。會被connect/2,3,4
、listen/2
和handshake/2,3
上的版本選項覆寫。關於協商後的 TLS 版本,請參閱connection_information/1
。supported_dtls
- 目前應用程式環境和加密函式庫配置所支援的 DTLS 版本。會被connect/2,3,4
、listen/2
和handshake/2,3
上的版本選項覆寫。關於協商後的 DTLS 版本,請參閱connection_information/1
。available
- 連結的加密函式庫所支援的所有 TLS 版本。available_dtls
- 連結的加密函式庫所支援的所有 DTLS 版本。implemented
- 如果連結的加密函式庫具備必要支援,SSL 應用程式所支援的所有 TLS 版本。implemented_dtls
- 如果連結的加密函式庫具備必要支援,SSL 應用程式所支援的所有 DTLS 版本。
已棄用的 API
-spec prf(SslSocket, Secret, Label, Seed, WantedLength) -> {ok, binary()} | {error, reason()} when SslSocket :: sslsocket(), Secret :: binary() | master_secret, Label :: binary(), Seed :: [binary() | prf_random()], WantedLength :: non_neg_integer().
使用 TLS 工作階段的偽隨機函數 (PRF) 來產生額外的金鑰材料。
它會接受使用者產生的 Secret
和 Seed
值,或接受指示使用來自會期安全性參數的特定值的原子。
注意
此函數已由 export_key_materials/4
取代,自 OTP 27 以來的官方文件化 API 函數,其等效於 prf(TLSSocket, master_secret, Label, [client_random, server_random, Context], WantedLength)
。呼叫此函數的其他方式僅供測試用途,沒有實際應用案例。當在 TLS-1.3 環境中呼叫時,其行為將如同 export_key_materials(TLSSocket, [Label], [Context], [WantedLength])
。