2013-01-14 63 views
4

我創建使用的TcpListener代理服務器和TcpClient的客戶端和代理之間和代理服務器和目標服務器之間的通信C#中的TCP代理。這工作真的很好。瞭解服務器/代理/客戶端證書與.NET sslstream

我也有支持SSL和TLS加密通訊。 這個作品幾乎良好。我創建一個從代理到目標服務器與本守則SslStream:

var sslStream = new SslStream(remoteStream, false); 
sslStream.AuthenticateAsClient(state.RemoteHost); 

我創建一個從代理到客戶機的SslStream用下面的代碼:

var sslStream = new SslStream(state.ClientStream, false); 
sslStream.AuthenticateAsServer(certificate, false, SslProtocols.Tls | SslProtocols.Ssl3 | SslProtocols.Ssl2, true); 

該證書是由加載X509Store:

X509Certificate2 certificate; 
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); 
store.Open(OpenFlags.ReadOnly); 
var certificates = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, "CN=localhost", false); 
store.Close(); 

if (certificates.Count == 0) 
{ 
    Console.WriteLine("Server certificate not found..."); 
    return; 
} 
else 
{ 
    certificate = certificates[0]; 
} 

這也適用於如果我強制客戶端手動信任證書。

我的問題是:

  1. 我怎麼能強制(所有)客戶端信任的證書?
  2. 哪種類型的證書對代理服務器上的所有客戶端都有效?
  3. 如果需要,我必須安裝哪種客戶端證書來強制客戶端信任代理?
  4. 如何使用openssl或makecert創建所需類型的代理?

我不想隧道SSL通信投擲代理,因爲我需要讀取和操縱流。

[UPDATE] 是的,我用谷歌和在StackOverflow搜索,我嘗試了一些不同的解決方案沒有任何成功。 我也試過在下面的線程解決方案:

SSLStream example - how do I get certificates that work?

How do I identify my server name for server authentication by client in c#

[UPDATE2] 這是一個非常好的教程建立CA和使用OpenSSL的服務器證書,但它不」 t爲我工作: http://webserver.codeplex.com/wikipage?title=HTTPS&referringTitle=Home

回答

0

沒有一個證書是有效的所有請求。所以我的想法不起作用。 因爲它是不可能產生的每一個域名一個許可證。

但答案比預期的更容易:要解決我的問題,我必須爲每個請求創建一個證書。

所有我需要做的是:

  • 創建一個自簽名的根證書作爲證書頒發機構
    • 在客戶端安裝這個「受信任的根證書頒發機構」存儲。
  • 創建服務器證書與根證書樹即時爲每個傳入的請求
    • 標誌這個證書來設置發行人
    • 我可以緩存證書在文件或系統證書商店如果需要。

(這是完全在提琴手相同)

相關問題