抄袭下面网站的内容。没有新意。
http://www.pinvoke.net/default.aspx/httpapi.httpsetserviceconfiguration
public static void SetCertificate(string ipAddress, int port, byte[] hash, bool isAdd) { uint retVal = (uint)NOERROR; // initialize http retVal = HttpInitialize(new HTTPAPI_VERSION(1, 0), HTTP_INITIALIZE_CONFIG, IntPtr.Zero); if ((uint)NOERROR != retVal) { throw new Win32Exception(Convert.ToInt32(retVal)); } HTTP_SERVICE_CONFIG_SSL_SET configSslSet = new HTTP_SERVICE_CONFIG_SSL_SET(); HTTP_SERVICE_CONFIG_SSL_KEY configSslKey = new HTTP_SERVICE_CONFIG_SSL_KEY(); HTTP_SERVICE_CONFIG_SSL_PARAM configSslParam = new HTTP_SERVICE_CONFIG_SSL_PARAM(); // set HTTP_SERVICE_CONFIG_SSL_KEY IPAddress ip = IPAddress.Parse(ipAddress); IPEndPoint ipEndPoint = new IPEndPoint(ip, port); SocketAddress socketAddress = ipEndPoint.Serialize(); byte[] socketBytes = new byte[socketAddress.Size]; GCHandle handleSocketAddress = GCHandle.Alloc(socketBytes, GCHandleType.Pinned); for (int i = 0; i < socketAddress.Size; ++i) { socketBytes[i] = socketAddress[i]; } configSslKey.pIpPort = handleSocketAddress.AddrOfPinnedObject(); // set HTTP_SERVICE_CONFIG_SSL_PARAM configSslParam.AppId = Guid.Empty; configSslParam.DefaultCertCheckMode = 0; configSslParam.DefaultFlags = 0; configSslParam.DefaultRevocationFreshnessTime = 0; configSslParam.DefaultRevocationUrlRetrievalTimeout = 0; configSslParam.pSslCertStoreName = null; configSslParam.pSslHash = GCHandle.Alloc(hash, GCHandleType.Pinned).AddrOfPinnedObject(); configSslParam.SslHashLength = hash.Length; // set HTTP_SERVICE_CONFIG_SSL_SET configSslSet.ParamDesc = configSslParam; configSslSet.KeyDesc = configSslKey; // convert Structure To Ptr IntPtr pInputConfigInfo = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET))); Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false); // set or delete if (isAdd) { retVal = HttpSetServiceConfiguration( IntPtr.Zero, HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, pInputConfigInfo, Marshal.SizeOf(configSslSet), IntPtr.Zero); } else { retVal = HttpDeleteServiceConfiguration( IntPtr.Zero, HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, pInputConfigInfo, Marshal.SizeOf(configSslSet), IntPtr.Zero); } // free memory Marshal.FreeCoTaskMem(pInputConfigInfo); // terminate http HttpTerminate(HTTP_INITIALIZE_CONFIG, IntPtr.Zero); if ((uint)NOERROR != retVal) { throw new Win32Exception(Convert.ToInt32(retVal)); } }