Return Type | Function name | Arguments |
---|---|---|
hzEcode | InitDomainSSL | (const char*,const char*,const char*,const char*,) |
Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp
Function Logic:
Function body:
hzEcode InitDomainSSL (const char* pvtKey, const char* sslCert, const char* sslCA, const char* domain) { _hzfunc("InitDomainSSL") ; _hz_SSL_Regime* pSSL_Regime ; hzString S ; int32_t sys_rc ; if (!pvtKey || !sslCert || !sslCA || !domain) return hzerr(E_ARGUMENT, "Domain %s: SSL params missing [PvtKey=%s][Cert=%s][CertCA=%s]", domain, pvtKey, sslCert, sslCA) ; threadLog("Domain %s: SSL params [PvtKey=%s][Cert=%s][CertCA=%s]\n", domain, pvtKey, sslCert, sslCA) ; 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) ; } S = domain ; if (s_mapSSLDoms.Exists(S)) return hzerr(E_INITDUP, "SSL Init called already for domain %s", domain) ; pSSL_Regime = new _hz_SSL_Regime() ; pSSL_Regime->m_Domain = S ; s_mapSSLDoms.Insert(S, pSSL_Regime) ; pSSL_Regime->m_svrCTX = SSL_CTX_new(s_svrMeth) ; if (!pSSL_Regime->m_svrCTX) return hzerr(E_INITFAIL, "Failed to allocate SSL Server Context for % (errno %d)\n", *pSSL_Regime->m_Domain, errno) ; SSL_CTX_set_tlsext_servername_callback(pSSL_Regime->m_svrCTX, &SNI_Callback) ; sys_rc = SSL_CTX_use_certificate_file(pSSL_Regime->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(pSSL_Regime->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(pSSL_Regime->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(pSSL_Regime->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 ; }