微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Web 浏览器证书注册CSR 生成和证书下载到智能卡或 USB 令牌

如何解决Web 浏览器证书注册CSR 生成和证书下载到智能卡或 USB 令牌

我正在为认证机构开发 Web 应用程序,作为其中的一部分,我需要

  1. 通过浏览器在用户的智能卡中生成非对称密钥对 - 私钥和公钥,
  2. 创建证书签名请求 (CSR) 并将 CSR 发送到生成用户证书的证书颁发机构服务器。
  3. 然后 CA Server 会将用户的证书发送到浏览器,需要通过浏览器下载到用户的 SmartCard 或 USB Token 中。

如何使用适用于现代浏览器的 JavaScript 实现相同的目标?使用 ActiveX 和 JavaApplets 不是选项。

解决方法

披露:我为开发 Signer.Digital Browser Extension 的 CISPL,Co. 工作

浏览器扩展可用于在 Windows 证书存储或智能卡或现代浏览器中的 USB 令牌中注册证书(生成 CSR)和下载证书。浏览器扩展提供 JavaScript API,后者反过来与运行在本地机器上的主机应用程序对话,以在智能卡中执行所需的操作,并将响应返回给 JavaScript(或说用户网页)。

使用浏览器 Javascript API 生成的 CSR genCSR 可以发布到 CA 服务器以生成证书,或者如果您想要自签名证书,则可以发布到您的服务器。从服务器收到的证书和信任证书链可以传递给 ImportCer 以导入证书存储、智能卡或 USB 令牌。

可用于 Signer.Digital 浏览器扩展中的认证机构的 API 是:

  1. 检测连接的智能卡:(自动检测连接的智能卡或 USB 令牌)

SignerDigital.getPCSCReaders(onlyConnected = true) //列出PCSC阅读器,如果要列出所有可用的阅读器,请将参数设置为false

示例:

try 
{
    var SmartcardReaders = await SignerDigital.getPCSCReaders();
    var SCReaders = JSON.parse(SmartcardReaders);
    console.log(SmartcardReaders);
    console.log(SCReaders.length);
    if (SCReaders.length > 0)
    {
        $("#selSmartcard").empty();     //selSmartcard is HTML dropdown selector
        for (var i = 0; i < SCReaders.length; i++) {
            //ReaderNames are cryptic,convert to user friendly smartcard name
            var SCName = SignerDigital.getSCNameByReaderName(SCReaders[i]);  //Map PCSC ReaderName to User friendly smartcard name
            $("#selSmartcard").append(new Option(SCName));
        }
        
        //If Windows,add "Windows Certificate Store"
        if (SignerDigital.OSName == "Windows")
            $("#selSmartcard").append(new Option("Windows Certificate Store"));

        $('#selSmartcard option:eq(1)')
    }
}
catch (ErrorMsg) {
    alert(ErrorMsg);
}
  1. 生成 CSR:(用于证书存储、智能卡或 USB 令牌中的证书注册)

SignerDigital.genCSR(PKCS11Lib,certSubject,certIssuer,keyBits = 2048,hasgAlgorithm = "SHA256",forceUserPinChangeIfDefault = false)

要强制执行密码策略,即。强制用户更改智能卡制造商设置的默认密码,将 forceUserPinChangeIfDefault 设置为 true

  1. 导入/下载证书(将用户证书和信任证书链导入证书存储、智能卡或 USB 令牌)

SignerDigital.importCer(PKCS11Lib,b64Payload,certIssuer)

b64Payload 参数的 Json 模型是:(下面模型的 Json 的 Base64)

public class ImportCertReq
{
    public string UserCertB64 ;     //May be null to just import Trust Chain
    public List<string> TrustChainB64;  //May be null to just import USer Certificate
}

成功的 Json 模型 importCer 承诺的响应是:

public class ImportCertResp
{
    public bool IsSuccessUserCertImport;
    public string UserCertImportOutcome; 
    public int TrustChainImportCount; 
    public string TrustChainImportOutcome; 
}

生成 CSR导入证书 api 使用智能卡或 USB 令牌的 PKCS#11 库来实现跨操作系统的可组合性。因此,在使用这些 JavaScript API 之前,需要在用户的 Windows pc 上安装智能卡驱动程序。要使用 Windows 证书存储,请将 PKCS11Lib 作为“Microsoft Enhanced RSA and AES Cryptographic Provider”传递。

Signer.Digital Extension 中其他有用的属性和方法

  1. SignerDigital.OSName

  2. SignerDigital.OSSupported

  3. SignerDigital.getPkcsLibByProvider(ProviderName)

  4. SignerDigital.getSCNameByReaderName(ReaderName) //使用上面第 1 点中列出的承诺 getPCSCReaders() 获得的读者名称。

  5. SignerDigital.getPkcsLibBySCName(SCName)

您可以参考 SO Answer 了解其他证书、签名和加密/解密 JavaScript API。这些 API 使用 Windows CSP,在 Linux 上使用 PKCS#11。

以上 API 可能会进行现场测试 Here

Signer.Digital 生成 CSR 和下载证书流程

Signer.Digital Browser Generate CSR and Download Certificate Flow

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。