当前位置: 首页 > 知识库问答 >
问题:

基于PKCS11库的Bouncy Castle签名CSR生成

姚浩歌
2023-03-14

我正在尝试使用Bouncy Castle fips库生成一个签名的CSR,其中有一个存在于USB令牌中的私钥。

我正在使用PKCS10CertificationRequest对象生成一个签名的CSR,它期望ContentSigner对象作为输入,因此我通过实现方法1创建了自己的ContentSigner。getSignature()。2.getoutputstream()。3.getalgorithmidentifier()。

其中getsignature函数调用PKCS11库调用,以使用x500Name和公钥作为输入生成签名,并使用令牌中存在的私钥对输入数据进行签名。

使用这个流,我可以生成一个签名的CSR,但是当我试图使用isvalid()函数验证生成的签名的CSR时,它会抛出一个错误“无效签名”。

哪里

publicKeyInfo is a public key retrieved from usb token. 
signingPrivKey is a handle for the private key present in usb token.

CertificationRequestInfo certificateRequestInfo = new CertificationRequestInfo(subject, publicKeyInfo, new DERSet());
    ContentSigner contentSigner = new ContentSigner() {

        @Override
        public byte[] getSignature()
        {
            try 
            {
                PrivateKey signingPrivKey = null;
                RSAPrivateKey templateForSignKey = new RSAPrivateKey();
                templateForSignKey.getId().setByteArrayValue(id);
                session.findObjectsInit(templateForSignKey);
                Object[] privKeyObjects = session.findObjects(1);
                if (privKeyObjects.length > 0)
                {
                    signingPrivKey = (PrivateKey) privKeyObjects[0];
                }
                session.findObjectsFinal();

                ByteArrayInputStream dataInputStream = new ByteArrayInputStream(certificateRequestInfo.getEncoded());
                MessageDigest digestEngine = MessageDigest.getInstance("SHA-256", "BCFIPS");
                Mechanism signatureMechanism = Mechanism.get(PKCS11Constants.CKM_RSA_PKCS);
                //Initialize for signing
                session.signInit(signatureMechanism, signingPrivKey);

                byte[] dataBuffer = new byte[1024];
                int bytesRead;

                // feed all data from the input stream to the message digest
                while ((bytesRead = dataInputStream.read(dataBuffer)) >= 0)
                {
                    digestEngine.update(dataBuffer, 0, bytesRead);
                }
                byte[] digest = digestEngine.digest();
                byte[] signatureValue = session.sign(digest);
                return signatureValue;
            }
            catch (TokenException e)
            {
                setMsg(e.getMessage());
            }
            catch (NoSuchAlgorithmException e)
            {
                setMsg(e.getMessage());
            }
            catch (FileNotFoundException e)
            {
                setMsg(e.getMessage());
            }
            catch (IOException e)
            {
                setMsg(e.getMessage());
            }

            return null;
        }

        @Override
        public OutputStream getOutputStream()
        {
            return null;
        }

        @Override
        public AlgorithmIdentifier getAlgorithmIdentifier()
        {
            AlgorithmIdentifier algorithmIdentifier = new DefaultSignatureAlgorithmIdentifierFinder().find(hashingAlgo);
            return algorithmIdentifier;
        }
    };

    AlgorithmIdentifier algorithmId = contentSigner.getAlgorithmIdentifier();
    byte[] signData = contentSigner.getSignature();
    DERBitString derBitStr = new DERBitString(signData);

    CertificationRequest certReq = new CertificationRequest(certificateRequestInfo, algorithmId, derBitStr);
    PKCS10CertificationRequest pkcs10Req = new PKCS10CertificationRequest(certReq);

共有1个答案

戚俊健
2023-03-14

经过大量的头脑Storm,最终实现了使用Bouncy castle FIPS,PKCS11库生成完美的签名CSR。

上述代码的变化是,我们必须将消息摘要字节数据包装在MessageDigestInfo对象中,并将编码后的数据从MessageDigestInfo发送到PKCS11符号函数。

 类似资料:
  • 代码在这里,使用BouncyCastle实现: 我希望能够读取此签名并使用公钥验证它。如何将其转换回BouncyCastle对象?

  • 问题内容: 我正在努力解决以下问题: 我有一个使用此代码签名的CSR: 这将成功运行。但是,当我尝试使用以下方法检查密钥时: …它失败并出现CertificateException。请注意,我在这里使用VERY SAME密钥库,这意味着与我签名的CA密钥包含在其中。为什么会这样? 顺便说一句,很奇怪,当我使用Windows的证书查看器打开生成的签名证书时,它确实显示了颁发CA的名称,但其条目未显示

  • 现有系统使用Bouncy Castle(.NET)生成签名,我需要使用Microsoft ECDsaCng类验证这些现有签名。 在我尝试用Microsoft类验证签名之前,一切都正常工作,此时它会生成一个异常,说明参数不正确。 有什么想法吗?

  • 我正在使用secp256r1曲线和使用BouncyCastle的SHA256算法实现ECDSA签名生成。 对于某些输入,签名长度为127个字符。我感觉开头的“0”被删除了,因为签名被存储到ECDSASigner类中的BigInteger datatype中。 我使用确定性方法添加了rfc6979 ECDSA签名中的示例 唯一的区别是r值中的零。因为签名的长度只有127。 如果我的推论是正确的,请让

  • 我是否能够使用Android或BouncyCastle libs从CA签名的X509客户端证书中提取证书链信息? 我有一个Android客户端,它从受信任的服务器接收CA签名的X509证书。我想将签名的客户端证书和我的私钥保存到PKCS12(. p12)文件中。我目前正在通过创建一个对象并添加证书和私钥来执行此操作。当我使用方法添加客户端时,是最后一个参数,它当前仅包含客户端证书。这是否会阻止我的

  • 我正在使用openssl命令创建一个CSR,它使用椭圆曲线secp384r1和哈希算法sha384签名: OpenSSL EC param-out EC _ client _ key . PEM-name secp 384 r 1-genkey openssl req-new-key是ec_client_key。pem-out ec_ clientReq.pem 然后,我使用以下命令以可读格式显示