SSL 网页证书的颁发机构证书,是我自己建立的,在用户那里没有放在信任区域。用户运行我的应用程序来访问该 SSL 网页。考虑到易用性,不好要求用户把这个证书导入到信任区域。这样 HttpWebRequest 访问 SSL 网页就要出错。有以下问题:1.是否一定要把颁发机构的证书导入到用户信任区,才可以用HttpWebRequest访问 SSL 呢?2.有没有什么好的工具文件,可以把证书导入到信任区域?我只是想加密传输,为什么非要用户信任我的证书的颁发机构呢?HttpWebRequest 没有机会让我点
信任。

解决方案 »

  1.   

    ClientGetWithSSLVB\clientGETwithSSL.vb  字型大小:  1 2 3 4 5 6 7  C# 原始檔:  CS\clientGETwithSSL.cs    
    VB 原始檔:  VB\clientGETwithSSL.vb    Imports System
    Imports System.Net
    Imports System.IO
    Imports System.TextNamespace Client
        Public class ClientGETssl        Public Shared bShow As Boolean
            Public Shared Sub Main()            Dim args As String ()
                args = Environment.GetCommandLineArgs()            If (args.Length < 2)
                    showusage()
                Else
                    If (args.Length > 2)
                        bShow = false
                    Else
                        bShow = true
                    End If
                    getPage(args(1))
                End If            Console.WriteLine()
                Console.WriteLine("按 Enter 繼續...")
                Console.ReadLine()
            End Sub        public Shared Sub showusage()
                Console.WriteLine("嘗試 GET 一個 URL")
                Console.WriteLine()
                Console.WriteLine("使用方式:")
                Console.WriteLine("ClientGETwithssl URL")
                Console.WriteLine()
                Console.WriteLine("例如:")
                Console.WriteLine("ClientGETwithssl https://www.microsoft.com/net/")
            End Sub        public Shared Sub getPage(url As String)
                Try
                    Dim req As WebRequest
                    Dim result As WebResponse
                    Dim ReceiveStream As Stream
                    Dim encode As Encoding
                    Dim sr As StreamReader                req = WebRequest.Create(url)
                    result = req.GetResponse()
                    ReceiveStream = result.GetResponseStream()
                    encode = System.Text.Encoding.GetEncoding("utf-8")
                    sr = new StreamReader( ReceiveStream, encode )                Console.WriteLine()
                    Console.WriteLine("收到回應資料流")
                    If bShow
                        Dim read(256) As Char
                        Dim count As Integer = sr.Read( read, 0, 256 )                    Console.WriteLine("HTML...")
                        Console.WriteLine()
                        Do While count > 0
                            Dim str As String = new String(read, 0, count)
                            Console.Write(str)
                            count = sr.Read(read, 0, 256)
                        Loop
                        Console.WriteLine("")
                    End If
                Catch Exc As Exception
                    Console.WriteLine()
                    Console.WriteLine("找不到要求的 URI 或格式錯誤")
                End Try
            End Sub
        End Class
    End Namespace
      

  2.   

    PassportIdentity.LoginUser 方法 (String, Int32, Boolean, String, Int32, String, Int32, Boolean, Object)藉由產生 302 重新導向 URL 或藉著初始化 Passport 知感用戶端驗證,來登入使用者。[Visual Basic]
    Overloads Public Function LoginUser( _
       ByVal szRetURL As String, _
       ByVal iTimeWindow As Integer, _
       ByVal fForceLogin As Boolean, _
       ByVal szCOBrandArgs As String, _
       ByVal iLangID As Integer, _
       ByVal strNameSpace As String, _
       ByVal iKPP As Integer, _
       ByVal fUseSecureAuth As Boolean, _
       ByVal oExtraParams As Object _
    ) As Integer[C#]
    public int LoginUser(
       string szRetURL,
       int iTimeWindow,
       bool fForceLogin,
       string szCOBrandArgs,
       int iLangID,
       string strNameSpace,
       int iKPP,
       bool fUseSecureAuth,
       object oExtraParams
    );[C++]
    public: int LoginUser(
       String* szRetURL,
       int iTimeWindow,
       bool fForceLogin,
       String* szCOBrandArgs,
       int iLangID,
       String* strNameSpace,
       int iKPP,
       bool fUseSecureAuth,
       Object* oExtraParams
    );[JScript]
    public function LoginUser(
       szRetURL : String,
       iTimeWindow : int,
       fForceLogin : Boolean,
       szCOBrandArgs : String,
       iLangID : int,
       strNameSpace : String,
       iKPP : int,
       fUseSecureAuth : Boolean,
       oExtraParams : Object
    ) : int;參數
    szRetURL 
    URL,是在登入完成之後,登入伺服器應該將使用者重新導向到該 URL。傳遞 Null 參考 (在 Visual Basic 為 Nothing) ,指示 Passport 應該使用預設值。 
    iTimeWindow 
    時間值,以秒為單位。傳遞 -1,指示 Passport 應該使用預設值。 
    fForceLogin 
    若要讓登入伺服器將 iTimeWindow 參數與自從使用者上次登入的時間作比較,則為 true ;若要讓登入伺服器將 iTimeWindow 與上次票證更新的時間作比較,則為 false 。傳遞 -1,指示 Passport 應該使用預設值。 
    szCOBrandArgs 
    字串,指定將變數做為查詢字串變數,附加至參加者 Cobranding Template 指令碼頁的 URL。傳遞 Null 參考 (在 Visual Basic 為 Nothing) ,指示 Passport 應該使用預設值。 
    iLangID 
    地區設定識別項 (LCID),指定登入網頁中應該要顯示的語言的。傳遞 -1,指示 Passport 應該使用預設值。 
    strNameSpace 
    定義域命名空間,您要將使用者導向此而不使用 Passports 來登錄。指定的名稱空間在 Partner.xml 元件設定文件 (CCD) 中以「定義域名稱」項目出現。典型的預設命名空間是「passport.com」。傳遞 Null 參考 (在 Visual Basic 為 Nothing) ,指示 Passport 應該使用預設值。 
    iKPP 
    傳遞 -1,指示 Passport 應該使用預設值。只有在實作兒童 Passport 服務時這個參數才有關;然而,兒童 Passport 服務目前不支援使用這個方法。 
    fUseSecureAuth 
    SSL 簽入在目前版本的登入伺服器中無法做為選項使用。Passport 管理員方法包含 SSL 登入參數,而且它們可能是語法的必要項,但是目前伺服器會忽略它們。檢查 Passport 網站是否更新 SSL 登入的狀態。傳遞 -1,指示 Passport 應該使用預設值。 
    oExtraParams 
    要直接插入挑戰驗證標頭中的名稱值配對,尤其是 Passport 感知的驗證互動。傳遞 Null 參考 (在 Visual Basic 為 Nothing) ,指示 Passport 應該使用預設值。 
    傳回值
    整數結果程式碼。備註
    oExtraParams 參數目前主要的目的是將值傳遞給 cbtxt 變數。 cbtxt 是用來指定 Passport 感知應用程式之認證管理員對話方塊中的可自訂文字,而且通常是用來辨識這個驗證來特別做為 Passport 驗證。Cbtxt= 之後的值應該是有引號的字串,例如 cbtxt= "Logon to Passport"。如需詳細資訊,請到 MSDN Library (http://msdn.microsoft.com/library) 中參閱 Passport SDK 文件中的 IPassportManager2.LoginUser。需求
    平台: Windows 2000, Windows XP Professional, Windows Server 2003 系列請參閱
    PassportIdentity 類別 | PassportIdentity 成員 | System.Web.Security 命名空間 | PassportIdentity.LoginUser 多載清單 | PassportIdentity 成員 (Visual J# 語法) | Managed Extensions for C++ 程式設計
      

  3.   

    谢谢 zzzsssccc(今天正为明天后悔) ,你的代码还是建立在该 SSL 链接的服务器证书的认证机构,已经是本地用户信任的认证机构。如果不信任服务器证书的认证机构,在这一行就会出错:
                    result = req.GetResponse()
      

  4.   

    WebRequest 和 WebResponse 類別使用 Secure Sockets Layer (SSL) 類別自動與支援 SSL 的主機通訊。是否要使用 SSL 由 WebRequest 類別根據指定給它的 URI 來決定。如果 URI 的開頭是「https:」,會使用 SSL;如果 URI 是以 「http:」作為開頭,就不會使用 SSL。下列範例說明 SSL 的使用。[Visual Basic]
    Dim MyURI As String = "https://www.contoso.com/"
    Dim Wreq As WebRequest = WebRequest.Create(MyURI)[C#]
    String MyURI = "https://www.contoso.com/";
    WebRequest WReq = WebRequest.Create(MyURI);
      

  5.   

    System.Net 類別支援各種用戶端驗證 (Authentication) 機制,包括標準 Internet 驗證方法如基本的、摘要式、交涉的、NTLM 和 Kerberos 驗證,還有您可以建立的自訂方法。驗證憑證儲存在 NetworkCredential 和 CredentialCache 類別中,它們會實作 ICredentials 介面。當這些類別的其中一個查詢憑證時,它傳回 NetworkCredential 類別的執行個體 (Instance)。驗證程序受 AuthenticationManager 類別管理,而實際的驗證程序由實作 IAuthenticationModule 介面的驗證模組類別執行。您必須在自訂驗證模組可以使用之前以 AuthenticationManager 註冊它;模組在預設情況下註冊為基本的、摘要式、交涉的、NTLM 和 Kerberos 驗證方法。NetworkCredential 儲存一組與 URI 所識別的單一網際網路資源相關的憑證,並在對 GetCredential 方法的任何呼叫的回應中傳回它們。NetworkCredential 類別基本上被使用於存取限定數目的網際網路資源的應用程式,或在所有情況中使用同一組憑證的應用程式。CredentialCache 類別儲存各種 Web 資源憑證的集合。呼叫 GetCredential 方法時,CredentialCache 傳回正確的憑證組,如 Web 資源 URI 和要求驗證配置所決定的。以不同驗證配置使用各種網際網路資源的應用程式可從使用 CredentialCache 類別得到益處,因為它儲存所有憑證並在被要求時提供它們。網際網路資源要求驗證時,WebRequest.GetResponse 方法將 WebRequest 與憑證的要求一起送出至 AuthenticationManager。接著依照下列程序驗證要求: AuthenticationManager 依照它們註冊的順序,在每一個註冊的驗證模組上呼叫 Authenticate 方法。AuthenticationManager 使用第一個不傳回 null 的模組來實行驗證程序。程序的細節因驗證模組涉及的類型而異。 
    當驗證程序完成時,驗證模組會將 Authorization 執行個體傳回給包含存取網際網路資源所需資訊的 WebRequest。 
    某些驗證配置不用事先要求資源即可以驗證使用者。應用程式可藉著以資源預先驗證 (Preauthenticate) 使用者來節省時間,這樣能減少至少一個到伺服器的來回行程。或者,它可以在程式啟動期間執行驗證,以便能更快速回應後來的使用者。能夠使用預先驗證的驗證配置設定 CanPreAuthenticate 屬性為 true。
      

  6.   

    使用 System.Net 命名空間 (Namespace) 的應用程式的 Internet 安全性由 WebPermission 和 SocketPermission 類別來提供。WebPermission 類別會控制應用程式的權限,以從 URI 要求資料或服務網際網路的 URI。SocketPermission 類別會控制應用程式的權限,在本機通訊埠上使用 Socket 來接受資料,或根據主機、通訊埠編號和通訊端的傳輸通訊協定來聯繫另一位址上使用傳輸通訊協定的遠端裝置。您要使用哪一個使用權限類別取決於您的應用程式類型。使用 WebRequest 的應用程式和其子代 (Descendant) 應該使用WebPermission 類別來管理使用權限。使用通訊端層級存取的應用程式應該使用 SocketPermission 類別來管理使用權限。WebPermission 和 SocketPermission 定義兩種使用權限:接受和連接。接受會授與應用程式權限,以回答來自另一方輸入的連接。連接則授與應用程式權限,以啟始對另一方的連接。對於 SocketPermission 執行個體 (Instance) 而言,接受意謂著應用程式可以在本機傳輸位址上接受輸入的連接;連接意謂著應用程式可以連接至某個遠端 (或本機) 傳輸位址。對於 WebPermission 執行個體而言,接受意謂著應用程式可以匯出 WebPermission 控制的 URI 到全世界;連接意謂著應用程式可以存取那個 URI (不論是遠端或本機)。