2012-02-09 84 views
4

我支持通過HTTPS連接到支付網關的傳統ASP應用程序。直到最近還沒有問題。幾天前,最新的更新安裝在服務器上(Windows Server 2003),導致網站中斷。代碼片段如下。無法將HTTPS與ServerXMLHTTP對象配合使用

Dim oHttp 
Dim strResult 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") 
oHttp.setOption(2) = 13056 
oHttp.open "POST", SOAP_ENDPOINT, false 
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8" 
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION 
oHttp.send SOAP_REQUEST 

下面是錯誤對象的轉儲: -

數量:-2147012852 描述:證書才能完成客戶端認證 消息:一個證書才能完成客戶端認證

起初我以爲是因爲支付網關的SSL證書沒有被認證,或者他們需要客戶端證書。我在服務器上的瀏覽器中測試了URL,並且它沒有錯誤地正確顯示,並確認支付網關服務器不需要客戶端證書。

我不知所措。我所做的所有研究都讓我無處可尋。我甚至嘗試#1以下發現: -

Getting XMLHTTP to work with HTTPS

xmlHttp, XML request,asp

最後一個說,一個客戶端證書是由XMLHTTP要求即使服務器並不需要它,並指出知識庫文章關於如何安裝一個,但已經過時並且不起作用。

+1

我在猜測網關的SSL證書現在由不在您的服務器的可信根權限列表中的某個人提供,並且您需要像curl的'CURLOPT_SSL_VERIFYPEER'這樣的參數。如果我找到任何東西,我會回來。 – 2012-02-09 17:19:06

+0

你列出的第一個問題的答案是我正在尋找的,應該爲你工作。 – 2012-02-10 09:58:04

+0

我是系統管理員,他正在藉此手。第一個問題的答案並不能解決我害怕的問題。事實上,該選項已經在上面問題中發佈的代碼中設置。爲了補充這一點,至少有3臺獨立的服務器發生這種情況,最近沒有發現任何配置更改,除非在問題發生後昨天/今天安裝的Windows更新被禁止。之前的最新更新是在11月下旬。 – ThatGraemeGuy 2012-02-10 13:33:43

回答

0

這可能是一個ServerFault.com問題,畢竟如果代碼工作正常,那麼它不是一個編程問題。

但是我會嘗試一些事情。首先嚐試使用ProgID「MSXML2.ServerXMLHTTP.3.0」,在某些情況下,根據使用哪個ProgID實例化組件,MSXML3的行爲將有所不同。也可以從其他來源(例如您的反病毒供應商)(Sophos出現此問題)進行更新,以便打破MSXML安裝。

安裝MSXML6後,另一個要嘗試的ProgID是「MSXML2.ServerXMLHTTP.6.0」。如果問題與MSXML3內核的更新有關,那麼MSXML6內核可能沒有相同的問題。

+0

我曾嘗試使用版本3.0,4.0和6.0,所有這些都給出了相同的錯誤。 – Imraan 2012-02-13 14:31:03

+0

我試圖禁用防病毒,它沒有幫助。 – ThatGraemeGuy 2012-02-14 08:06:56

5

嘗試增加oHttp.setOption 2, 13056

+0

嘗試了這種語法,但仍然沒有運氣 – Imraan 2012-02-13 14:42:22

+1

我們有一個使用MSXML的舊版ASP應用程序,它剛剛被轉移到不同的ISP,並且在嘗試通過HTTPS進行連接時開始出現'錯誤-2147012851:證書授權無效或不正確'。 (通過HTTP連接工作得很好。)在我們的代碼中添加'.setOption 2,13056'已經「解決」了(避免)了這個問題,所以謝謝Zee Tee! – Funka 2012-07-07 00:21:41

+0

很高興這有所幫助。 – 2012-07-07 00:45:02

0

你能否oHttp.setOption嘗試(3)= 如下 「證書存儲名稱/證書的FriendlyName」。我希望這會起作用。

