私は現在、HTTPS をサポートする C# 中間プロキシ サーバーを構築しており、やや厄介な方法で証明書を再バンドルしていますが、それがこのプロジェクトに必要なものです。
BouncyCastle を使用して CA 証明書と HTTP に適した証明書を生成していますがSslStream
、証明書署名アルゴリズムではない証明書を受け入れないことに気付きました。MD5WithRSA
これは、Google Chrome と Firefox が単にページを開くことを拒否することを意味します。SHA1WithRSA
署名アルゴリズムを期待しています。
SSL ストリームを生成して認証するために使用している完全なコード ブロックはhttp://cdn.afterlifelochie.rocket-it.com.au/temp/proxy-https.c-sharp.txtにありますが、これは短いものですエラーを返すスニペット。
sslStream.AuthenticateAsServer(
cert, false, SslProtocols.Default | SslProtocols.Tls |
SslProtocols.Ssl3 | SslProtocols.Ssl2, false);
CA 秘密鍵と HTTPS 秘密鍵を含む、チェーン内の CA で署名された HTTPS 証明書はどこにありますか?cert
次のエラーが返されます。
SSL-Exception: A call to SSPI failed, see inner exception.
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken messag
e, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToke
n message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, A
syncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 coun
t, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes
, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocol
Request asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToke
n message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, A
syncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 coun
t, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes
, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocol
Request asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToke
n message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, A
syncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 coun
t, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes
, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocol
Request asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToke
n message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, A
syncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 coun
t, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes
, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocol
Request asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byt
e[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyRes
ult)
at System.Net.Security.SslStream.AuthenticateAsServer(X509Certificate serverC
ertificate, Boolean clientCertificateRequired, SslProtocols enabledSslProtocols,
Boolean checkCertificateRevocation)
at HTTPProxyServer.ProxyServer.DoHttpProcessing(TcpClient client) in C:\Users
\AfterLifeLochie\Desktop\C#Proxy\ProxyServer.cs:line 324
SSL-Inner-Exception: The specified data could not be decrypted
ただし、76 行目のパラメーターSetSignatureAlgorithm(String Method)
をMD5withRSA
fromに変更するSHA1WithRSA
と、すべてが正常に機能し、すべてのデータが適切に転送されます (Google Chrome の過度に安全な偏執的な「続行できません」というメッセージを除く)。
これはSslStream
、証明書チェーン、認証方法、または見落としているその他の問題ですか?
更新 1: Windows 2008R2 Active Directory Certificate Server インスタンスから証明書と CA 証明書を取得しました。どうやらその証明書を使用するとうまくいくので、何が間違っているのかわかりません。証明書のチェーン化、物理的な生成、または重要なサブジェクト、使用法、または拡張/拡張使用法のいずれかが欠けていることが原因であると想定しています。
更新 2:ソフトウェアが新しいキーを生成するたびに CA 証明書が変更されていることに気付きました。これはその後変更されてロックされており、拇印とデータが変更されていないことがわかります。それでも取得しSSL-Inner-Exception: The specified data could not be decrypted
ます。