2011-06-06 103 views
2

我有第三方的自簽名證書(.cer)文件。我想在代碼中使用該證書來連接到他們的Web服務(通過HTTPS),而無需在Windows中的我的證書存儲中安裝它。特別是,這樣團隊中的所有其他開發人員不必在本地安裝此證書,以便連接爲他們工作。使用自簽名證書而不安裝在cert store中

有沒有辦法在代碼中做到這一點?它可以使用老式的Web服務客戶端代碼(使用wsdl.exe或VS的添加Web引用)或WCF客戶端代碼(使用svcutil.exe或VS的添加服務引用) - 我們還沒有確定我們想要去哪個方向然而。

我已經試過:

proxy.ClientCertificates.Add(X509Certificate.CreateFromCertFile(@"d:\temp\mycert.cer")); 

與老派的Web服務代碼,沒有運氣 - 它仍然失敗,Could not establish trust relationship for the SSL/TLS secure channel.,直到我真正安裝的證書存儲的證書。同樣的事情:

<identity> 
    <certificate encodedValue="the base64 encoded contents of the file" /> 
</identity> 

在使用WCF客戶端技術的app.config中的端點。

感謝

回答

3

您需要證書的原因是HTTPS。 Web服務通過傳輸安全(HTTPS)進行保護,並且證書不受系統信任。爲了信任證書,常見的方法是將證書安裝到認證存儲。這一切都不是.NET功能 - 它是.NET功能之外的Windows功能。

要信任任意SSL證書.NET提供回調方法,您可以使用自己的代碼來驗證證書:ServicePointManager.ServerCertificateValidationCallback。如果您只從回調中返回true,則您將信任每個證書,但僅用於開發和測試!一旦部署到生產應用程序,應使用來自認證存儲的證書或使用回調中定義的特定驗證(不推薦)。

+0

謝謝。我最終開始接受dev中所有證書的路線。幸運的是,在生產中,證書不是自簽名的,所以我們不會有這個問題。我希望避免這條路線,即使它只是開發,也只是感覺錯誤,但我想我們必須忍受它。 – 2011-06-10 22:41:27

1

.NET不能/不會處理從一個純文本文件中的證書+組合鍵(你在這種情況下需要)。我還沒有找到一種方法來構建一個;它平坦不會讀取證書的明文密鑰。

但是,它將與P12/PFX容器一起工作,即使容器沒有密碼。您甚至可以將其存儲爲編碼字符串,並通過此構造函數重新構建它:http://msdn.microsoft.com/en-us/library/ms148418.aspx

+0

我可能會錯,但由於.cer文件不包含私鑰,我不認爲我能創建一個PFX容器。沒有私鑰還可以完成嗎? – 2011-06-07 00:42:55

+0

檢查 - 您有時會在單個文件中將他們的證書和私鑰看作兩個不連續的部分。 .NEt無法處理它,但它對於像OpenSSL這樣的東西是有效的。但是,如果沒有私鑰,則不能將其用作客戶端證書。 – Joe 2011-06-07 01:00:59