我有一個完全可操作的系統,其中基於openssl的客戶端與openssl服務器交互。每個客戶都有自己的證書,並由服務器驗證。使用openssl(X509,pem)生成了證書。他們是自簽名的。SslStream客戶端無法與stunnel服務器完成握手
我現在想寫一個基於SslStream的測試客戶端。我使用了SslStream類documentation中的客戶端示例。
我的SslStream客戶端無法完成握手。 stunnel抱怨客戶沒有發送證書。這在Wireshark中證實(握手消息中的證書長度:0)。
我的客戶端顯示以下異常:
內部異常:接收到的消息是意外或嚴重 格式化
這是我如何加載我的證書:
X509Certificate cert = new X509Certificate2(filename, password);
X509CertificateCollection certColl = new X509CertificateCollection();
certColl.Add(cert);
我嘗試檢索證書的各種屬性(例如:GetSerialNumberString())。有用。 Verify方法返回false。這是我要調查的下一件事。
如何設置我的SslStream似乎並不重要(相同的結果):
sslStream.AuthenticateAsClient(serverName);
SslStream sslStream = new SslStream(
client.GetStream(),
false,
new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectLocalCertificate));
同樣的,認證:
sslStream.AuthenticateAsClient(serverName);
sslStream.AuthenticateAsClient(serverName,
certColl,
SslProtocols.Tls,
true);
SelectLocalCertificate
被調用(兩次),並返回我的證書。 ValidateServerCertificate
目前從來沒有被召喚(令我驚訝)。
我該如何調試?如果你能指出我的問題更好。
UPDATE
我添加了一個函數基於所述X509Chain example從文檔以執行鏈驗證。它顯示各種信息的保證書上,其中包括兩個耐人尋味的消息:
Element certificate is valid: False
Element error status length: 1
最後,我真的沒有比我打電話覈實更多細節。
openssl verify cert.pem
的輸出不報告任何異常。
error 18 at 0 depth lookup:self signed certificate
OK
UPDATE
我提取從PEM私有密鑰和證書,以及我生成cert.pfx(PKCS12)。我在個人密鑰存儲中導入cert.pfx時沒有問題。在我的證書詳細信息中,我可以看到一個指示附加私鑰的小圖標。
我修改了我的客戶端以從我的個人存儲中檢索證書。但我得到了同樣的失敗。
對於SSL客戶端驗證,您需要證書和密鑰。您應該檢查PEM文件是否包含這兩個文件,否則您缺少一個重要部分。 – Robert 2012-07-13 17:09:57
PEM包含---- ---- BEGIN CERTIFICATE -----塊下的證書和----- BEGIN RSA PRIVATE KEY -----塊下的私鑰。 – 2012-07-13 18:17:12