在創建context之後,調用符合PFS規範的加密套件,加載完證書之後設置ECDH
// context 生成
Context context(SSL_CTX_new(SSLv23_server_method()));
// PFS加密套件,騰訊雲,各種檢測網站都有推薦
const char * cipher_list = "ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE";
int res = SSL_CTX_set_cipher_list(context.context, cipher_list);
if (res == 0)
{
printf("Failed to set cipher list: %s\n", cipher_list);
}
else
{
printf("load cipher succ res: %d\n", res);
}
// TLSv1過濾,前向完全設置
SSL_CTX_set_options(context.context, SSL_OP_NO_TLSv1 | SSL_OP_CIPHER_SERVER_PREFERENCE);
// 加載證書代碼
SSL_CTX_load_verify_locations(context,"ca-certificates.crt證書路徑");
// SSL_CTX_use_certificate_chain_file
// SSL_CTX_use_PrivateKey_file
// 這一步很重要,設置臨時公鑰
EC_KEY *ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
if (!ecdh)
{
printf("EC_KEY_new_by_curve_name\n");
}
SSL_CTX_set_options(context.context, SSL_OP_SINGLE_ECDH_USE);
SSL_CTX_set_tmp_ecdh (context.context, ecdh);
EC_KEY_free(ecdh);
// 參考代碼nginx源碼
一些概念:
TLS:傳輸層安全性協議(英語:Transport Layer Security,縮寫作TLS),及其前身安全套接層(Secure Sockets Layer,縮寫作SSL)是一種安全協議,目的是爲互聯網通信提供安全及數據完整性保障。百度鏈接:https://baike.baidu.com/item/TLS/2979545?fr=aladdin
PFS:(perfect forward secrecy),中文可叫做完全前向保密。要求一個密鑰只能訪問由它所保護的數據;用來產生密鑰的元素一次一換,不能再產生其他的密鑰;一個密鑰被破解,並不影響其他密鑰的安全性。知乎科普:https://www.zhihu.com/question/45203206