首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用智能卡在web应用程序(JavaScript)中进行数字签名?

如何使用智能卡在web应用程序(JavaScript)中进行数字签名?
EN

Stack Overflow用户
提问于 2012-05-11 14:31:46
回答 5查看 27.4K关注 0票数 9

我们已经编写了一个文档管理系统,并希望使用web客户端对文档进行数字签名。我们的Java客户端应用程序已经能够应用和检查数字签名,但是我们希望即使使用我们的web客户端也能进行签名。这是用GWT编写的,因此,当在客户端运行时,它是一个JavaScript应用程序。

我们不希望创建Java并在客户机上下载并执行它。我们希望使用浏览器安全设备或浏览器API来签署文档。我们还希望保留完整的文档服务器端,并且只将文档哈希转移到客户端。

我们认为这应该是可能的使用npapi/npruntime,,,NSS,,但我们没有找到任何有关这方面的信息。(顺便问一下,npruntime在IE中也可用吗?)我们是否应该使用ActiveX来实现与IE相同的结果?)

你有什么提示吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-05-12 05:27:54

再谷歌一遍,我找到了答案。Mozilla通过window.crypto对象导出其NSS模块的一部分。一种更标准的操作方式可能是通过DOMCrypt,即当前的在W3C中讨论。谷歌Chrome开发者将等待W3C来标准化DOMCrypt,而微软则要求使用ActiveX对象如前所述 (即使在Windows上使用Firefox/Chrome/Opera也是如此)。

票数 9
EN

Stack Overflow用户

发布于 2016-05-24 18:23:32

目前(2016年5月)是不可能的。

Chrome已经放弃了Java支持。“'Windows边缘”不会有。IE11支持不好,甲骨文决定停止使用java插件。只有火狐,早期版本的IE和Java插件才有可能。

新的WebCryptographyApi标准为浏览器提供了数字签名支持,但它没有pcks#11支持。

解决这一问题的真正的电子政务解决方案: 1)在用户的PC上安装本地Java应用程序.应用程序在端口上侦听,例如,在您的页面中,javascript检测如果没有支持,是否支持applet 3),以http://127.0.01:5678/sign形式连接到应用程序并发送数据签名。4)应用程序是本地的,使用操作系统keystore (包括驱动程序PKCS # 11 )没有问题。进行数字签名并准备结果( 5)页面javascript定期查询结果并在准备就绪时检索结果。

票数 5
EN

Stack Overflow用户

发布于 2013-07-01 16:26:02

在Win/IE中,您仍然可以使用CAPICOM http://en.wikipedia.org/wiki/CAPICOM,而不需要任何第三方ActiveX或外部库。

这可以在安装IE的任何地方工作。

不过,这已经退休了。

下面是我在IE中使用的签名。我用例如:var signature = signDigest(stringToBeSigned);来称呼这个

代码语言:javascript
运行
复制
function signDigest(text) {
if (window.event)
    window.event.cancelBubble = true;

var dest = sign(text); //TODO  

return dest;
}

// CAPICOM constants  

var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
var CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
var CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 0x00000080;
var CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
var CAPICOM_INFO_SUBJECT_SIMPLE_NAME = 0;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_E_CANCELLED = -2138568446;
var CERT_KEY_SPEC_PROP_ID = 6;

function IsCAPICOMInstalled() {
    if (typeof (oCAPICOM) == "object") {
        if ((oCAPICOM.object != null)) {
            // We found CAPICOM!  
            return true;
        }
    }
}

function FindCertificateByHash() {

    try {
        // instantiate the CAPICOM objects  
        var MyStore = new ActiveXObject("CAPICOM.Store");
        // open the current users personal certificate store  
        MyStore.Open(CAPICOM_CURRENT_USER_STORE, "My", CAPICOM_STORE_OPEN_READ_ONLY);

        // find all of the certificates that have the specified hash  
        var FilteredCertificates = MyStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, strUserCertigicateThumbprint);

        var Signer = new ActiveXObject("CAPICOM.Signer");
        Signer.Certificate = FilteredCertificates.Item(1);
        return Signer;

        // Clean Up  
        MyStore = null;
        FilteredCertificates = null;
    }
    catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            return new ActiveXObject("CAPICOM.Signer");
        }
    }
}

function sign(src) {
    if (window.crypto && window.crypto.signText)
        return sign_NS(src);
    else

        return sign_IE(src);
}

function sign_NS(src) {
    var s = crypto.signText(src, "ask");
    return s;
}

function sign_IE(src) {
    try {
        // instantiate the CAPICOM objects  
        var SignedData = new ActiveXObject("CAPICOM.SignedData");
        var TimeAttribute = new ActiveXObject("CAPICOM.Attribute");

        // Set the data that we want to sign  
        SignedData.Content = src;
        var Signer = FindCertificateByHash();


        // Set the time in which we are applying the signature  
        var Today = new Date();
        TimeAttribute.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
        TimeAttribute.Value = Today.getVarDate();
        Today = null;
        Signer.AuthenticatedAttributes.Add(TimeAttribute);

        // Do the Sign operation  
        var szSignature = SignedData.Sign(Signer, true, CAPICOM_ENCODE_BASE64);
        return szSignature;
    }
    catch (e) {
        if (e.number != CAPICOM_E_CANCELLED) {
            alert("An error occurred when attempting to sign the content, the error was: " + e.description);
        }
    }
    return "";
}  

我在编码等方面有一些问题,所以我也包括我的控制器(.net)。

代码语言:javascript
运行
复制
        byte[] decbuff = Convert.FromBase64String(signature);


    //CAPICOM USES 16 BIT ENCODING
    Encoding utf16Enc = Encoding.GetEncoding("UTF-16LE");


    byte[] utf16Data = utf16Enc.GetBytes(getContent);


    ContentInfo content = new ContentInfo(utf16Data);

    System.Security.Cryptography.Pkcs.SignedCms cms = new System.Security.Cryptography.Pkcs.SignedCms(content,true);
    cms.Decode(decbuff);

    int length = decbuff.Length;         

    X509Certificate2 cert = cms.SignerInfos[0].Certificate;


    X509Chain chain = new X509Chain();
    bool theVal = chain.Build(cert);
    cms.CheckHash();       
    cms.CheckSignature(false);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10553377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档