如何在javascript中使用证书的私钥对消息进行签名

如何在javascript中使用证书的私钥对消息进行签名,javascript,cryptography,digital-signature,pki,Javascript,Cryptography,Digital Signature,Pki,我在本地驱动器上有CNG/CAPi证书。它是在windows证书存储中导入的。我想从浏览器(如Chrome、IE等)访问它。如何使用Javascript/Jquery/任何浏览器API在windows证书存储中使用证书的私钥对消息/nonce(由服务器提供)进行签名?有什么api我可以参考吗?或者请让我知道我可以使用javascript对消息进行签名的过程?我尝试过WebCryptoAPI,但没有成功。我需要从头开始建立它,所以任何帮助都将不胜感激。代码如下: var client =

我在本地驱动器上有CNG/CAPi证书。它是在windows证书存储中导入的。我想从浏览器(如Chrome、IE等)访问它。如何使用Javascript/Jquery/任何浏览器API在windows证书存储中使用证书的私钥对消息/nonce(由服务器提供)进行签名?有什么api我可以参考吗?或者请让我知道我可以使用javascript对消息进行签名的过程?我尝试过WebCryptoAPI,但没有成功。我需要从头开始建立它,所以任何帮助都将不胜感激。代码如下:

     var client = forge.tls.createConnection({
        server: false,
        caStore: { HOST: 'CN=ret512312.abc.xyz.net, O=xyz, S=ZG, C=CH' },
        cipherSuites: [
            forge.tls.CipherSuites.TLS_RSA_WITH_AES_128_CBC_SHA,
            forge.tls.CipherSuites.TLS_RSA_WITH_AES_256_CBC_SHA
        ],
        verify: function(connection, verified, depth, certs) {
            debugger;
            if (depth === 0) {
                var cn = certs[0].subject.getField('CN').value;
                if (cn !== 'example.com') {
                    verified = {
                        alert: forge.tls.Alert.Description.bad_certificate,
                        message: 'Certificate common name does not match hostname.'
                    };
                }
            }
        },

关于WebCryptoAPI的一个主要批评是,它无法访问浏览器证书存储中的信任点。当然,它也不能为整个系统提供对信任点的访问(那将很糟糕)。因此,你必须打破浏览器的沙箱来完成这一壮举

打破沙箱可以通过浏览器扩展等方式实现,但请注意,这些功能正在逐渐消失,因为不是每个(移动)浏览器都支持它们,您必须为每个浏览器分别编程。以前你会签署小程序来完成这项工作,但这些小程序在很久以前就已经被删除了(如果你问我的话,在Sun/Oracle完全管理不善之后)


所以是的,不,对不起。如果确实需要,最好先设置一个受信任的网站,然后从那里恢复一个签名证书(但请注意,您将无法获得比初始TLS连接提供的安全性更高的安全性)。

感谢您的回复。我们如何使用浏览器扩展/浏览器插件来实现这一点?我的要求基本上在TLS的顶部,因为服务器需要验证一台机器(客户端,这里的主题是机器)。所以,证书验证是唯一的方法。