IUSR 對 CertOpenSystemStore() 的權限

IUSR 對 CertOpenSystemStore() 的權限

我的 CGI 應用程式正在嘗試使用 SSPI Schannel 建立與另一台伺服器的 TLS 連線。 http://www.coastrd.com/c-schannel-smtp

握手過程首先檢查「MY」證書儲存中的證書 http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

函數傳回零,GetLastError 也回傳零!我認為這是權限問題。例如,如何在不將 IUSR 提升為管理員的情況下使其運作?

添加

存取使用者憑證需要以特定使用者身分執行,而存取使用者私鑰則需要使用者使用密碼在本機登入,或伺服器啟用委派。

機器憑證可供所有人讀取,但存取私鑰需要管理員權限(或本機使用者),除非您調整 ACL。

添加

在這種情況下,證書沒有限制,但「我的」證書儲存是空的,我不想為此購買證書。

我目前使用的是WS2003。我連接的伺服器是 gmail.com,使用 TLS 發送電子郵件。我的程式碼可以找到證書,但我沒有。在我讀過的文章中,獲得證書、註冊、購買和安裝似乎是一件非常頭痛的事情,否則你只是得到一個臨時解決方案,沒有任何幫助。除非您知道獲取證書的簡單方法,否則這比我想要從 CGI 應用程式發送電子郵件要麻煩得多。還有其他方法嗎?

我非常感謝你的幫助,Joe,但是 30 美元/年 x nServers 不是一個選項。我想知道是否有一種方法可以將任務交給另一個以管理員權限執行的進程,例如服務?我甚至可以創建一個應用程序,計劃從給定資料夾中讀取並發送在那裡找到的任何電子郵件。除此之外,我必須嘗試將 CGI 應用程式提升為管理員。

添加

Goyuix,謝謝你的建議。面臨的挑戰是提供一個獨立的解決方案,而不求助於其他函式庫,如 .NET (60MB) 或 ASP 及其隨之而來的問題。

你是對的,我只需要伺服器身份驗證。我不知道只能驗證一側。您的聲明:“沒有客戶端憑證不應阻止您為 SMTP 建立安全通道。您可能只需要圍繞握手的該部分進行編碼。”事實證明這是解決方案。

這讓我想起了一個古老的水管工笑話。水管工被叫來疏通排水管。他看了一眼,掏出一把錘子,敲了一下管子。他要求支付 180 美元,每 5 分鐘的工作費用為 30 美元,標註費和 150 美元用於了解管道的位置。

謝謝你們倆。這是一個漫長的艱難過程。

答案1

schannel 程式碼嘗試破解「MY」儲存的唯一原因是尋找可用於用戶端身份驗證的潛在證書,作為初始握手的一部分。在您的範例中,我想您實際上只關心伺服器身份驗證(例如,確保您的客戶端正在與它認為的伺服器進行通訊)。沒有用戶端憑證不應阻止您為 SMTP 建立安全通道。您可能只需要圍繞握手的那部分進行編碼。

如果您還需要客戶端身份驗證,那麼您可能必須:

  • 提升 IUSR 帳戶並在機器儲存裝置中安裝證書
  • 更改應用程式集區以其他使用者身份運行並進行戰鬥

至於修復連結的程式碼...好吧 - 我建議嘗試 .NET 框架附帶的 SmtpClient 程式碼(如果可以的話)。它支援加密通信,理論上應該「正常工作」。託管 C++ 是一種選擇嗎?或者更好的是,只需為此編寫一個 ASP.NET 處理程序?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

您可能還想嘗試詢問一些相關的程式碼問題StackOverflow.com,那裡的人也許也能提供幫助。

答案2

最好的選擇see是使用機器證書,並授予IUSR帳戶讀取證書私鑰的權限。這是一個手動步驟,但非常簡單,只需完成一次。

您的情況是否有其他要求會阻止更改憑證權限?


入門指南

首先,您需要一個證書。您可以產生自己的,但根據您想要如何使用它以及驗證它的另一端,您可能需要購買一個。我不會介紹如何產生證書。如果您以前從未使用過證書和證書頒發機構,我建議您先了解它們。

除非您另有評論,否則我假設您使用的是 Windows Server 2003。

1) 將憑證安裝到機器儲存中。轉到開始|運行並進入MMC,得到一個空白的MMC控制台。轉到文件 |新增/刪除管理單元。按一下「新增」按鈕選擇該管理單元。從清單中選擇證書並點擊新增。選擇“電腦帳戶”選項,然後選擇“下一步”、“完成”、“關閉”,最後選擇“確定”。

2) 將憑證匯入Machine Store。展開樹狀並選擇個人資料夾。右鍵單擊“個人”並選擇“所有任務”、“導入”。按照嚮導完成過程。該憑證現在應該位於機器儲存中。

3)調整私鑰權限。在 Windows 2008 上,它被加入到憑證管理員 GUI 中。在 Windows 2003 中,您需要下載Windows Server 2003 資源工具包工具。使用以下命令格式設定權限:

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

其中「LOCAL_MACHINE\My」是本機電腦中的個人憑證存儲,「mycert」是憑證的名稱,USER_ACCOUNT 是將被授予私鑰讀取權限的帳戶。您可以嘗試 IUSR 帳戶,但您可能需要使用“網路服務”,具體取決於您的 CGI 應用程式運行的確切上下文。您需要重新啟動 IIS 才能使變更生效。這WinHttpCertCfg 的文檔涵蓋了它正在做什麼。

您現在應該有權存取私鑰。您仍將使用帶有 MY 標誌的 CertOpenSystemStore。

希望有幫助。


編輯2:

GoDaddy 是一個輕鬆獲得權威機構證書的地方。您只需花費 30 美元即可獲得有效期為 1 年的 SSL 憑證。如果你四處尋找的話,還有其他地方可能會更便宜。做起來並不太難。大多數網站都非常用戶友好,可以輕鬆購買證書。

由於您正在進行相互身份驗證,因此您需要一個具有有效權限的證書,而不僅僅是您可以自己建立的自簽名證書,因為 Gmail 伺服器無法驗證它。

相關內容