开源的socket服务端客户端,支持C# C++

HPSocket-SSL.h 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /*
  2. * Copyright: JessMA Open Source (ldcsaa@gmail.com)
  3. *
  4. * Version : 4.1.3
  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. 应用程序包含 HPTypeDef.h / SocketInterface.h / HPSocket.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. // 创建 IHttpSyncClient 对象
  242. HPSOCKET_API IHttpSyncClient* HP_Create_HttpsSyncClient();
  243. // 销毁 IHttpServer 对象
  244. HPSOCKET_API void HP_Destroy_HttpsServer(IHttpServer* pServer);
  245. // 销毁 IHttpAgent 对象
  246. HPSOCKET_API void HP_Destroy_HttpsAgent(IHttpAgent* pAgent);
  247. // 销毁 IHttpClient 对象
  248. HPSOCKET_API void HP_Destroy_HttpsClient(IHttpClient* pClient);
  249. // 销毁 IHttpSyncClient 对象
  250. HPSOCKET_API void HP_Destroy_HttpsSyncClient(IHttpSyncClient* pClient);
  251. // IHttpServer 对象创建器
  252. struct HttpsServer_Creator
  253. {
  254. static IHttpServer* Create(IHttpServerListener* pListener)
  255. {
  256. return HP_Create_HttpsServer(pListener);
  257. }
  258. static void Destroy(IHttpServer* pServer)
  259. {
  260. HP_Destroy_HttpsServer(pServer);
  261. }
  262. };
  263. // IHttpAgent 对象创建器
  264. struct HttpsAgent_Creator
  265. {
  266. static IHttpAgent* Create(IHttpAgentListener* pListener)
  267. {
  268. return HP_Create_HttpsAgent(pListener);
  269. }
  270. static void Destroy(IHttpAgent* pAgent)
  271. {
  272. HP_Destroy_HttpsAgent(pAgent);
  273. }
  274. };
  275. // IHttpClient 对象创建器
  276. struct HttpsClient_Creator
  277. {
  278. static IHttpClient* Create(IHttpClientListener* pListener)
  279. {
  280. return HP_Create_HttpsClient(pListener);
  281. }
  282. static void Destroy(IHttpClient* pClient)
  283. {
  284. HP_Destroy_HttpsClient(pClient);
  285. }
  286. };
  287. // IHttpSyncClient 对象创建器
  288. struct HttpsSyncClient_Creator
  289. {
  290. static IHttpSyncClient* Create()
  291. {
  292. return HP_Create_HttpsSyncClient();
  293. }
  294. static void Destroy(IHttpSyncClient* pClient)
  295. {
  296. HP_Destroy_HttpsSyncClient(pClient);
  297. }
  298. };
  299. // IHttpServer 对象智能指针
  300. typedef CHPSocketPtr<IHttpServer, IHttpServerListener, HttpsServer_Creator> CHttpsServerPtr;
  301. // IHttpAgent 对象智能指针
  302. typedef CHPSocketPtr<IHttpAgent, IHttpAgentListener, HttpsAgent_Creator> CHttpsAgentPtr;
  303. // IHttpClient 对象智能指针
  304. typedef CHPSocketPtr<IHttpClient, IHttpClientListener, HttpsClient_Creator> CHttpsClientPtr;
  305. // IHttpSyncClient 对象智能指针
  306. typedef CHPSocketPtr<IHttpSyncClient, BOOL, HttpsSyncClient_Creator> CHttpsSyncClientPtr;
  307. /*****************************************************************************************************************************************************/
  308. /*************************************************************** Global Function Exports *************************************************************/
  309. /*****************************************************************************************************************************************************/
  310. /*
  311. * 名称:初始化 SSL 全局环境参数
  312. * 描述:SSL 全局环境参数必须在 SSL 通信组件启动前完成初始化,否则启动失败
  313. *
  314. * 参数: enSessionMode -- SSL 工作模式(参考 EnSSLSessionMode)
  315. * iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  316. * lpszPemCertFile -- 证书文件(客户端可选)
  317. * lpszPemKeyFile -- 私钥文件(客户端可选)
  318. * lpszKeyPasswod -- 私钥密码(没有密码则为空)
  319. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证或客户端可选)
  320. * fnServerNameCallback -- SNI 回调函数指针(可选,只用于服务端)
  321. *
  322. * 返回值: TRUE -- 成功
  323. * FALSE -- 失败,可通过 SYS_GetLastError() 获取失败原因
  324. */
  325. 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, Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr);
  326. /*
  327. * 名称:增加 SNI 主机证书(只用于服务端)
  328. * 描述:SSL 服务端在 Initialize() 成功后可以调用本方法增加多个 SNI 主机证书
  329. *
  330. * 参数: iVerifyMode -- SSL 验证模式(参考 EnSSLVerifyMode)
  331. * lpszPemCertFile -- 证书文件
  332. * lpszPemKeyFile -- 私钥文件
  333. * lpszKeyPasswod -- 私钥密码(没有密码则为空)
  334. * lpszCAPemCertFileOrPath -- CA 证书文件或目录(单向验证可选)
  335. *
  336. * 返回值: 正数 -- 成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机
  337. * 负数 -- 失败,可通过 SYS_GetLastError() 获取失败原因
  338. */
  339. HPSOCKET_API int HP_SSL_AddServerContext(int iVerifyMode, LPCTSTR lpszPemCertFile, LPCTSTR lpszPemKeyFile, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr);
  340. /*
  341. * 名称:清理 SSL 全局运行环境
  342. * 描述:清理 SSL 全局运行环境,回收 SSL 相关内存
  343. * 1、应用程序退出时会自动调用本方法
  344. * 2、当要重新设置 SSL 全局环境参数时,需要先调用本方法清理原先的环境参数
  345. *
  346. * 参数: 无
  347. *
  348. * 返回值:无
  349. */
  350. HPSOCKET_API void HP_SSL_Cleanup();
  351. /*
  352. * 名称:清理线程局部环境 SSL 资源
  353. * 描述:任何一个操作 SSL 的线程,在通信结束时都需要清理线程局部环境 SSL 资源
  354. * 1、主线程和 HP-Socket 工作线程在通信结束时会自动清理线程局部环境 SSL 资源。因此,一般情况下不必手工调用本方法
  355. * 2、特殊情况下,当自定义线程参与 HP-Socket 通信操作并检查到 SSL 内存泄漏时,需在每次通信结束时自定义线程调用本方法
  356. *
  357. * 参数: dwThreadID -- 线程 ID(0:当前线程)
  358. *
  359. * 返回值:无
  360. */
  361. HPSOCKET_API void HP_SSL_RemoveThreadLocalState(DWORD dwThreadID = 0);
  362. /* 检查 SSL 全局运行环境是否初始化完成 */
  363. HPSOCKET_API BOOL HP_SSL_IsValid();
  364. class CHPSSLInitializer
  365. {
  366. public:
  367. CHPSSLInitializer(EnSSLSessionMode enSessionMode, int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr, Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr)
  368. {
  369. HP_SSL_Initialize(enSessionMode, iVerifyMode, lpszPemCertFile, lpszPemKeyFile, lpszKeyPasswod, lpszCAPemCertFileOrPath, fnServerNameCallback);
  370. }
  371. ~CHPSSLInitializer()
  372. {
  373. HP_SSL_Cleanup();
  374. }
  375. BOOL Reset(EnSSLSessionMode enSessionMode, int iVerifyMode = SSL_VM_NONE, LPCTSTR lpszPemCertFile = nullptr, LPCTSTR lpszPemKeyFile = nullptr, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr, Fn_SNI_ServerNameCallback fnServerNameCallback = nullptr)
  376. {
  377. HP_SSL_Cleanup();
  378. return HP_SSL_Initialize(enSessionMode, iVerifyMode, lpszPemCertFile, lpszPemKeyFile, lpszKeyPasswod, lpszCAPemCertFileOrPath, fnServerNameCallback);
  379. }
  380. int AddServerContext(int iVerifyMode, LPCTSTR lpszPemCertFile, LPCTSTR lpszPemKeyFile, LPCTSTR lpszKeyPasswod = nullptr, LPCTSTR lpszCAPemCertFileOrPath = nullptr)
  381. {
  382. return HP_SSL_AddServerContext(iVerifyMode, lpszPemCertFile, lpszPemKeyFile, lpszKeyPasswod, lpszCAPemCertFileOrPath);
  383. }
  384. void RemoveThreadLocalState(DWORD dwThreadID = 0)
  385. {
  386. HP_SSL_RemoveThreadLocalState(dwThreadID);
  387. }
  388. BOOL IsValid()
  389. {
  390. return HP_SSL_IsValid();
  391. }
  392. DWORD GetErrorCode()
  393. {
  394. return SYS_GetLastError();
  395. }
  396. private:
  397. CHPSSLInitializer(const CHPSSLInitializer&);
  398. CHPSSLInitializer& operator = (const CHPSSLInitializer&);
  399. };