1

私は署名/証明書に慣れていませんが、Google + SOを確認した後、答えが見つかりません。PKCS #7 分離署名用のファイルの署名を生成するための基本コードがあり、これまでのところすべて問題ありません... 署名を検証するクライアントは、生成された署名に満足しています。S/MIME 署名時間属性を使用して元のファイルが署名された日時を含めるという新しい要件が追加されました。

それを処理するためのこれまでの私のコードは次のとおりです。

    final Attribute signingAttribute = new Attribute(CMSAttributes.signingTime, new DERSet(new DERUTCTime(new Date()))); 
    signedAttributes.add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier("1.2.840.113549.1.7.1"))));
    signedAttributes.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(hash))));
    signedAttributes.add(signingAttribute);
    final AttributeTable signedAttributesTable = new AttributeTable(signedAttributes);
    final DefaultSignedAttributeTableGenerator signedAttributeGenerator = new DefaultSignedAttributeTableGenerator(signedAttributesTable);
    // now proceed for the signing process with BouncyCastle
    final JcaSimpleSignerInfoGeneratorBuilder builder = new JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC").setDirectSignature(true);
    builder.setSignedAttributeGenerator(signedAttributeGenerator);
    final SignerInfoGenerator signerGenerator = builder.build("SHA1withRSA", key, cert);

    final CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
    ...

その後のコードは、署名を生成するために使用したものと同じです...しかし、機能しません。

私が本当にそうではないことの 1 つは、messageDigest のハッシュです。

    signedAttributes.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(hash))));

次のように生成されたハッシュを取得しました。

    MessageDigest md = MessageDigest.getInstance("SHA1", "BC");
    md.update(fileToSign.getBytes("UTF-8"));
    hash = md.digest();        

しかし、それがハッシュを取得する正しい方法であるかどうかは絶対にわかりませんか? そして、生成された S/MIME 署名時間属性を取得する全体的な方法は...

私が見逃したものに関するヒントや全体的な説明は大歓迎です。

4

1 に答える 1