2012-07-20 82 views
14

Estoy usando un objeto ServerXMLHTTP para realizar algunas solicitudes http en una secuencia de comandos excel vba.VBA ServerXMLHTTP https solicitud con certificado autofirmado

Pero necesito conectarme a un servidor https que utiliza un certificado SSL autofirmado, por lo que de manera predeterminada recibo el mensaje "La autoridad del certificado no es válida o es incorrecta". ¿Hay alguna forma de configurar el objeto ServerXMLHTTP para que no requiera un certificado de CA?

un código de ejemplo siguiente:

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
    objHTTP.Open "POST", "https://invernalia.homelinux.net", False, "user", "password" 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.send ("") 

Respuesta

23

que solía tener este problema por un tiempo, y yo sólo logró superarlo gracias a esto:

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
objHTTP.SetOption(2, objHTTP.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS) 
objHTTP.Open "POST", "https://invernalia.homelinux.net", False, "user", "password" 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.send ("") 

He encontrado esto aquí setOption Method y getOption Method

Aquí en este código acabo de utilizar SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS pero puede probar con otros más específicos:

  • SXH_SERVER_CERT_IGNORE_WRONG_USAGE
  • SXH_SERVER_CERT_IGNORE_CERT_CN_INVALID
  • SXH_SERVER_CERT_IGNORE_CERT_DATE_INVALID
  • SXH_SERVER_CERT_IGNORE_UNKNOWN_CA
+0

genial! ¡Eso es! te lo has ganado :) (Stackoverflow me dice que debo esperar 11 horas para otorgar la recompensa, estaré fuera de la ciudad en estos días, así que por favor ten paciencia si no me puedo conectar para recompensarte, lo haré una vez que estoy de vuelta :) –

+2

¡Gracias! XMLHTTP con VBA está tan mal documentado que a veces solo hay que esperar que alguien a veces ya tenga el mismo problema. ¡Me alegro de poder ayudar! :) – Romain

+2

SetOption fue muy útil, justo lo que necesitaba. En mi sistema tuve que usar "MSXML2.ServerXMLHTTP.3.0" antes de que SetOption entrara en vigencia. – Alan

4
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
objHTTP.SetOption(2, objHTTP.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS) 
objHTTP.Open "POST", "https://invernalia.homelinux.net", False, "user", "password" 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
objHTTP.send ("") 

consiguió la solución anterior para trabajar con un cambio menor. En lugar de:

objHTTP.SetOption(2, objHTTP.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS) 

utilicé:

objHTTP.SetOption(2) = (objHTTP.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS) 

De lo contrario me da un error de:

error de compilación de Microsoft VBScript '800a0414' No se puede utilizar paréntesis cuando se llama a una Sub objHTTP. SetOption (2, objHTTP.GetOption (2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS)

a referencia de: SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS

+0

Para el error '800a0414', vea esta [respuesta] (http: // stackoverflow.com/a/14908329/1534346) por @Helen – Romain

+0

Simplemente elimine los paréntesis en 'SetOption' como este' objHTTP.SetOption 2, objHTTP.GetOption (2) Y no SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS' – wqw

Cuestiones relacionadas