HPSocket-SSL.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 3.6.1
  5. * Author : Bruce Liang
  6. * Website : http://www.jessma.org
  7. * Project : https://github.com/ldcsaa
  8. * Blog : http://www.cnblogs.com/ldcsaa
  9. * Wiki : http://www.oschina.net/p/hp-socket
  10. * QQ Group : 75375912
  11. *
  12. * Licensed under the Apache License, Version 2.0 (the "License");
  13. * you may not use this file except in compliance with the License.
  14. * You may obtain a copy of the License at
  15. *
  16. * http://www.apache.org/licenses/LICENSE-2.0
  17. *
  18. * Unless required by applicable law or agreed to in writing, software
  19. * distributed under the License is distributed on an "AS IS" BASIS,
  20. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  21. * See the License for the specific language governing permissions and
  22. * limitations under the License.
  23. */
  24. /******************************************************************************
  25. Module: HPSocket-SSL
  26. Usage:
  27. 方法一:
  28. --------------------------------------------------------------------------------------
  29. 0. 应用程序包含 SocketInterface-SSL.h 和 HPSocket-SSL.h 头文件
  30. 1. 启动通信前调用 SSL_Initialize() 函数初始化 SSL 全局环境参数,并确保方法返回成功
  31. 2. 使用 HPSocket 组件执行通信(参考:HPSocket.h)
  32. 3. 通信结束后调用 SSL_Cleanup() 函数清理 SSL 全局运行环境
  33. 方法二:
  34. --------------------------------------------------------------------------------------
  35. 0. 应用程序包含 HPSocket-SSL.h 头文件
  36. 1. 创建一个全局唯一 CHPSSLInitializer 对象,通过该对象的构造函数初始化 SSL 全局环境参数
  37. 2. 使用 HPSocket 组件执行通信(参考:HPSocket.h)
  38. 3. 通信结束后通过 CHPSSLInitializer 对象的析构函数清理 SSL 全局运行环境
  39. Release:
  40. <-- 动态链接库 -->
  41. 1. x86/HPSocket-SSL.dll - (32位/MBCS/Release)
  42. 2. x86/HPSocket-SSL_D.dll - (32位/MBCS/DeBug)
  43. 3. x86/HPSocket-SSL_U.dll - (32位/UNICODE/Release)
  44. 4. x86/HPSocket-SSL_UD.dll - (32位/UNICODE/DeBug)
  45. 5. x64/HPSocket-SSL.dll - (64位/MBCS/Release)
  46. 6. x64/HPSocket-SSL_D.dll - (64位/MBCS/DeBug)
  47. 7. x64/HPSocket-SSL_U.dll - (64位/UNICODE/Release)
  48. 8. x64/HPSocket-SSL_UD.dll - (64位/UNICODE/DeBug)
  49. <-- 静态链接库 -->
  50. !!注意!!:使用 HPSocket 静态库时,需要在工程属性中定义预处理宏 -> HPSOCKET_STATIC_LIB
  51. 1. x86/static/HPSocket-SSL.lib - (32位/MBCS/Release)
  52. 2. x86/static/HPSocket-SSL_D.lib - (32位/MBCS/DeBug)
  53. 3. x86/static/HPSocket-SSL_U.lib - (32位/UNICODE/Release)
  54. 4. x86/static/HPSocket-SSL_UD.lib - (32位/UNICODE/DeBug)
  55. 5. x64/static/HPSocket-SSL.lib - (64位/MBCS/Release)
  56. 6. x64/static/HPSocket-SSL_D.lib - (64位/MBCS/DeBug)
  57. 7. x64/static/HPSocket-SSL_U.lib - (64位/UNICODE/Release)
  58. 8. x64/static/HPSocket-SSL_UD.lib - (64位/UNICODE/DeBug)
  59. ******************************************************************************/
  60. #pragma once
  61. #ifndef _SSL_SUPPORT
  62. #define _SSL_SUPPORT
  63. #endif
  64. #include "HPSocket.h"
  65. /*****************************************************************************************************************************************************/
  66. /******************************************************************** SSL Exports ********************************************************************/
  67. /*****************************************************************************************************************************************************/
  68. /**************************************************/
  69. /************** HPSocket-SSL 导出函数 **************/
  70. // 创建 SSL ITcpServer 对象
  71. HPSOCKET_API ITcpServer* HP_Create_SSLServer(ITcpServerListener* pListener);
  72. // 创建 SSL ITcpAgent 对象
  73. HPSOCKET_API ITcpAgent* HP_Create_SSLAgent(ITcpAgentListener* pListener);
  74. // 创建 SSL ITcpClient 对象
  75. HPSOCKET_API ITcpClient* HP_Create_SSLClient(ITcpClientListener* pListener);
  76. // 创建 SSL ITcpPullServer 对象
  77. HPSOCKET_API ITcpPullServer* HP_Create_SSLPullServer(ITcpServerListener* pListener);
  78. // 创建 SSL ITcpPullAgent 对象
  79. HPSOCKET_API ITcpPullAgent* HP_Create_SSLPullAgent(ITcpAgentListener* pListener);
  80. // 创建 SSL ITcpPullClient 对象
  81. HPSOCKET_API ITcpPullClient* HP_Create_SSLPullClient(ITcpClientListener* pListener);
  82. // 创建 SSL ITcpPackServer 对象
  83. HPSOCKET_API ITcpPackServer* HP_Create_SSLPackServer(ITcpServerListener* pListener);
  84. // 创建 SSL ITcpPackAgent 对象
  85. HPSOCKET_API ITcpPackAgent* HP_Create_SSLPackAgent(ITcpAgentListener* pListener);
  86. // 创建 SSL ITcpPackClient 对象
  87. HPSOCKET_API ITcpPackClient* HP_Create_SSLPackClient(ITcpClientListener* pListener);
  88. // 销毁 SSL ITcpServer 对象
  89. HPSOCKET_API void HP_Destroy_SSLServer(ITcpServer* pServer);
  90. // 销毁 SSL ITcpAgent 对象
  91. HPSOCKET_API void HP_Destroy_SSLAgent(ITcpAgent* pAgent);
  92. // 销毁 SSL ITcpClient 对象
  93. HPSOCKET_API void HP_Destroy_SSLClient(ITcpClient* pClient);
  94. // 销毁 SSL ITcpPullServer 对象
  95. HPSOCKET_API void HP_Destroy_SSLPullServer(ITcpPullServer* pServer);
  96. // 销毁 SSL ITcpPullAgent 对象
  97. HPSOCKET_API void HP_Destroy_SSLPullAgent(ITcpPullAgent* pAgent);
  98. // 销毁 SSL ITcpPullClient 对象
  99. HPSOCKET_API void HP_Destroy_SSLPullClient(ITcpPullClient* pClient);
  100. // 销毁 SSL ITcpPackServer 对象
  101. HPSOCKET_API void HP_Destroy_SSLPackServer(ITcpPackServer* pServer);
  102. // 销毁 SSL ITcpPackAgent 对象
  103. HPSOCKET_API void HP_Destroy_SSLPackAgent(ITcpPackAgent* pAgent);
  104. // 销毁 SSL ITcpPackClient 对象
  105. HPSOCKET_API void HP_Destroy_SSLPackClient(ITcpPackClient* pClient);
  106. // SSL ITcpServer 对象创建器
  107. struct SSLServer_Creator
  108. {
  109. static ITcpServer* Create(ITcpServerListener* pListener)
  110. {
  111. return HP_Create_SSLServer(pListener);
  112. }
  113. static void Destroy(ITcpServer* pServer)
  114. {
  115. HP_Destroy_SSLServer(pServer);
  116. }
  117. };
  118. // SSL ITcpAgent 对象创建器
  119. struct SSLAgent_Creator
  120. {
  121. static ITcpAgent* Create(ITcpAgentListener* pListener)
  122. {
  123. return HP_Create_SSLAgent(pListener);
  124. }
  125. static void Destroy(ITcpAgent* pAgent)
  126. {
  127. HP_Destroy_SSLAgent(pAgent);
  128. }
  129. };
  130. // SSL ITcpClient 对象创建器
  131. struct SSLClient_Creator
  132. {
  133. static ITcpClient* Create(ITcpClientListener* pListener)
  134. {
  135. return HP_Create_SSLClient(pListener);
  136. }
  137. static void Destroy(ITcpClient* pClient)
  138. {
  139. HP_Destroy_SSLClient(pClient);
  140. }
  141. };
  142. // SSL ITcpPullServer 对象创建器
  143. struct SSLPullServer_Creator
  144. {
  145. static ITcpPullServer* Create(ITcpServerListener* pListener)
  146. {
  147. return HP_Create_SSLPullServer(pListener);
  148. }
  149. static void Destroy(ITcpPullServer* pServer)
  150. {
  151. HP_Destroy_SSLPullServer(pServer);
  152. }
  153. };
  154. // SSL ITcpPullAgent 对象创建器
  155. struct SSLPullAgent_Creator
  156. {
  157. static ITcpPullAgent* Create(ITcpAgentListener* pListener)
  158. {
  159. return HP_Create_SSLPullAgent(pListener);
  160. }
  161. static void Destroy(ITcpPullAgent* pAgent)
  162. {
  163. HP_Destroy_SSLPullAgent(pAgent);
  164. }
  165. };
  166. // SSL ITcpPullClient 对象创建器
  167. struct SSLPullClient_Creator
  168. {
  169. static ITcpPullClient* Create(ITcpClientListener* pListener)
  170. {
  171. return HP_Create_SSLPullClient(pListener);
  172. }
  173. static void Destroy(ITcpPullClient* pClient)
  174. {
  175. HP_Destroy_SSLPullClient(pClient);
  176. }
  177. };
  178. // SSL ITcpPackServer 对象创建器
  179. struct SSLPackServer_Creator
  180. {
  181. static ITcpPackServer* Create(ITcpServerListener* pListener)
  182. {
  183. return HP_Create_SSLPackServer(pListener);
  184. }
  185. static void Destroy(ITcpPackServer* pServer)
  186. {
  187. HP_Destroy_SSLPackServer(pServer);
  188. }
  189. };
  190. // SSL ITcpPackAgent 对象创建器
  191. struct SSLPackAgent_Creator
  192. {
  193. static ITcpPackAgent* Create(ITcpAgentListener* pListener)
  194. {
  195. return HP_Create_SSLPackAgent(pListener);
  196. }
  197. static void Destroy(ITcpPackAgent* pAgent)
  198. {
  199. HP_Destroy_SSLPackAgent(pAgent);
  200. }
  201. };
  202. // SSL ITcpPackClient 对象创建器
  203. struct SSLPackClient_Creator
  204. {
  205. static ITcpPackClient* Create(ITcpClientListener* pListener)
  206. {
  207. return HP_Create_SSLPackClient(pListener);
  208. }
  209. static void Destroy(ITcpPackClient* pClient)
  210. {
  211. HP_Destroy_SSLPackClient(pClient);
  212. }
  213. };
  214. // SSL ITcpServer 对象智能指针
  215. typedef CHPSocketPtr<ITcpServer, ITcpServerListener, SSLServer_Creator> CSSLServerPtr;
  216. // SSL ITcpAgent 对象智能指针
  217. typedef CHPSocketPtr<ITcpAgent, ITcpAgentListener, SSLAgent_Creator> CSSLAgentPtr;
  218. // SSL ITcpClient 对象智能指针
  219. typedef CHPSocketPtr<ITcpClient, ITcpClientListener, SSLClient_Creator> CSSLClientPtr;
  220. // SSL ITcpPullServer 对象智能指针
  221. typedef CHPSocketPtr<ITcpPullServer, ITcpServerListener, SSLPullServer_Creator> CSSLPullServerPtr;
  222. // SSL ITcpPullAgent 对象智能指针
  223. typedef CHPSocketPtr<ITcpPullAgent, ITcpAgentListener, SSLPullAgent_Creator> CSSLPullAgentPtr;
  224. // SSL ITcpPullClient 对象智能指针
  225. typedef CHPSocketPtr<ITcpPullClient, ITcpClientListener, SSLPullClient_Creator> CSSLPullClientPtr;
  226. // SSL ITcpPackServer 对象智能指针
  227. typedef CHPSocketPtr<ITcpPackServer, ITcpServerListener, SSLPackServer_Creator> CSSLPackServerPtr;
  228. // SSL ITcpPackAgent 对象智能指针
  229. typedef CHPSocketPtr<ITcpPackAgent, ITcpAgentListener, SSLPackAgent_Creator> CSSLPackAgentPtr;
  230. // SSL ITcpPackClient 对象智能指针
  231. typedef CHPSocketPtr<ITcpPackClient, ITcpClientListener, SSLPackClient_Creator> CSSLPackClientPtr;
  232. /*****************************************************************************************************************************************************/
  233. /******************************************************************** HTTPS Exports ******************************************************************/
  234. /*****************************************************************************************************************************************************/
  235. // 创建 IHttpServer 对象
  236. HPSOCKET_API IHttpServer* HP_Create_HttpsServer(IHttpServerListener* pListener);
  237. // 创建 IHttpAgent 对象
  238. HPSOCKET_API IHttpAgent* HP_Create_HttpsAgent(IHttpAgentListener* pListener);
  239. // 创建 IHttpClient 对象
  240. HPSOCKET_API IHttpClient* HP_Create_HttpsClient(IHttpClientListener* pListener);
  241. // 销毁 IHttpServer 对象
  242. HPSOCKET_API void HP_Destroy_HttpsServer(IHttpServer* pServer);
  243. // 销毁 IHttpAgent 对象
  244. HPSOCKET_API void HP_Destroy_HttpsAgent(IHttpAgent* pAgent);
  245. // 销毁 IHttpClient 对象
  246. HPSOCKET_API void HP_Destroy_HttpsClient(IHttpClient* pClient);
  247. // IHttpServer 对象创建器
  248. struct HttpsServer_Creator
  249. {
  250. static IHttpServer* Create(IHttpServerListener* pListener)
  251. {
  252. return HP_Create_HttpsServer(pListener);
  253. }
  254. static void Destroy(IHttpServer* pServer)
  255. {
  256. HP_Destroy_HttpsServer(pServer);
  257. }
  258. };
  259. // IHttpAgent 对象创建器
  260. struct HttpsAgent_Creator
  261. {
  262. static IHttpAgent* Create(IHttpAgentListener* pListener)
  263. {
  264. return HP_Create_HttpsAgent(pListener);
  265. }
  266. static void Destroy(IHttpAgent* pAgent)
  267. {
  268. HP_Destroy_HttpsAgent(pAgent);
  269. }
  270. };
  271. // IHttpClient 对象创建器
  272. struct HttpsClient_Creator
  273. {
  274. static IHttpClient* Create(IHttpClientListener* pListener)
  275. {
  276. return HP_Create_HttpsClient(pListener);
  277. }
  278. static void Destroy(IHttpClient* pClient)
  279. {
  280. HP_Destroy_HttpsClient(pClient);
  281. }
  282. };
  283. // IHttpServer 对象智能指针
  284. typedef CHPSocketPtr<IHttpServer, IHttpServerListener, HttpsServer_Creator> CHttpsServerPtr;
  285. // IHttpAgent 对象智能指针
  286. typedef CHPSocketPtr<IHttpAgent, IHttpAgentListener, HttpsAgent_Creator> CHttpsAgentPtr;
  287. // IHttpClient 对象智能指针
  288. typedef CHPSocketPtr<IHttpClient, IHttpClientListener, HttpsClient_Creator> CHttpsClientPtr;
  289. /*****************************************************************************************************************************************************/
  290. /*************************************************************** Global Function Exports *************************************************************/
  291. /*****************************************************************************************************************************************************/
  292. /**************************************************/
  293. /****************** SSL 初始化器 ******************/
  294. /*
  295. * 名称:初始化 SSL 全局环境参数
  296. * 描述:SSL 全局环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  297. *
  298. * 参数: enSessionMode -- SSL 工作模式(参考 EnSSLSessionMode)
  299. * iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  300. * lpszPemCertFile -- 证书文件(客户端可选)
  301. * lpszPemKeyFile -- 私钥文件(客户端可选)
  302. * lpszKeyPasswod -- 私钥密码(没有密码则为空)
  303. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证或客户端可选)
  304. *
  305. * 返回值: TRUE -- 成功
  306. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  307. */
  308. HPSOCKET_API BOOL HP_SSL_Initialize(EnSSLSessionMode enSessionMode, int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr);
  309. /*
  310. * 名称:清理 SSL 全局运行环境
  311. * 描述:清理 SSL 全局运行环境,回收 SSL 相关内存
  312. * 1、应用程序退出时会自动调用本方法
  313. * 2、当要重新设置 SSL 全局环境参数时,需要先调用本方法清理原先的环境参数
  314. *
  315. * 参数: 无
  316. *
  317. * 返回值:无
  318. */
  319. HPSOCKET_API void HP_SSL_Cleanup();
  320. /*
  321. * 名称:清理线程局部环境 SSL 资源
  322. * 描述:任何一个操作 SSL 的线程,在通信结束时都需要清理线程局部环境 SSL 资源
  323. * 1、主线程和 HP-Socket 工作线程在通信结束时会自动清理线程局部环境 SSL 资源。因此,一般情况下不必手工调用本方法
  324. * 2、特殊情况下,当自定义线程参与 HP-Socket 通信操作并检查到 SSL 内存泄漏时,需在每次通信结束时自定义线程调用本方法
  325. *
  326. * 参数: dwThreadID -- 线程 ID(0:当前线程)
  327. *
  328. * 返回值:无
  329. */
  330. HPSOCKET_API void HP_SSL_RemoveThreadLocalState(DWORD dwThreadID = 0);
  331. /* 检查 SSL 全局运行环境是否初始化完成 */
  332. HPSOCKET_API BOOL HP_SSL_IsValid();
  333. class CHPSSLInitializer
  334. {
  335. public:
  336. CHPSSLInitializer(EnSSLSessionMode enSessionMode, int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr, BOOL bNeedClientVerification = FALSE)
  337. {
  338. HP_SSL_Initialize(enSessionMode, iVerifyMode, lpszPemCertFile, lpszPemKeyFile, lpszKeyPasswod, lpszCAPemCertFileOrPath);
  339. }
  340. ~CHPSSLInitializer()
  341. {
  342. HP_SSL_Cleanup();
  343. }
  344. BOOL Reset(EnSSLSessionMode enSessionMode, int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr)
  345. {
  346. HP_SSL_Cleanup();
  347. return HP_SSL_Initialize(enSessionMode, iVerifyMode, lpszPemCertFile, lpszPemKeyFile, lpszKeyPasswod, lpszCAPemCertFileOrPath);
  348. }
  349. void RemoveThreadLocalState(DWORD dwThreadID = 0)
  350. {
  351. HP_SSL_RemoveThreadLocalState(dwThreadID);
  352. }
  353. BOOL IsValid()
  354. {
  355. return HP_SSL_IsValid();
  356. }
  357. DWORD GetErrorCode()
  358. {
  359. return SYS_GetLastError();
  360. }
  361. private:
  362. CHPSSLInitializer(const CHPSSLInitializer&);
  363. CHPSSLInitializer& operator = (const CHPSSLInitializer&);
  364. };