2011-09-13 20 views
12

En mi cliente de C# Windows, tengo un envío POST a "la nave nodriza". Quiero que los datos en los envíos sean seguros, por supuesto, así que pagué para que HostGator me emitiera un certificado SSL.Usando System.Net.WebClient con el certificado HTTPS

AHORRÉ fuera el archivo .CER, y estoy construyendo la solicitud como tal:

//wrapper for WebClient object to use certificate file 
class SecureWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address); 
     string certPath = @"e:\mycertificate.cer"; 
     X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath); 
     request.ClientCertificates.Add(myCert); 
     return request; 
    } 
} 

//request 
private static SecureWebClient client = new SecureWebClient(); 
private static NameValueCollection = new NameValueCollection(); 
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN); 
nvc.Add(POST_EMAIL, email); 
nvc.Add(POST_PASSWORD, password); 

sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc)); 

Su lanzar una System.NET.WebException:

la conexión subyacente se cerró: Se produjo un error inesperado en un envío.

El InnerException es una System.IO.IOException:

El apretón de manos falló debido a un formato inesperado paquete.

¿Alguna idea de lo que estoy haciendo mal?

+0

¿Desea el certificado SSL en el cliente o el servidor? – SLaks

+1

Para aclarar: ¿desea cifrar la comunicación (necesita el certificado en el servidor)? ¿O desea autenticar al cliente (necesita un certificado de cliente)? Para ser específico, necesitará una clave privada (un archivo .PFX, probablemente) en el extremo relevante. –

+0

No estoy completamente versado en las formas de seguridad. Puedo acceder al sitio host en un navegador con protocolo HTTPS. Quiero publicar datos en el mismo servidor/sitio con encriptación. Entonces, @SLaks - No estoy seguro, técnicamente hablando, de lo que quiero. Solo sé en laicos lo que necesito como se describió anteriormente. –

Respuesta

11

Si eres no usando cliente certificados y puede acceder a su servidor utilizando https: // entonces su código debería ser similar:

private static WebClient client = new WebClient(); 
private static NameValueCollection nvc= new NameValueCollection(); 

nvc.Add(POST_ACTION, ACTION_CODE_LOGIN); 
nvc.Add(POST_EMAIL, email); 
nvc.Add(POST_PASSWORD, password); 

sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc)); 

Mientras como su BASE_URL usa https: //, entonces todos los datos (hacia y desde el servidor) serán encriptados.

IOW utilizando SSL/TLS de un cliente a un servidor no requiere que el cliente haga nada especial (con el certificado), además de usar https: // como esquema, ya que el sistema operativo proporciona todo (por ejemplo raíces confiables) necesita asegurar la transmisión de datos.

+0

Hice exactamente lo que dijo --- mi código es como el código que publicó, y mi BASE_URL es 'https: // www.myserver.com /', pero recibo exactamente los mismos mensajes de error que se describen en el publicación original. _NOW_ ¿qué estoy haciendo mal? –

+1

Divida su problema en pedazos. Primero, ¿puede usar WebClient para descargar su página principal (usando https://www.myserver.com/)? Si eso no funciona, asegúrese de que funciona desde un navegador web (y verifique las propiedades de la página para asegurarse de que esté encriptada). Si eso funciona, intente con su código de carga sin SSL, es decir, en http://www.myserver.com/ para asegurarse de que esta pieza funcione. Es probable que una parte no funcione y eso le dará a usted (y a nosotros) alguna pista para ayudarlo. – poupou

+0

usando 'client.DownloadData (" https://www.myserver.com/ ")' _works_. luego usando 'client.UploadValues ​​(" http://www.myserver.com/ ")' _also works_. ¿Qué significa esto? –

1

Parece que lo estás haciendo al revés. Debe tener el Certificado SLL instalado en el servidor/host web. Luego, crea una solicitud web para el servidor web y requiere el protocolo HTTPS.

+0

No estoy completamente versado en las formas de seguridad. Puedo acceder al sitio host en un navegador con protocolo HTTPS. Quiero publicar datos en el mismo servidor/sitio con encriptación. –

4

Los certificados del cliente funcionarán solo si la clave privada está disponible. Esto no es generalmente el caso cuando se utilizan archivos .cer ya que el certificado X.509 hace no incluye la clave privada.

La única segura manera de garantizar la clave privada está disponible es para cargar el certificado de un archivo PKCS # 12, donde tanto el certificado (s) y la clave privada están disponibles (es decir, ambos se exportaron en el . archivo pfx).

Notas:

  • dije general porque Windows/CryptoAPI veces hace algunos magia (cuando se utiliza con X509Certificate) y asociar automáticamente un certificado con una clave privada a partir de las tiendas certificate.key.

  • Dije seguro porque eso también funcionará en Mono, no solo en MS .NET.

+0

Esto está muy por encima de mi cabeza. ¿Dónde obtengo/creo/encuentro un archivo PKCS # 12? ¿Y cómo cargo la clave privada desde allí? –

+1

Primero asegúrese de * querer * certificados de cliente :-) Su código fuente está (mal) usando esta característica pero no está claro que es lo que quiere. Si solo quiere "https" del servidor, entonces no necesita manejar el certificado de su aplicación cliente. – poupou

+0

Quiero asegurar los datos de mi llamada WebClient.UploadValues. Eso es todo lo que realmente sé transmitir. Así que le pregunto: ¿necesito _need_client certificates? –

0

sólo tiene que conectar a su servidor con RDP

IE abierta e ir a Opciones de Internet

Desplácese a la ficha Opciones avanzadas y permitir que tanto Usar SSL 2.0 y SSL 3.0

Ahora será autenticado sus peticiones al servidor

Cuestiones relacionadas