是否有相当于.NET HttpWebRequest.ClientCertificates的Javascript?

时间:2010-03-15 13:56:47

标签: javascript

我在C#中使用此代码:

var request = (HttpWebRequest)WebRequest.Create("https://x.com/service");
request.Method = "GET";

// Add X509 certificate 
var bytes = Convert.FromBase64String(certBase64);
var certificate = new X509Certificate2(bytes, password);
request.ClientCertificates.Add(certificate, "password"));

有没有办法在Javascript中重现此请求?第三方图书馆可以用于我的目的。

2 个答案:

答案 0 :(得分:2)

在浏览器 - JavaScript中,没有希望做这样的事情。

XMLHttpRequest接口为您提供了自定义连接的有限功能。您没有机会影响SSL协商,并且您无法向正在运行的域之外的域发出请求(出于非常好的安全原因)。

你可以解决这个问题并使用低级套接字,使用复杂的库在其顶部实现HTTPS,除了JS不会给你任何访问低级套接字的权限。不希望或信任浏览器脚本来执行此类操作:同样,如果任何网页可以使您向其他服务器(包括您的专用本地网络上的服务器)发送随机连接,则需要担心一些严重的安全问题。

HTML5为您提供了WebSocket,它可用于低级别,低延迟的连接,但它故意与其他服务不兼容,以阻止您攻击它们。通常,您希望浏览器与之交谈的任何内容,无论是通过XMLHttpRequest,WebSocket还是Flash Socket,都必须经过精心设置才能收听浏览器。

答案 1 :(得分:1)

您可以查看opensource Forge项目。它在JavaScript中实现SSL / TLS,包括指定客户端证书的能力。

http://github.com/digitalbazaar/forge/blob/master/README

该项目利用通过Flash提供的原始Socket接口,并在JavaScript中实现实际的TLS层。但是,由于使用了Flash,因此您要联系的服务器需要提供跨域策略文件。 Forge项目中包含一个Apache模块,服务器管理员可以安装该模块以轻松提供此策略文件。

如果您正在寻找一种不涉及具有管理权限的服务器的解决方案 - 那么看起来您运气不好。与另一张海报一样,bobince说,所有通过网络浏览器通过原始套接字(或类似方式)进行通信的新方法都需要Web服务器手动“选择加入”。