Dim oHttp      
Dim strResult 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") 
oHttp.setOption(2) = 13056 
oHttp.setOption(3) = "certificate store name/friendlyname of certificate" 
oHttp.open "POST", SOAP_ENDPOINT, false 
oHttp.setRequestHeader "Content-Type", "application/soap+xml; charset=utf-8" 
oHttp.setRequestHeader "SOAPAction", SOAP_NS + "/" & SOAP_FUNCTION 
oHttp.send SOAP_REQUEST 
+1

選項3是SXH_OPTION_SELECT_CLIENT_SSL_CERT。據我所知,這是指定一個客戶端證書,當海報說沒有客戶端證書正在使用。你爲什麼認爲增加這些會有所幫助? – 2012-09-05 18:38:28

0

我知道這是一個古老的問題。此問題可能是由於不受支持的密碼套件。 嘗試增加 - TLS_RSA_WITH_AES_128_CBC_SHA AES128-SHA - TLS_RSA_WITH_AES_256_CBC_SHA AES256-SHA

這意味着你必須遵循此KB:http://support.microsoft.com/kb/948963 此更新也很有趣,如果你仍在使用Windows 2003。這將允許使用SHA2連接到網站 - http://support.microsoft.com/kb/968730

請注意,Windows Server 2003的支持將結束2015年7月14日

+0

只是注意到.setOption 2幫助。這不是標記爲答案,而是錯過了答案。在這種情況下,您可以安裝支付網關證書的中間證書和根證書,前提是他們有任何缺失鏈。這可以避免使用SetOption 2 – Sunil 2015-02-23 11:38:52

1

就找到了解決這個已通過測試上:

  • 視窗10(IIS 10)
  • 視窗2012 R2(IIS 8.5)

這是一個客戶問題。正如OP注意到的,MSXML2.ServerXMLHTTP確實要求您在調用用SSL保護的端點(即使端點不需要它)時使用客戶端證書。

在Web服務器上,您需要:

  1. 創建一個客戶端證書
  2. 將權限分配給該證書
  3. 設置證書ServerXMLHTTP對象

上詳細介紹:

1.創建客戶端證書

使用下面的PowerShell命令來創建新的自簽名證書:

New-SelfSignedCertificate -DnsName "ServerXMLHTTP", "ServerXMLHTTP" -CertStoreLocation "cert:\LocalMachine\My" 

注意,此命令創建的證書將只爲1年有效。

2.將權限分配給該證書

使用MMC中,查看計算機帳戶證書存儲: How to: View Certificates with the MMC Snap-in

上面創建的證書可以在證書中找到(本地計算機)\ Personal \ Certificates(「Issued By」和「Issued To」列顯示「ServerXMLHTTP」)。

右鍵單擊ServerXMLHTTP證書,選擇「所有任務」 - >「管理私鑰」,將顯示權限對話框。

添加ASP網站應用程序池正在運行的用戶。默認情況下,它將作爲「ApplicationPoolIdentity」運行,但是您的設置可能使用特定的用戶帳戶。如果應用程序池正在使用ApplicationPoolIdentity,則要添加的用戶名是「IIS AppPool \ APP POOL NAME」,例如, IIS AppPool \ DefaultAppPool

用戶將添加「完全控制」,可以取消選擇。似乎只需要「讀取」權限。點擊「確定」確認權限。

3.設置ServerXMLHTTP對象

在你的ASP代碼上的證書,設置ServerXMLHTTP對象使用上面創建的證書。例如,撥打PayPal獲取訪問令牌:

Dim strAuthToken: strAuthToken = "<Base64 encoded version of ClientId:Secret>" 
Dim oHttp: Set oHttp = Server.CreateObject("MSXML2.ServerXMLHTTP") 

With oHttp 
    Call .Open("POST", "https://api.sandbox.paypal.com/v1/oauth2/token", False) 
    Call .SetOption(3, "LOCAL_MACHINE\My\ServerXMLHTTP") 
    Call .SetRequestHeader("Content-Type", "application/x-www-form-urlencoded") 
    Call .SetRequestHeader("Authorization", "Basic " & strAuthToken) 
    Call .Send("grant_type=client_credentials") 
End With 

希望這仍然有幫助。

相關問題