Return Type | Function name | Arguments |
---|---|---|
hzEcode | InitServerSSL | (const char*,const char*,const char*,) |
Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp
Function Logic:
Function body:
hzEcode InitServerSSL (const char* pvtKey, const char* sslCert, const char* sslCA) { _hzfunc("InitServerSSL") ; hzString S ; int32_t sys_rc ; if (s_SSL_svrRegime) return hzerr(E_INITDUP, "SSL Init called already for whole server") ; if (!s_svrMeth) { sys_rc = SSL_library_init() ; threadLog("Returned from SSL_library_init with %d\n", sys_rc) ; SSL_load_error_strings(); sys_rc = OpenSSL_add_ssl_algorithms(); threadLog("Returned from OpenSSL_add_ssl_algorithms with %d\n", sys_rc) ; s_svrMeth = SSLv23_server_method() ; if (!s_svrMeth) return hzerr(E_INITFAIL, "Failed to allocate SSLv23 Server Method (errno %d)\n", errno) ; } if ((pvtKey || sslCert || sslCA) && (!pvtKey || !sslCert || !sslCA)) return hzerr(E_ARGUMENT, "Server SSL params incomplete set [PvtKey=%s][Cert=%s][CertCA=%s]", pvtKey, sslCert, sslCA) ; if (!pvtKey || !sslCert || !sslCA) { s_SSL_svrRegime = s_mapSSLDoms.GetObj(0); if (!s_SSL_svrRegime) return hzerr(E_ARGUMENT, "Server SSL - No domain SSL regimes found [PvtKey=%s][Cert=%s][CertCA=%s]", pvtKey, sslCert, sslCA) ; return E_OK ; } threadLog("SSL params [PvtKey=%s][Cert=%s][CertCA=%s]\n", pvtKey, sslCert, sslCA) ; s_SSL_svrRegime = new _hz_SSL_Regime() ; s_SSL_svrRegime->m_Domain = "default" ; s_SSL_svrRegime->m_svrCTX = SSL_CTX_new(s_svrMeth) ; if (!s_SSL_svrRegime->m_svrCTX) return hzerr(E_INITFAIL, "Failed to allocate SSL Server Context for % (errno %d)\n", *s_SSL_svrRegime->m_Domain, errno) ; SSL_CTX_set_tlsext_servername_callback(s_SSL_svrRegime->m_svrCTX, &SNI_Callback) ; sys_rc = SSL_CTX_use_certificate_file(s_SSL_svrRegime->m_svrCTX, sslCert, SSL_FILETYPE_PEM) ; if (sys_rc <&eq; 0) return hzerr(E_INITFAIL, "No SSL certificate. File %s Returned %d, errno %d", sslCert, sys_rc, errno) ; threadLog("Returned from SSL_CTX_use_certificate_file with %d\n", sys_rc) ; sys_rc = SSL_CTX_load_verify_locations(s_SSL_svrRegime->m_svrCTX, sslCA, NULL) ; if (sys_rc <&eq; 0) return hzerr(E_INITFAIL, "No SSL CA certificate. File %s Returned %d, errno %d", sslCA, sys_rc, errno) ; threadLog("Returned from SSL_CTX_load_verify_locations with %d\n", sys_rc) ; sys_rc = SSL_CTX_use_PrivateKey_file(s_SSL_svrRegime->m_svrCTX, pvtKey, SSL_FILETYPE_PEM) ; if (sys_rc <&eq; 0) return hzerr(E_INITFAIL, "No SSL private key. File %s Error %d", pvtKey, sys_rc) ; threadLog("Returned from SSL_CTX_use_PrivateKey_file with %d\n", sys_rc) ; if (!(sys_rc = SSL_CTX_check_private_key(s_SSL_svrRegime->m_svrCTX))) return hzerr(E_INITFAIL, "Private key does not match the certificate public key") ; threadLog("Returned from SSL_CTX_check_private_key with %d\n", sys_rc) ; return E_OK ; }