SslStream.AuthenticateAs服务器例外 - 服务器模式 SSL 必须使用具有关联私钥的证书

本文关键字:服务器 关联 私钥 证书 AuthenticateAs 模式 SslStream SSL | 更新日期: 2023-09-27 17:57:06

我正在开发一个类似于CCProxy的代理服务器应用程序。它适用于HTTP,但不适用于HTTPS。在 SslStream 对象上调用 AuthenticateAsServer() 方法时引发异常。我也不知道我是否提供了正确的证书,我不知道如何创建证书。我只是提供了我在线下载的代码附带的证书。这是代码:

 private static void DoHttpProcessing(TcpClient client)
    {
        Stream clientStream = client.GetStream();
        Stream outStream = clientStream; 
        SslStream sslStream = null;
        StreamReader clientStreamReader = new StreamReader(clientStream);
        CacheEntry cacheEntry = null;
        MemoryStream cacheStream = null;
        if (Server.DumpHeaders || Server.DumpPostData || Server.DumpResponseData)
        {
            Monitor.TryEnter(_outputLockObj, TimeSpan.FromMilliseconds(-1.0));
        }
        try
        {
            //read the first line HTTP command
            String httpCmd = clientStreamReader.ReadLine();
            if (String.IsNullOrEmpty(httpCmd))
            {
                clientStreamReader.Close();
                clientStream.Close();
                return;
            }
            //break up the line into three components
            String[] splitBuffer = httpCmd.Split(spaceSplit, 3);
            String method = splitBuffer[0];
            String remoteUri = splitBuffer[1];
            Version version = new Version(1, 0);
            HttpWebRequest webReq;
            HttpWebResponse response = null;
            if (splitBuffer[0].ToUpper() == "CONNECT")
            {
                remoteUri = "https://" + splitBuffer[1];
                while (!String.IsNullOrEmpty(clientStreamReader.ReadLine())) ;
                StreamWriter connectStreamWriter = new StreamWriter(clientStream);
                connectStreamWriter.WriteLine("HTTP/1.0 200 Connection established");
                connectStreamWriter.WriteLine(String.Format("Timestamp: {0}", DateTime.Now.ToString()));
                connectStreamWriter.WriteLine("Proxy-agent: matt-dot-net");
                connectStreamWriter.WriteLine();
                connectStreamWriter.Flush();
                sslStream = new SslStream(clientStream, false);
                try
                {
             // HERE I RECEIVE EXCEPTION
                    sslStream.AuthenticateAsServer(_certificate, false, SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, true);

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    sslStream.Close();
                    clientStreamReader.Close();
                    connectStreamWriter.Close();
                    clientStream.Close();
                    return;
                }//further code goes here...

此外,如果我使用 ssStream.AuthenticateAsClient 方法,而不是 sslStream.AuthenticateAsServer,我会收到带有消息"对 SSPI 的调用失败,请参阅内部异常"的 AuthenticationException,并且 InnerException 给出的消息为"收到的消息是意外的或格式不正确"

当我使用 sslstream 时。AuthenticateAsServer() 方法,我需要为每个新的 HTTPS 主机创建证书并使用此方法传递它。如果我提供自签名证书,则请求成功。但问题是,对于多少新的HTTPS请求,我将手动创建证书并将其分配给AuthenticateAsServer()?

SslStream.AuthenticateAs服务器例外 - 服务器模式 SSL 必须使用具有关联私钥的证书

对于服务器端证书,大多数证书对应于 FQDN(因此 server1.localhost.local),尽管可以有通配符证书 (*.localhost.local)。 使用 AuthenticateAsClient 方法时,这可能是以下两种情况之一:1) 证书没有用于客户端身份验证的扩展密钥用法,或者 2) 您没有传递正确的密码来读取证书/私钥。 为了快速克服这两个障碍,我建议创建一个OpenSSL CA,然后生成一个CA和服务器证书。 有大量关于如何做到这一点的文档,对于以前从未创建过的人来说,应该花 30 分钟的时间......(我还建议将证书导出到 pkcs12 扩展中,以便 CA 与服务器证书链接)。